Vim equivalente do C-x C-o do Emacs (delete-blank-lines)?

0

Qual é o equivalente em Vim da função C-x C-o ( delete-blank-lines ) do Emacs?

    
por Geremia 14.10.2016 / 17:31

1 resposta

1

O Vim não possui uma função interna que faz isso. Provavelmente, a maneira mais "vim-like" de fazer isso é definir um objeto-texto .

Objetos de texto são um recurso vim extremamente útil que permite fazer algo assim:

dip     "(d)elete (i)nside (p)aragraph

ou

yaW    "(y)ank (a)round this (W)ORD

Podemos definir um objeto de texto para "linhas vazias". Vamos usar 'e' como nosso mnemônico. Isso significa que os recursos que estamos procurando são

die    "delete inside this empty block (leaving one blank line)

e

dae    "Delete around this empty block (Leaving no blank lines)

O melhor dos objetos de texto é que adicionar isso fará com que todos os outros operadores também trabalhem. Então você pode fazer cie , ou yie também. Aqui estão as linhas relevantes para adicionar ao seu .vimrc

vnoremap ie :<C-u>silent! normal! ?^.?+1<C-v><cr>V/^./-1<C-v><cr>k<cr>
onoremap ie :<C-u>silent! normal! ?^.?+1<C-v><cr>V/^./-1<C-v><cr>k<cr>
vnoremap ae :<C-u>silent! normal! ?^.?+1<C-v><cr>V/^./-1<C-v><cr><cr>
onoremap ae :<C-u>silent! normal! ?^.?+1<C-v><cr>V/^./-1<C-v><cr><cr>

Eu não me preocuparei em explicar cada uma delas (já que a maioria delas é muito parecida), mas a idéia básica é que mapeamos ie para este conjunto de pressionamentos de tecla no modo normal:

?^.?+1<C-v><cr>V/^./-1<C-v><cr>k

Vamos dividir isso:

?               " Search backwards
 ^.             " For a non-blank line
   ?+1          " And offset to one line forward. (So that we find the first blank after a non-blank)
      <C-v><cr> " Enter. (The <C-v> is necessary because we enter it from :normal

"Start a visual selection
V

/                   " Search forwards
 ^.                 " For a non-blank line
   /-1              " And offset to one line backwards. 
      <C-v><cr>     " Enter. (The <C-v> is necessary because we enter it from "normal"
               k    " (optional) if this is an 'i' mapping, not an 'a' mapping, move up one line so that we leave a line

Isso não é exatamente o mesmo que o emacs faz. Mas, novamente, você está usando o vim afinal. Você não deve tentar copiar exatamente a mesma funcionalidade. Isso lhe dará uma funcionalidade semelhante, mantendo a mesma sensação "vim-esque".

    
por 14.10.2016 / 18:48

Tags