Llevo ocho años trabajando en Vim y descubro constantemente algo nuevo. Se considera una virtud de Vim. En cuanto a mí, esto es una falta de apertura: un montón de funciones ocultas están ocultas demasiado profundamente.
Hablan sobre la belleza de la edición modal y los objetos de texto, pero me parece que la esencia de Vim no es eso. Vim es una colcha de retazos de subsistemas obstruidos con herramientas adicionales. ¡Solo en el modo de edición normal más de cien atajos de teclado! Esta densidad de herramientas explica en gran medida por qué Vim es tan útil. Si "mostrar todas las etiquetas para una palabra clave" es solo
g]
, entonces este comando se usará con mucha más frecuencia.
En sistemas con falta de apertura, uno tiene que confiar en el liderazgo. Pero para Vim no hay tantos. Hay artículos para principiantes, como
ciw
(que no debe confundirse con la CIA,
el manual de la CIA para Vim ) y similares. Y hay artículos de expertos que están inmersos en subsistemas. Pero nadie habla realmente de estos trucos especiales que te hacen exclamar: ¡maldición, como lo he necesitado durante los últimos seis años!
Este artículo trata sobre algunos de los pequeños trucos que uso en Vim. Ninguno de ellos se desmonta con todos los detalles, por lo que si hay algo interesado, recomiendo buscar información adicional. Tampoco están relacionados entre sí. Pero esto es normal. En general, hay más que suficientes para ayudar realmente a casi todos.
Estructura del artículo
Muy grosero, los usuarios de Vim se dividen en dos categorías.
Los puristas aprecian el pequeño tamaño y la ubicuidad. Como regla, minimizan la configuración en caso de que tenga que trabajar en una computadora desconocida (por ejemplo, a través de ssh). Los extensores, por otro lado, pueblan Vim con complementos, funciones y asignaciones de cosecha propia en un intento inútil de pretender usar Emacs. Si tomas vimrc de ellos, entonces los chicos permanecerán completamente indefensos.
Como probablemente adivine, estoy mucho más cerca de los expansores que los puristas. Dividí los trucos en dos secciones dependiendo de si se requieren cambios en la base Vim.
Puristas
Para los comandos modales, se utilizan vistas de ayuda estándar, es decir,
<cr>
significa presionar la tecla Intro. Cuando necesite ayuda
:h
para una línea específica, por ejemplo
:h E676
, la línea estará entre paréntesis.
Varios comandos en modo normal
": y @:
":
es un registro que contiene el último comando ejecutado. Puede escribir
":p
para imprimirlo en el búfer.
@:
repite el último comando.
"=
Regístrese para "expresiones". Aquí puede ingresar cualquier expresión vimL e insertarla, usarla con ctrl-R, etc. Así, por ejemplo, la marca de tiempo local se inserta escribiendo
"=strftime("%c")<cr>p
.
mA, 'A
m{letter}
coloca la marca en la posición del cursor. Entonces
'{letter}
irá a esta línea. Para letras minúsculas, actúa en el búfer, por lo que es adecuado para la navegación. Funciona globalmente para letras mayúsculas: incluso si está en otro archivo,
'A
irá al archivo etiquetado como
Puede ver todas sus etiquetas con el comando
:marks:
Ctrl-A y Ctrl-X
Aumenta y disminuye el siguiente número en la línea en la ubicación del cursor o a la derecha de la misma. Como va inmediatamente al número, la combinación se puede usar desde cualquier lugar.
10c-A
mucho más simple que
wwwwwciw20
.
q:
Abre la historia de los equipos anteriores. Puede trabajar con él como con cualquier texto de Vim, pero los cambios no se guardan. Sin embargo, puede ejecutar el comando modificado con
<CR>
. Esto le permite cambiar y reiniciar comandos muy rápidamente o buscar los viejos para volver a usarlos.
q /, q?
Igual que
q:
excepto la búsqueda.
Ctrl-I, Ctrl-O
Se mueve a la ubicación siguiente o anterior en el jumplist. Útil para una verificación rápida y luego retroceder. Es muy bueno leer los archivos de ayuda.
Macros
Consulte
esta publicación para obtener una visión más profunda sobre el uso de macros.
Modo visual
gv
Selecciona el elemento visual anterior.
v_o
Va al otro lado del bloque visual. Útil si comenzaste una línea demasiado baja o algo así. En el modo de bloque, va al ángulo diagonal opuesto y usa
v_O
para cambiar al
v_O
horizontal opuesto.
g ctrl-A / ctrl-X
En modo visual, ctrl-A simplemente incrementa el primer número en cada línea. Por otro lado,
g ctrl-A
se incrementará en una línea con cada línea. Esto es mucho más fácil de explicar en la tabla:
Operadores: v, V, cv (: h o_v)
Probablemente sepa que en el modo visual puede seleccionar caracteres (v), líneas (V) y bloques (ctrl-V). Pero estas tres combinaciones se pueden usar como operadores de movimiento para el fragmento correspondiente. Por ejemplo, tiene el siguiente texto:
abc
abc
abc
Si coloca el cursor en la parte superior
b
y presiona
d2j
, eliminará las tres líneas, porque
j
mueve línea por línea. Si
d<cV>2j
presiona
d<cV>2j
, el movimiento se convierte en bloque por bloque y solo se elimina la columna central con tres letras
b
.
Un caso de uso es eliminar en la búsqueda. Normal
d/
mueve personaje por personaje. Por lo tanto, uso
dV/
para el movimiento línea por línea con eliminación. Hay otra forma de hacer esto:
/ regex / {n}
Movimiento n líneas debajo del partido, o tantas líneas arriba si el valor es negativo. Como efecto secundario, el movimiento se produce línea por línea. Por lo tanto, si desea eliminar la primera línea correspondiente a
regex
, puede ingresar
d/regex//0
.
Ex equipos
Ingresa los comandos ex en modo comando, por ejemplo, el comando
:s
. Además del reemplazo, hay muchos otros comandos útiles. Todos estos ejemplos requieren un rango, como
%
.
: g / regex / ex
Ejecuta el comando solo en líneas que coinciden con la expresión regular. Por ejemplo, puede ingresar
g/regex/d
para eliminar todas las líneas que coinciden con la expresión regular. El comando
v
es similar a
g
, pero funciona en todas las líneas que
no coinciden con la expresión regular.
Los trucos se vuelven más poderosos con la norma y algunos otros.
: norma {Vim}
Actúa como si ejecutaras {Vim} en cada línea del rango. Por ejemplo,
g/regex/norm f dw
eliminará la primera palabra después del primer espacio en cada línea correspondiente a la expresión regular regex. Esto es a menudo mucho más simple que una macro.
norm
obedece todas sus comparaciones. Por ejemplo, si asignó
jk
a
<esc>
en modo de inserción, entonces la
norm I jk$diw
agregará un espacio al comienzo de la línea,
saldrá del modo de inserción y luego eliminará la última palabra en la línea. Realmente me gusta esta funcionalidad, pero si prefieres no usar tus mapeos, ¡entonces puedes aplicar la
norm!
.
: co.
Copia un rango a la línea actual. También puede especificar valores arbitrarios en lugar de un punto, por ejemplo,
+3
o
'a. mv
'a. mv
para moverse.
: y {reg}
Copia el rango en el
{reg}
. Si
{reg}
mayúscula, se agrega al caso existente. es decir, tal equipo
let @a = '' | %g/regex/y A
copiará a todas las líneas correspondientes a
regex
en todo el archivo. Esto ayuda a extraer el texto roto del archivo y copiarlo al portapapeles del sistema (usando
let @+ = @a
).
: windo {ex}
Ejecuta un comando en todas las ventanas. Por ejemplo
:windo $
todas las ventanas hacia abajo. Hay
bufdo
,
cdo
,
tabdo
y otros.
Funciona muy bien con
g
s
. Para reemplazar todas
AA
combinaciones
AA
con
BB
con una vista previa de los reemplazos, puede ingresar
vimgrep AA
cargando todas las coincidencias en quickfix y luego
cdo s/AA/BB/cge
para buscar / reemplazar todas las coincidencias.
Vim para extensores
A continuación se enumeran trucos que requieren guardar la configuración o cambiar una sesión de Vim. Hipotéticamente, pueden usarse en el modo "puritano", simplemente ingresando comandos, pero algunos implican cambios bastante serios que contradicen el espíritu del purismo.
Aquí es solo lo más inusual. Muchas personas asignan
H
al límite
^
, por lo que no vale la pena mencionar tales cosas. Además, no tiene sentido hablar de
vim-sensible
o
vim-surround
, sino solo de complementos más exóticos.
Si constantemente configura su vimrc, por favor, agregue un comando separado para esto:
command! Vimrc :vs $MYVIMRC
Configuraciones
Tengo todas las configuraciones, combinaciones de teclas y funciones almacenadas en un solo archivo vimrc. Dividirse en múltiples archivos dificulta la búsqueda.
La mayoría de las configuraciones no son realmente "trucos". Es mejor mirar
vim-sensible : casi todas las configuraciones a partir de ahí se adaptarán a su vimrc.
establecer lazyredraw
No vuelva a dibujar la pantalla en el medio de una macro (para mejorar el rendimiento).
establecer smartcase / ignorecase
Con estas dos configuraciones, una búsqueda sin letras mayúsculas se distingue entre mayúsculas y minúsculas, y una búsqueda con mayúsculas distingue entre mayúsculas y minúsculas.
establecer sin archivar
Guardar acciones, incluso si cierra y abre Vim, para que las acciones de deshacer siempre estén disponibles. Muy útil en combinación con el plugin undotree.
establecer foldcolumn = {n}
Columna lateral con bloques colapsados. Cuanto mayor sea
n
, más bloques contraídos se muestran en la columna, y para el resto se indica el número.
establecer sufijoesadd = {str}
gf
generalmente significa "ir al archivo debajo del cursor", pero requiere una extensión de archivo en la línea.
suffixesadd
agrega la extensión especificada. Si
suffixesadd=.md
, entonces el comando
gf
en la línea 'foo' buscará los archivos
foo
y
foo.md
set inccommand = nosplit
Solo para Neovim. La
incommand
muestra en tiempo real qué cambios hará el equipo. Actualmente solo se admite s, pero incluso esto es increíblemente útil. Si ingresa
:s/regex
, todas las coincidencias se resaltan. Si luego agrega
/change
, mostrará todos los reemplazos. Funciona con todas las propiedades de expresiones regulares, incluidos los vínculos de retroceso y los grupos.
establecer statusline (: h statusline)
Determina qué mostrar en el panel en la parte inferior de cada ventana. Aquí el formateo es mucho más complicado y meticuloso que en otras configuraciones, por lo que debe dedicar tiempo a explicarlo. Hay algunos trucos simples. Primero, mira la barra de estado predeterminada de Vim:
:set statusline=%<%f\ %h%m%r%=%-14.(%l,%c%V%)\ %P
Aquí es más fácil reemplazar
%P
(porcentaje del archivo sobre el cursor). El formato de la barra de estado es el valor después del signo de porcentaje entre llaves. Por lo tanto, para los archivos Markdown, puede escribir esto:
:set statusline=%<%f\ %h%m%r%=%-14.(%l,%c%V%)\ %{wordcount()[\"words\"]}
Y reemplace el porcentaje del archivo con el número de palabras en el documento.
O instalar
tabline
. Si no utiliza pestañas, esta línea puede convertirse en una "línea de estado global". Por ejemplo
set tabline=%{strftime('%c')}
siempre mostrará la fecha en la parte superior.
Atajos de teclas
Tengo
muchas ataduras.
Muchas teclas convenientes en Vim se asignan estúpidamente por defecto. Por ejemplo, guardar la pulsación de tecla
s
es sinónimo de
cl
(guardar una pulsación de tecla), y
U
es lo mismo que
u
, excepto por escribir deshacer como un nuevo cambio, que es funcionalmente inútil.
Q
idéntico a
gQ
y en cualquier caso es una trampa tremenda.
Z
usa solo para
ZZ
y
ZQ
. Gosh, incluso el manual de Vim recomienda reasignar las teclas
_
y a algunas funciones, porque "probablemente nunca las use". Preferiría no guardar un clic, sino agregar funciones completamente nuevas al teclado. Estas son algunas de mis fijaciones:
nnoremap Q @@
Sin ralentizar la transición al modo ex, repite la última macro.
nnoremap s "_d
Hace que la tecla
s
(con la configuración adecuada para
ss
y
S
) funcione como d, solo sin guardar el texto eliminado en el registro. Útil para no obstruir el registro.
nnoremap <cj> <cw> j
Ve a la ventana de abajo. Asignaciones apropiadas para
h
,
k
,
l
. Trabajar con Windows es mucho más fácil.
nnoremap <leader> e: exe getline (line ('.')) <cr>
Ejecute la línea actual como si fuera un comando. En experimentos, a menudo es más conveniente que
q:
Argumentos especiales (: h map-argumentos)
El
map <buffer> lhs rhs
activa la asignación de teclas solo para este buffer. Realmente funciona convenientemente con comandos automáticos como una combinación temporal de teclas o al definir asignaciones a través de una función. Las asignaciones de búfer tienen prioridad sobre las globales, es decir, puede anular el comando general más útil en una situación específica.
El
map <expr> {lhs} {expr}
verifica
{expr}
y utiliza el valor de retorno como la reasignación final de las claves. Un caso de uso simple es vinculante en función de las condiciones. Tengo estos:
nnoremap <expr> k (v:count == 0 ? 'gk' : 'k')
nnoremap <expr> j (v:count == 0 ? 'gj' : 'j')
Lo que hace que
j
y
k
muevan a lo largo de la línea
hasta que se encuentre
un número, y luego se cancela la clave. Por lo tanto, puedo navegar largos párrafos de prosa sin romper combinaciones como
10j
.
El argumento
<silent>
ayuda si algún enlace ejecuta comandos ex.
inoremaps
Gracias a
inoremap
enlaces funcionan en modo de inserción. Allí comienzan a funcionar, así que
inoremap ;a aaaa
introducirá 'aaaa' en lugar de '; a'. Si desea hacer algo en modo normal, use
<cO>
. Por ejemplo, si tenemos
inoremap ;1 <co>ma
entonces
;1
establecerá
'a
.
Me gusta especificar el uso de punto y coma como clave para las reasignaciones, porque en los textos normales casi siempre hay un espacio o una nueva línea después del punto y coma.
autocmd
Los comandos automáticos son excelentes para la configuración. Por lo general, los configura de esta manera:
augroup {name} autocmd! " Prevents duplicate autocommands au {events} {file regex} {command} augroup END
Luego, si alguno de los eventos {events} ocurre en el archivo {file regex}, se activará el comando {command}. Los eventos están listados
:h event
. Por ejemplo, si escribes
augroup every autocmd! au InsertEnter * set norelativenumber au InsertLeave * set relativenumber augroup END
entonces vim deshabilitará el número relativo solo para el modo de inserción.
El comando
au {event} <buffer> {ex}
aplica el comando automático solo al buffer actual. A veces lo uso para agregar controladores de eventos a corto plazo a un archivo específico.
BufNewFile, BufRead
BufnewFile
inicia cuando se crea un nuevo archivo,
BufRead
, cuando se abre el búfer por primera vez. Por lo general, se usan para agregar parámetros y reasignaciones a tipos de archivo específicos. Tengo uno de estos:
augroup md autocmd! au BufNewFile,BufRead *.md syntax keyword todo TODO au BufNewFile,BufRead *.md inoremap <buffer> ;` ```<cr><cr>```<Up><Up> augroup END
Solo en los archivos Markdown se resalta la línea TODO y los caracteres
;`
en el modo de inserción agrega una notación de código.
Los equipos automáticos te permiten hacer cosas mucho más complejas. Por ejemplo,
au
for
BufWriteCmd
anula el ahorro estándar, lo que le permite implementar una lógica personalizada. Esto va más allá de los "trucos" y entra en el ámbito de la "magia oscura".
Complementos
La mayoría de la gente sabe acerca de complementos populares como
vim-surround
y
NERDtree
. Aquí hay una lista de algunos poco conocidos que encuentro muy útiles.
En la mayoría de los editores de texto, las acciones de deshacer ocurren linealmente. Si realiza un cambio en A, deshacerlo y luego hacer un cambio en B, entonces A se pierde para siempre. Sin embargo, Vim almacena todo el árbol de acciones deshechas. El comando
u
revierte la acción en la rama del árbol actual, y
g
va a la versión
cronológica anterior. Puede ver la lista de acciones canceladas con el comando
:undolist
.
Pero este formato no es muy claro. Es mucho mejor ver el árbol real. Esto es exactamente lo que hace
Undotree
: presenta una buena representación ASCII del árbol de acciones canceladas con una navegación conveniente.
El complemento proporciona comandos para intercambiar argumentos, por lo que puede reemplazar
(a, f(b, c))
con
(f(b, c), a)
en un par de pulsaciones de teclas. Regularmente tengo que hacer tales ediciones, por lo que esta es una mejora importante en la calidad de vida.
Conecta una API de nivel superior al terminal integrado neo / vim. Por ejemplo
:T {text}
envía {text} a la consola. Bueno para crear un entorno interactivo.
"TODO {{{
Muchos temas no están cubiertos en este artículo porque son demasiado técnicos o deben explicarse en detalle, como la escritura de funciones o el sistema de sintaxis. Y no sé mucho. Me gustaría estudiar los siguientes temas con más detalle:
Windows Vista previa, Quickfix y Lista
A veces uso herramientas con estas ventanas, pero no sé cómo manipularlas. Me gustaría agregar errores de corrección rápida a mi
complemento TLA + . También me gusta la idea de poner información de respaldo y comandos de devolución de llamada en la ventana de vista previa. Esto abre algunas posibilidades que son difíciles de reproducir en el IDE.
API de Neovim
Neovim ofrece una API avanzada para integrar Vim con programas externos. Su script Python puede enviar comandos a la instancia de Neovim, y puede controlar el editor a través del servidor, por ejemplo. Vi algunas demostraciones conceptuales geniales donde el autocompletado ocurre según la información en un navegador. ¡Parece muy genial!
Objetos de texto
Nunca creado tal.
Entonces, esta fue una breve descripción de algunas de las funciones implícitas de Vim. ¡Espero que hayas descubierto algo útil!