vim: como posso fazer um mapeamento de um autocmd

0

no meu .vimrc eu tenho um autocmd que limpa meus arquivos, mas como posso fazer um mapeamento fora do comando?

autocmd BufWritePre *.test1 silent! :%s/\s\+$//e | silent! :%s/\(\n\n\)\n\+// | silent! :%s#\($\n\s*\)\+\%$## | :%s/;$
nnoremap ;; silent! :%s/\s\+$//e | silent! :%s/\(\n\n\)\n\+// | silent! :%s#\($\n\s*\)\+\%$## | :%s/;$<CR>

O mapeamento falha dizendo

Error detected while processing ~/.vimrc:
line  966:
E486: Pattern not found: ;$<CR>
    
por divramod 15.08.2018 / 07:03

1 resposta

1

Portanto, o principal problema com o seu comando é que usando | você está dividindo-o em vários comandos, sendo o primeiro nnoremap , mas a partir do segundo, uma série de silent! de comandos com substituições, que estão sendo executadas no momento em que seu .vimrc está sendo originado, em vez de se tornar parte do comando.

Usar \| ou <bar> deve resolver isso.

A segunda questão é que nnoremap espera um comando no modo normal, então pega o silent! e executa o comando s (substitute), que substitui o caractere sob o cursor por ilent! ... , que não é o que você quer ... Você precisa de um : extra antes do primeiro silent! para saber como entrar no modo de comando.

E terceiro, seu último comando %s/;$<CR> não está muito bem formado, você precisa de dois / s adicionais para completá-lo. Estou assumindo que sua intenção é retirar todos os ; s no final das linhas, então %s/;$// é o que eu estou supondo que você queira aqui. (Eu também notei que você pulou um silent! lá, talvez por omissão? Eu estou adicionando aqui, apenas no caso.)

Colocando tudo junto:

nnoremap ;; :silent! :%s/\s\+$//e \| silent! :%s/\(\n\n\)\n\+// \| silent! :%s#\($\n\s*\)\+\%$## \| silent! :%s/;$//<CR>
    
por 15.08.2018 / 07:27

Tags