En un archivo muy largo con código sangrado (con precisión), puede ser útil moverse directamente a una línea de texto encima o debajo del cursor que delimita la sangría.
(Una forma de hacer esto podría ser a través de la foldmethod guión, doblando el nivel actual de sangría, que colapsa las líneas que delimitan el nivel de sangría a ser sólo una j
o k
lejos del cursor. Instancias Sin embargo, he encontrado donde plegado guión no tiene he podido trabajar en la sangría que me interesa)
Aquí hay un ejemplo, con el cursor marcado por el guión bajo _
(en la segunda columna de caracteres entre las definiciones de class Bazz
y class Qux
), pero imagine que el número de párrafos o líneas dentro de la module
s es desconocido o variable:
module Foo
# lots of code...
end
module Bar
class Baz
# ...
end
class Bazz
# lots of code...
end
_
class Qux
# ...
end
class Quux
# lots of code...
end
end
... ¿cómo podría navegar rápidamente hacia la o
parte module Bar
superior del cursor o la n
parte end
inferior del cursor en la última línea? Tenga en cuenta que la columna vertical contiene espacios en blanco, pero tampoco caracteres en la segunda columna entre las class
definiciones.
fuente
Respuestas:
¿Qué tal esta función?
Podría
nnoremap gU :call FloatUp()<CR>
(gU
para "subir"), y luego invocar congU
.Aquí hay una explicación:
norm k
) mientras se cumpla lawhile
condición.while
condición se cumple si esta no es la primera línea (line(".") > 1
) ygetline(".")
) en la columna actual ([col(".") - 1]
) es un espacio en blanco (=~ '\s'
es decir, coincide con el patrón de espacios en blanco).fuente
FloatDown
función. En mi .vimrc va, ¡gracias! github.com/alxndr/dotfiles/commit/0e25a302Me gusta usar la búsqueda de estas cosas, porque las expresiones regulares de Vim tienen una cantidad increíble de cosas que puede buscar, como números de columna virtuales específicos, en este caso:
nnoremap cd /\%<C-R>=virtcol(".")<CR>v\S<CR>
nnoremap cu ?\%<C-R>=virtcol(".")<CR>v\S<CR>
Use
cd
para bajar ycu
para subir. Estoy pensando "columna arriba" y "columna abajo" aquí. Estoy casi 100% seguro de que estas no son operaciones por defecto. O elige tus propios mapeos.Esto debería funcionar si está usando pestañas o espacios o ambos.
fuente
=
registro es el registro de expresión que evalúa una expresión en su lugar. Es muy útil, si no un poco raro.:let searchbak=@/<CR>
y agregar:let @/=searchbak<CR>
. Pero en este punto se está volviendo algo largo e inaccesible y quizás debería ser una función.Puede usar el complemento JumpToVerticalOccurrence (predeterminado asignado a ]|y [|). Hay pocos otros como el ]V{char}que funciona f, pero verticalmente. Por supuesto, puede reasignarlos según sea necesario.
Si no desea utilizar plugins, es posible que trate de usar
:search
convirtcol(.)
, por ejemplo:dónde:
virtcol('.')
te da la columna actual,\S
significa no espacio en blancobW
es para buscar hacia atrásConsulte
:help search
para obtener más información.Para que sea más fácil de usar, puede asignarlo, por ejemplo:
Alternativamente, si el código contiene soportes, uso %para saltar entre ellas a juego (por ejemplo
{
,}
,[
,]
, etc.) o el uso párrafo entero salta ( {, }con Shiftsi es necesario).Enlaces / fuentes:
fuente
:h search()
:w
medioswrap around the end of the file
yW
mediosdon't wrap around the end of the file
. ¿Pero por qué los pusiste juntos en el segundo:map
?w
no debería estar allí, así que lo eliminé , gracias. Probablemente estaba confundido por el significado de las teclas de movimiento.Utilizo una versión modificada del complemento vim-indent-object para proporcionar este comportamiento. Mis modificaciones se pueden ver aquí .
Esto me permite mapear
[i
para ir al comienzo del nivel de sangría actual y]i
al final.fuente
No es exactamente lo que usted pidió, porque no es un movimiento vertical, pero algo que es similar, rápido y puede ser que sea lo suficientemente bueno para que usted se está moviendo hacia atrás los párrafos 2: {{. Esto lo llevará a la línea justo antes
module Bar
.fuente
module
línea de nivel superior . (En concreto, esta situación surgió cuando navegaba recientemente código de terceros varios miles de líneas de largo, con muesca precisa, pero no hay líneas vacías, y tratando de encontrar el contexto exterior de la definición de un módulo.)jeetsukumaran / vim-indentwise funciona bien para movimientos relativos, absolutos o de alcance de bloque a través de bloques sangrados.
fuente
Yo uso mi propio complemento move_until_char_changes.vim para eso.
Lo mapeo a
gK
ygJ
.Saltará sobre muchas líneas con el mismo carácter en la columna actual (no solo espacios en blanco), lo que puede ser útil en archivos de registro o volcados de SQL con cadenas repetidas.
Por defecto, primero mueve una línea, antes de seleccionar el carácter "buscar".
Funciona en modo Visual siempre que no intente usarlo dos veces y no esté en modo Visual en línea o en bloque ... (¡arreglos bienvenidos!)
fuente
Como no lo veo aquí como una respuesta ( edit solo notó que superjer mencionó algo muy similar). Puedes simplemente el / o? buscar.
Por ejemplo, puede buscar hacia abajo un carácter que no sea un espacio en blanco en la segunda columna de esta manera:
El desglose es:
Luego puede usar los operadores normales para repetir la búsqueda.
Para más información sobre el tema ver
:help \%c
y:help \%v
.fuente