Aliasing un comando en vim

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.)

Actualizar

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

  • espacios en blanco o modificadores anteriores tales como :sil(ent)(!) o :redi(r) ,
  • modificadores de rango como '<,'> para la selección visual actual,
  • escapar caracteres especiales como comillas, y
  • compruebe si el alias elegido es una abreviatura de línea de comando válida.