如何在vim中反转选择?


12

在使用V命令选择了一系列行之后,我想删除文件中未选择的每一行,因此是一种反转选择的方法-选择未选择的每一行吗?

怎么样

:g!/FOO/d

删除包含FOO的每一行。

如果我有一个范围,想使用它的反函数:

'a,'b

我需要使用两个范围:

1,'a-1

'b+1,$

我怀疑这不能一步完成-那就太好了!


所以您想要“裁剪”式操作?
quack quixote 09年

Answers:


7

首先创建以下映射(例如绑定到<F4>键)

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

然后,在可视模式下选择范围后,只需按<F4>即可触发关联的命令。该命令可以很容易地解释为以下部分:

  • :”进入命令行模式。
  • <C-U>”删除光标位置和行首之间的所有字符。
  • 1,'<-1”指定从文件的第一行到当前选择开始之前的行的范围。
  • :delete<CR>”删除(先前指定的行范围)。
  • :'>+1,$:delete<CR>”删除范围“ '>+1,$”中的行,即从选择结束后的行到文件末尾的行。

2
只是为了解释一下:1,'<-1是从第1行到选择开始的范围。'> + 1,$是从选择后的1行到结束的范围...
akira

有什么方法可以仅使用一个“删除”命令来完成此操作吗?
凯文·潘科

1
@Kevin Panko:您需要将范围合并为一个表达式。我看了看文档,但我不认为范围语法支持这样的事情。 vimdoc.sourceforge.net/htmldoc/cmdline.html#cmdline-ranges ,,, vim.wikia.com/wiki/Ranges
嘎嘎吉诃德

15
  1. 选择你的文字
  2. "*yggdG"*p 意思是 ...

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

9
YGG“_dGP是相同的,但更短。
凯文Panko

1
最后,您得到的是相同的文本,是:)
akira

我只想参考akira和Kevin Panko的答案(我无法添加评论)。“ [o]在[v]正常模式vmap od ygg中[d]删除” _dGP
Marcin Rogacki 2015年

github.com/maxbrunsfeld/vim-yankstack之类的插件使此方法更容易。您不必担心您的扬克寄存器会被删除所破坏。
杰克·奥康纳

如何在键盘映射中添加它.vimrc?我已经尝试了一些尝试,但是还没有尝试。我的企图是map <F4> n"*yggdG"*p nmap <F4> "*yggdG"*p
布拉德公园

7

只为后代:

:v/\%V/d

这会在不属于选择范围的线上进行全局逆运算。注意:v是基于行的构造,因此任何包含任何选择的行(行,流或块选择)都将被删除。


1

因为'inverting'基本上意味着要创建'multiselections'(原始选择之前和之后的区域),所以我再次在http://www.vim.org/scripts/script.php?script_id=953中搜索了vimscript 。尝试这个。

 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."
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.