VIM中的线性选择

时间:2009-04-21 05:59:03

标签: vim

如何在VIM中选择所有不包含“hello”字样的行?我需要它猛拉然后保存到文件中。我该怎么做?我正在寻找类似的东西:

  

:v /!(你好)>档案

10 个答案:

答案 0 :(得分:11)

:g!/hello/ yank A

这些行现在存储在寄存器a中,要粘贴它们做“ap

编辑: 可以缩写为

:g!/hello/y A

对于那些对vim意味着什么感兴趣的人:

:g =全球搜索
! =否定布尔测试 / hello / =匹配“hello”的正则表达式
y =在每条匹配线上执行的命令,在这种情况下为“yank”
A =注册“yank”命令的参数。在这种情况下,寄存器'a'但是以大写形式的意思附加到寄存器而不是替换。

答案 1 :(得分:9)

如果系统上有grep,则可以使用此命令:

:!grep -v hello % > file

答案 2 :(得分:6)

到目前为止,我没有看到提及的替代方案,是redirecton。

因此,对于您的情况,这将是

:redir > file
:g!/hello/
:redir END

另见

:help redir
:help verbosefile

答案 3 :(得分:5)

我通常使用

的一些变体来做这件事
:g/hello/d

即。删除包含“hello”的所有内容,然后选择,抽取或需要完成的任何事情,最后还原回击你。 我发现这对构建命令行管道的精神负担较轻。

答案 4 :(得分:4)

fgm的回答几乎就在那里

:v将选择不匹配的行

所以以下内容会将不包含“hello”的行追加到名为eee的文件中,并在需要时创建它。

:v/hello/ . w!>>eee

答案 5 :(得分:1)

选择并写入新文件:

:g/hello/ . w!>> file 

答案 6 :(得分:1)

非常直接;

:v/hello/ |redir >> file

答案 7 :(得分:0)

在Vim命令之后

:let @a='' | g!/hello/normal "Ayy

你将在寄存器'a'中拥有所有没有'hello'的行。您可以使用“ap normal命令将其值粘贴或使用

将此值放入系统剪贴板
:let @*=@a

然后您可以在Windows上使用'Ctrl + V'或在Mac OS上使用'Cmd + V'或在Linux上使用'鼠标中键'来粘贴文本。

魔术的简要描述:

@a 是一个Vim变量,它绑定到存储在'a'寄存器中的值。
“ap ”bp “cp ,..是Vim正常模式中超过特定​​寄存器值的组合键。
@ * 是绑定到系统剪贴板的Vim变量 让@ * = @a 将值从寄存器'a'放入系统剪贴板。

将此添加到.vimrc或使用插件目录创建文件。

function s:copy_unmathced_lines(pattern)
   let result_lines = []

   for line in getline(1, '$')
      if line !~ a:pattern
         call add(result_lines, line)
      endif
   endfor

   let @* = join(result_lines, "\n")
endfunction

command -nargs=1 CopyUnmatchedLines call s:copy_unmathced_lines(<q-args>)

用例很简单:

CopyUnmatchedLines hello

然后在任何编辑器中使用paste命令。

答案 8 :(得分:0)

Blixtor代码片段的实用示例:使用“:verbosefile”将朋友丢失。

予。打开手册“:e / tmp / new_file”和“:h verbosefile”,然后让我们复制cat blixtor的提示:

:redir > /tmp/verbosefile_instructions
:g/verbosefile/
:redir END

II。确认您遵循有关电子邮件标准的标准规则,并提供标准问候语:

:match ErrorMsg /\%>73v.\+/
:so /bin/greetings.vim

III。用Mutt发送文件。

答案 9 :(得分:0)

关于视觉选择和复制的示例:假设您要分离部件:

  1. 视觉选择它并按“:”

  2. 然后使用命令:

    : '&LT;,' &GT; ! &GT; ../ new_file_in_a_subdirectory

  3. 错误:颜色将被复制到文件中,并且它实际上并不是复制而是剪切和粘贴。