¿Hay alguna forma de alias `: w'` a`: w`, para evitar crear archivos con el nombre '?

9

De vez en cuando, el meñique rozará la 'llave, mientras que llegar a entrar, dando como resultado :w'<Enter>.

He intentado:

cabbrev w' :w
cabbrev w\' :w
cabbrev "w'" :w

Ninguno de ellos funciona. ¿Hay una manera de alias :w'a :w?

También utilizo cmdwin ( :help cmdwin+ nnoremap : :<C-F>) en lugar de la línea de comandos normal, por lo que puntos de bonificación si funciona allí también.

mwcz
fuente
3
ja Tengo el mismo problema con el \
Martin Tournoij

Respuestas:

8

Como señala Peter Rincker, los cmaps también pueden expandirse en otros lugares, por cnoreabbrevlo que sería mejor :

cnoreabbrev w' w

O, lo más seguro, nuevamente gracias a Peter:

cnoreabbrev <expr> w' getcmdtype() == ":" && getcmdline() == "w'" ? "w" : "w'"

Al verificar explícitamente si la línea de comando contiene solo w', se pueden evitar expansiones no deseadas en situaciones.

Puedes usar un cmap:

cmap w' w

Todavía tendría que presionar Enter, pero un accidente 'debe ignorarse ahora.

Si está utilizando cmdwin, un inoremapconjunto de autocmdpodría ser útil:

autocmd CmdwinEnter * inoremap w' w
autocmd CmdwinLeave * iunmap w'
muru
fuente
Corrí :cmap w' w, pero no hubo cambios en el comportamiento. :w'todavía resulta en escribir en un archivo llamado '. "'" [New] 0L, 0C written.
mwcz
@mwcz ¿Aparece 'realmente cuando lo presionas después w? No debería si cmapse creó con éxito: un cmap LHS se rellena automáticamente con el RHS, por lo que si presiona a ', solo debería mostrarse w.
muru
1
Tenga cuidado con los desnudos cmapy cabbrev's. Se ejecutarán / expandirán en otros modos y otros lugares. por ejemplo :s/'follow'/fooy /'follow'. Consulte el siguiente cambio de vim: función x para eliminar el búfer en lugar de guardar y salir o usar cmdalias.vim
Peter Rincker
1
Mejor prevenir que curar:cnoreabbrev <expr> w' getcmdtype() == ":" && getcmdline() == "w'" ? "w" : "w'"
Peter Rincker
Sí, 'todavía aparece, pero me di cuenta de que es porque estoy usando cmdwin para ingresar comandos, y cmdwin es solo un búfer normal, así cmap/cnoreabbrevque no trabaje allí. Actualización de la respuesta con noreabbrevopción para usuarios de cmdwin. :) ¡¡¡Gracias!!!
mwcz
0

Este método funciona para mí:

:ca w' w

Alternativamente, puede configurar su vim para guardar el búfer actual cuando presiona Esc dos veces, por ejemplo

:map <Esc><Esc> :w<CR>

O utilice la siguiente asignación para guardar el archivo ya sea con Ctrl+ so F2:

nmap <c-s> :w<CR>
vmap <c-s> <Esc><c-s>gv
imap <c-s> <Esc><c-s>

nmap <F2> :update<CR>
vmap <F2> <Esc><F2>gv
imap <F2> <c-o><F2>

Nota: F2 solo guarda si es necesario y devuelve al usuario al modo de inserción (o restaura su selección visual), según sea necesario.

Fuente: Guardar un archivo en vim wikia

O use las siguientes alternativas:

  • :up( :update) para:w
  • ZQ para :q
  • ZZpara :wqo:x
kenorb
fuente
Observe las comillas en la pregunta. :w'no :w. Quiero usar :wsin golpear accidentalmente ', lo que escribe un archivo que debo rm \'. Buenos consejos, sin embargo.
mwcz
1
Ctrl-S no envía una señal de detención: si el programa se detiene, probablemente sea porque el búfer estaba lleno. Ver unix.stackexchange.com/questions/13629/… '
muru