Vim
es mi editor de texto preferido cuando programo, y por eso siempre me encuentro con un problema particularmente molesto.
Con frecuencia, cuando necesito guardar rápidamente el búfer y continuar con alguna otra tarea miscelánea, hago el típico
:w
Sin embargo, yo, que parece ser más del 50% del tiempo, siempre logro capitalizar eso :w
. Naturalmente, vim me grita porque W
es un comando inválido
E492: Not an editor command: W
Mi pregunta es cómo puede uno alias colon-comandos en vim . Particularmente, podría ejemplificar cómo alias W
a w
.
Conozco el proceso para mapear claves para ciertos comandos . Desafortunadamente, eso no es lo que estoy buscando.
Para dejar la finalización intacta, intente usar
cnoreabbrev W w
, reemplazará W
en la línea de comando con w
, pero solo si no es seguido ni precedido por el carácter de la palabra, entonces :W
se reemplazará por :w
, pero :Write
no lo hará. (Tenga en cuenta que esto afecta a todos los comandos que coinciden, incluidos los que no puede esperar, por ejemplo, el comando :saveas WZ
será reemplazado por :saveas w Z
, así que tenga cuidado con esto.)
Así es como lo escribiría ahora :
cnoreabbrev W ((getcmdtype() is# ':' && getcmdline() is# 'W')?('w'):('W'))
Como una función:
fun! SetupCommandAlias(from, to) exec 'cnoreabbrev '.a:from \ .' ((getcmdtype() is# ":" && getcmdline() is# "'.a:from.'")' \ .'? ("'.a:to.'") : ("'.a:from.'"))' endfun call SetupCommandAlias("W","w")
Esto comprueba que el tipo de comando es :
y el comando es W
, por lo que es más seguro que solo cnoreabbrev W w
.
Con la búsqueda suplementaria, descubrí que alguien hizo casi la misma pregunta que yo.
:command
hará el truco
Tenga en cuenta que, como señala Richo , el comando del usuario debe comenzar con una letra mayúscula.
Encuentro que mapear el ;
clave para :
sería una mejor solución y lo haría más productivo para escribir otros comandos.
nnoremap ; : vnoremap ; :
Tal vez le gustaría asignar una de sus teclas de función (F1..F12) a: w? Luego pon esto en tu .vimrc:
noremap :w inoremap :w
(ctrl-o en el modo de inserción cambia temporalmente al modo normal).
La mejor solución consiste en escribir una función personalizada para manejar abreviaturas que solo tienen lugar al principio de la barra de comandos.
Para esto, agregue lo siguiente su archivo vimrc o en cualquier otro lugar.
" cabs - less stupidity {{{ fu! Single_quote(str) return "'" . substitute(copy(a:str), "'", "''", 'g') . "'" endfu fu! Cabbrev(key, value) exe printf('cabbrev %s (getcmdtype() == ":" && getcmdpos() <= %d) ? %s : %s', \ a:key, 1+len(a:key), Single_quote(a:value), Single_quote(a:key)) endfu "}}}
" use this custom function for cabbrevations. This makes sure that they only " apply in the beginning of a command. Else we might end up with stuff like " :%s/\vfoo/\v/\vbar/ " if we happen to move backwards in the pattern. " For example: call Cabbrev('W', 'w')
Algunas abreviaturas útiles del material fuente donde encontré esto:
call Cabbrev('/', '/\v') call Cabbrev('?', '?\v') call Cabbrev('s/', 's/\v') call Cabbrev('%s/', '%s/\v') call Cabbrev('s#', 's#\v') call Cabbrev('%s#', '%s#\v') call Cabbrev('s@', 's@\v') call Cabbrev('%s@', '%s@\v') call Cabbrev('s!', 's!\v') call Cabbrev('%s!', '%s!\v') call Cabbrev('s%', 's%\v') call Cabbrev('%s%', '%s%\v') call Cabbrev("'<,'>s/", "'<,'>s/\v") call Cabbrev("'<,'>s#", "'<,'>s#\v") call Cabbrev("'<,'>s@", "'<,'>s@\v") call Cabbrev("'<,'>s!", "'<,'>s!\v")
Supongamos que desea agregar un alias para el comando tabnew en gvim. simplemente puede escribir el siguiente comando en su archivo .vimrc (si no está en la carpeta de inicio que crear uno)
cabbrev t tabnew
en mi .vimrc
tengo:
nmap :W :w nmap :Q :q nmap :wQ :wq nmap :WQ :wq
que hace el truco para mi
El más fácil y seguro es un complemento como cmdalias.vim o mi actualización reciente vim-alias que toma en cuenta
:sil(ent)(!)
o :redi(r)
, '<,'>
para la selección visual actual,