Busca condicional e substituição em uma linha no vim?

5

Vamos dizer que quero comentar e descomentar uma linha.

Eu sei que posso

:s!^!//!

e depois

:s!^//!!

Agora, o que acontece se eu quiser isso como uma linha única?

Basicamente, se uma linha começa com // , em seguida, remova-a, else adicione-a.

Eu quero mapear este comando para um atalho em vez de ter dois.

    
por k0pernikus 23.01.2012 / 15:27

1 resposta

5

Tenho certeza de que isso não pode ser feito diretamente. No entanto, eu criei uma função para você. Coloque isso no seu ~/.vimrc :

function! Toggle()
    s!^\(\s*/\?[^/\s]/\?\)!xxx//!e
    s!^\(\s*\)//!!e
    s!^xxx//!//!e
endfunc

(Isso alterará qualquer xxx// que você já tenha no início de uma linha para // , mas imagino que essa seja uma ocorrência rara). Você poderia chamar isso sempre que quiser com :call Toggle() , mas provavelmente achará mais conveniente mapeá-lo para uma tecla / combinação. O seguinte mapeará para Ctrl + / ; É claro que você pode substituir qualquer combinação de teclas que preferir (pergunte se você precisa de ajuda para mapear outro combo). Coloque isso também no seu ~.vimrc :

nnoremap <C-/> :call Toggle()<CR>
vnoremap <C-/> :call Toggle()<CR>
inoremap <C-/> <Esc>:call Toggle()<CR>i

Estes mapeam Ctrl + / para a função no modo normal, visual e de inserção, respectivamente. Observe que o mapeamento de inserção retornará ao modo de inserção, mas moverá o cursor para o início da linha. Se você preferir permanecer no modo normal, basta soltar o i do final da linha inoremap .

(Atualizado para lidar com espaços em branco. Remove // após o espaço em branco, mas sempre insere no início da linha)

    
por 23.01.2012 / 18:02