Existe uma maneira de alias `: w'` a`: w`, para evitar a criação de arquivos com o nome '?

9

Ocasionalmente, meu mindinho roçará a 'tecla enquanto pressiona enter, resultando em :w'<Enter>.

Eu tentei:

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

Nenhum deles funciona. Existe uma maneira de alias :w'para :w?

Eu também uso cmdwin ( :help cmdwin+ nnoremap : :<C-F>) em vez da linha de comando normal; portanto, pontos de bônus se funcionar lá também.

mwcz
fonte
3
hah; Eu tenho o mesmo problema com o \
Martin Tournoij

Respostas:

8

Como Peter Rincker aponta, os cmaps também podem se expandir em outros lugares, então cnoreabbrevseria melhor :

cnoreabbrev w' w

Ou, o mais seguro, novamente graças a Peter:

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

Ao verificar explicitamente se a linha de comando contém apenas w', expansões indesejadas em situações podem ser evitadas.

Você pode usar um cmap:

cmap w' w

Você ainda teria que pressionar Enter, mas um acidente 'deve ser ignorado agora.

Se você estiver usando cmdwin, um inoremapconjunto de autocmdpode ser útil:

autocmd CmdwinEnter * inoremap w' w
autocmd CmdwinLeave * iunmap w'
muru
fonte
Eu corri :cmap w' w, mas não houve mudança de comportamento. :w'ainda resulta na gravação em um arquivo chamado '. "'" [New] 0L, 0C written.
Mwcz
@mwcz Aparece 'realmente quando você pressiona depois w? Não deveria ter cmapsido criado com êxito - um LHS de cmap é preenchido automaticamente com o RHS; portanto, se você pressionar a ', ele ainda será exibido w.
19715 muru
11
Tenha cuidado com os nus cmape cabbrevos. Eles irão executar / expandir em outros modos e outros lugares. por exemplo, :s/'follow'/fooe /'follow'. Consulte o seguinte alteração vim: função de x para excluir tampão em vez de salvar e sair ou utilização cmdalias.vim
Peter Rincker
11
Melhor prevenir do que remediar:cnoreabbrev <expr> w' getcmdtype() == ":" && getcmdline() == "w'" ? "w" : "w'"
Peter Rincker
Sim, 'ainda aparece, mas eu descobri que é porque estou usando o cmdwin para digitar comandos, e o cmdwin é apenas um buffer comum, portanto cmap/cnoreabbrev, não trabalhe lá. Atualizando a resposta com a noreabbrevopção para usuários do cmdwin. :) Obrigado!!!
Mwcz
0

Este método funciona para mim:

:ca w' w

Como alternativa, você pode configurar o seu vim para salvar o buffer atual ao pressionar Esc duas vezes, por exemplo

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

Ou use o seguinte mapeamento para salvar o arquivo com Ctrl+ sou 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 salva apenas se necessário e retorna o usuário ao modo de inserção (ou restaura sua seleção visual), conforme necessário.

Fonte: Salvando um arquivo no vim wikia

Ou use as seguintes alternativas:

  • :up( :update) para:w
  • ZQ para :q
  • ZZpara :wqou:x
kenorb
fonte
Observe as aspas na pergunta. :w'não :w. Eu quero usar :wsem bater acidentalmente ', que grava um arquivo que devo então rm \'. Boas dicas, no entanto.
mwcz
11
Ctrl-S não envia um sigstop - se o programa parar, é provavelmente porque um buffer estava cheio. Veja unix.stackexchange.com/questions/13629/… '
muru