Vi多行命令在一行中

时间:2017-05-24 14:04:07

标签: vim vi

我希望在vi中实现以下功能:

  • 删除前几列
  • 删除以特定字词开头的行
  • 删除第一个单词后的所有内容。

关于上述要求我有以下命令

:%s/new page //g删除前两列。
:g/abc/d:g/xyz/d:g/ddd/d删除以特定字词开头的行 :%s/ .*//g删除第一个单词后的所有内容。

总的来说,我想运行以下命令:

:%s/new page //g
:g/abc/d
:g/xyz/d
:g/ddd/d
:%s/ .*//g

如何在一个命令中执行上述所有命令。

我尝试了|,但没有效果。

:g/abc/d|:g/xyz/d|:g/ddd/d

我收到以下错误:

E147: Cannot do :global recursive

我怎样才能做到这一点。我想在一个命令中执行所有命令。

由于

2 个答案:

答案 0 :(得分:4)

您可以将所有这些命令放在一个函数中:

function! AllMyCommands()
    %s/new  page   //g
    g/abc/d
    g/xyz/d
    g/ddd/d
    %s/ .*//g
endfunction

直接调用它:

:call AllMyCommands()

或通过自定义命令:

command! Foo call AllMyCommands()
:Foo

或通过自定义映射:

nnoremap <key> :<C-u>call AllMyCommands()<CR>
<key>

答案 1 :(得分:2)

  

我试过了|但它没有用。

<div id="main">
  <div>A</div>
  <div>B</div>
  <div>C</div>
  <div>D</div>
  <div>E</div>
  <div>F</div>
</div>

通常,命令可以按顺序执行,由:g/abc/d|:g/xyz/d|:g/ddd/d 分隔,但有例外,如|所示:

:help :bar

作为一种解决方法,您可以将它们包装在These commands see the '|' as their argument, and can therefore not be followed by another Vim command: [...] :global [...]

:execute

但按照@ romainl的回答将它们放入:exe 'g/abc/d'|exe 'g/xyz/d'|g/ddd/d 可能更好。

相关问题