Como “reutilizar” um achado regex e substituir no Vim

2

Eu tenho um arquivo de texto simples com entradas como

firstAuthorLastName_titleFirstWord_YYYY

que eu mudo para

firstAuthorLastNameYYYYtitleFirstWord

com o seguinte comando s// no Vim. ^ [1]

%s/\([a-z]\+\)_\([a-z]\+\)_\([0-9]\{4}\)//g

Mas eu quero fazer esse comando uma e outra vez. Parece que eu deveria ser capaz de fazer isso com um script em lotes do Windows e o sinal -c to gvim.exe . Mas eu não consigo fazer isso funcionar.

Eu tenho um script em lotes do Windows com o seguinte.

gvim -c "%s/\([a-z]\+\)_\([a-z]\+\)_\([0-9]\{4}\)//g" herron.bib

Mas recebo a mensagem E486: Pattern not found: \([a-z]\+\)_\([a-z]\+\)_\([0-9]\{4}\) . Existe uma maneira de reutilizar / automatizar este comando s// ? Eu sei que posso flechar através do meu ex-histórico de comandos, mas gostaria de algo um pouco mais permanente e confiável.

[^ 1] FWIW, este é um arquivo BibTeX .bib que eu exporto de Zotero . Mais abaixo eu uso o vim-pandoc para escrever notas no markdown. Os sublinhados tornam um pouco mais difícil usar a função vim-pandoc "arrumada", então eu os removo. Eu atualizo o .bib várias vezes por semana e reexportei-o do Zotero, então também preciso executar esse regex várias vezes por semana.

    
por Richard Herron 24.09.2013 / 11:40

1 resposta

5

Eu não vejo nada de errado, e aparentemente o padrão é passado corretamente para o Vim, então deve funcionar: - (

Alternativas

A menos que você realmente precise de recursos especiais do Vim, provavelmente é melhor usar ferramentas não interativas como sed , awk ou Perl / Python / Ruby / seu favorito linguagem de script aqui .

Dito isto, você pode usar o Vim não interativamente:

Modo em lote silencioso

Para um processamento de texto muito simples (ou seja, usando o Vim como um 'sed' ou 'awk' aprimorado, talvez apenas aproveitando as expressões regulares aprimoradas em um comando :substitute ), use Ex-mode .

REM Windows
call vim -N -u NONE -n -es -S "commands.ex" "filespec"

Nota: o modo de lote silencioso ( :help -s-ex ) atrapalha o console do Windows, portanto, talvez seja necessário fazer um cls para limpar após a execução do Vim.

Alternativas de Vim

Com base na sua descrição, não está totalmente claro se você deseja automação completa ou apenas uma lembrança mais fácil. Se você não se importa de aplicar o comando manualmente (mas rapidamente) de dentro do Vim, que tal:

a) um comando personalizado

:command! TidyNames %s/\([a-z]\+\)_\([a-z]\+\)_\([0-9]\{4}\)//g

b) um mapeamento personalizado

:nnoremap <Leader>tn :%s/\([a-z]\+\)_\([a-z]\+\)_\([0-9]\{4}\)//g<CR>

Ambos podem ser colocados em seu ~/.vimrc ou (com <buffer> modificador) em um ~/.vim/after/ftplugin/tex.vim específico do tipo de arquivo.

    
por 24.09.2013 / 11:57