Quiero navegar entre las líneas de un archivo basado en la sangría. El archivo está estructurado por sangría: una línea que está más sangrada que la línea anterior es hija de la línea anterior, una línea que tiene la misma sangría que la línea anterior es su hermano. Estoy buscando principalmente tres comandos:
- Pasa al siguiente hermano, es decir, a la siguiente línea con la misma sangría, saltando las líneas que están más sangradas, pero no saltando más allá de una línea que está menos sangrada.
- Moverse al hermano anterior, es decir, lo mismo en la otra dirección.
- Mover al padre, es decir a la línea anterior con menos sangría
La posición de la columna del punto no debe cambiar.
Estos son los análogos de los datos de sangrado entre estructurado para forward-sexp
, backward-sexp
y backward-up-list
para los datos SEXP-estructurado. La sangría corresponde a la estructura del programa en lenguajes como Haskell y Python; Estas funciones pueden ser especialmente útiles en este contexto, pero no busco nada específico del modo (mi caso de uso principal son los datos estructurados por la intención dentro de otro formato de archivo).
Colorear los niveles de sangría puede ayudar a navegar manualmente con Up/ Downpero quiero algo automático.
Esta pregunta de súper usuario es similar pero con requisitos más débiles y actualmente no tiene respuestas que cumplan con mis requisitos.
fuente
set-selective-display
Te acerca a lo que necesitas?indent-tools
en melpa ( herramientas de sangría ), que probablemente funcione para este propósito. El primer compromiso fue el 16 de mayo de 2016, aproximadamente 3 meses después de que se hiciera esta pregunta.Respuestas:
Al examinar las cuatro respuestas disponibles actualmente ( dos en Superusuario y dos en esta pregunta), veo los siguientes problemas:
outline.el
, también va básicamente línea por línea de todos modos (usandooutline-next-visible-heading
) en nuestro caso, ya que (casi) todas las líneas coincidirían con la expresión regular del esquema y contarían como un "encabezado".Entonces, al reunir algunas ideas de cada una, tengo lo siguiente: avanzar línea por línea, saltando las líneas vacías y más sangradas. Si tiene la misma sangría, entonces es el próximo hermano. La idea básica se ve así:
Adecuadamente generalizado (adelante / atrás / arriba / abajo), lo que estoy usando se parece a lo siguiente actualmente:
Todavía hay algo más de funcionalidad deseable, y mirar
outline.el
y reimplementar algo de eso puede ayudar, pero estoy contento con esto por ahora, para mis propósitos.fuente
(current-line)
fue algo de lomisc-fns.el
que de alguna manera tengo en mi instalación de Aquamacs como parte de algunaoneonone.el
biblioteca.Esta característica existe en Emacs. El modo de esquema describe un documento que contiene líneas de encabezado con un nivel y tiene facilidades para moverse entre niveles. Podemos definir cada línea como una línea de encabezado con un nivel que refleje su sangría: establecer
outline-regexp
en la sangría. Más precisamente, la muesca más el primero no está en blanco (y el principio del archivo es el nivel más alto):\`\|\s-+\S-
.En Emacs 22.1–24.3 puede simplificar esto para:
Luego puede usar comandos de movimiento de contorno :
C-C @ C-f
(outline-forward-same-level
) para pasar al siguiente hermano;C-C @ C-b
(outline-backward-same-level
) para pasar al hermano anterior;C-C @ C-u
(outline-up-heading
) para pasar al padre.Una pestaña y un espacio cuentan para la misma cantidad de sangría. Si tiene una combinación de pestañas y espacios, configúrelos
tab-width
adecuadamente y llameuntabify
.Si el modo principal actual tiene configuraciones de esquema, pueden entrar en conflicto. En este caso, puede usar una de las muchas soluciones de modos principales múltiples , la más simple es crear un búfer indirecto y establecerlo en Modo principal de esquema. En el Modo principal del esquema, los atajos de teclado predeterminados son más simples de escribir:
C-c C-f
etc.fuente
M-x make-local-variable RET outline-regexp RET
no acepta esa variable, y dice solo `[Sin coincidencia]`. Todavía tengo que estudiarlo con más cuidado.outline-regexp
ya no es una costumbre y no se puede configurar interactivamente tan fácilmente.Los siguientes tres comandos, mínimamente probados, deberían permitir la navegación básica por líneas sangradas. Disculpas por la repetición del código.
fuente
(current-column)
pero hace que el cursor no se mueva), pero no cumple exactamente con mi especificación: moverse en un nivel de sangría se mueve menos Líneas sangradas.ind-forward-sibling
simplemente busca la siguiente línea con la misma sangría, por lo que salta las líneas con menos sangría (avanza incluso cuando no hay hermanos hacia adelante).