Como inverter a seleção no vim?


12

Após selecionar um intervalo de linhas com o Vcomando, eu gostaria de excluir todas as linhas do arquivo que NÃO está selecionado, portanto, é uma maneira de inverter a seleção - selecione todas as linhas que não estão selecionadas?

Tipo, como

:g!/FOO/d

exclui todas as linhas que NÃO contêm FOO .

Se eu tivesse um intervalo em mente e quisesse usar o inverso:

'a,'b

Eu precisaria usar os dois intervalos:

1,'a-1

e

'b+1,$

Eu suspeito que isso não possa ser feito em uma única etapa - mas seria bom!


então você quer uma operação no estilo "crop"?
quack quixote

Respostas:


7

Primeiro, crie o seguinte mapeamento (por exemplo, vinculado à <F4>chave)

map <F4> :<C-U>1,'<-1:delete<CR>:'>+1,$:delete<CR>

depois de selecionar um intervalo no modo visual, basta pressionar <F4>para disparar o comando associado. O comando pode ser facilmente explicado em partes:

  • " :" Entre no modo de linha de comando.
  • " <C-U>" Remova todos os caracteres entre a posição do cursor e o início da linha.
  • " 1,'<-1" Especifique o intervalo da primeira linha do arquivo até a linha antes do início da seleção atual.
  • " :delete<CR>" Excluir (o intervalo de linhas especificado anteriormente).
  • " :'>+1,$:delete<CR>" Exclua as linhas no intervalo " '>+1,$", ou seja, da linha após o final da seleção até o final do arquivo.

2
apenas para explicar: 1, '<- 1 é o intervalo da linha 1 até o início da seleção. '> + 1, $ é o intervalo de 1 linha após a seleção até o fim ...
akira

Existe alguma maneira de fazer isso com apenas um comando "excluir"?
21411 Kevin Panko

1
@ Kevin Panko: você precisaria combinar os intervalos em uma única expressão. Eu olhei para os documentos e não acho que a sintaxe do intervalo suporte tal coisa. vimdoc.sourceforge.net/htmldoc/cmdline.html#cmdline-ranges ,,, vim.wikia.com/wiki/Ranges
quack quixote

15
  1. selecione seu texto
  2. "*yggdG"*p que significa ...

    "*y    " yank it to the selection register
    ggdG   " delete everything
    "*p    " and paste the selection again 
    

9
Ygg "_dGP é o mesmo, mas mais curto.
Kevin Panko

1
no final, você obtém o mesmo texto, é verdade :) #
akira

Gostaria apenas de me referir às respostas de akira e Kevin Panko (não consigo adicionar comentários). "[O] pposite [d] elete em (v) modo isual VMAP od Ygg" _dGP
Marcin Rogacki

Plugins como github.com/maxbrunsfeld/vim-yankstack facilitam essa abordagem. Você não precisa se preocupar tanto com o seu registro ianque ser derrotado pela exclusão.
Jack O'Connor

como isso pode ser adicionado como mapeamento de teclado .vimrc? Eu tentei algumas tentativas, mas ainda não a consegui. Minhas tentativas foram map <F4> n"*yggdG"*p enmap <F4> "*yggdG"*p
Brad Parks

7

Apenas para a posteridade:

:v/\%V/d

Isso faz um global inverso nas linhas que não fazem parte da seleção. Observe que: v é uma construção baseada em linha; portanto, qualquer linha que contenha qualquer seleção, seja linha, fluxo ou seleção de bloco, será excluída.


1

como 'inverting' significa basicamente criar 'multiselections' (a área antes e depois da seleção original), pesquisei novamente os vimscripts http://www.vim.org/scripts/script.php?script_id=953 . tente isso.

 There are a number of operations to very
 easily manipulate selections such as modifying 
 the regions (add/delete/inverte/clear), hiding, 
 refreshing, saving and restoring etc."
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.