2017-05-24 50 views
1

我想达到下列事项六:六多个命令在一行

  • 删除前几列
  • 删除开始与特定的词
  • 第一个字后删除所有行。

我具有相对于下面的命令来上述要求

:%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

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

感谢

+1

您不能在':g'之后添加其他命令。 –

回答

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 

或v IA自定义映射:

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

我已经试过|但它没有奏效。

: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

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

但根据@ romainl的回答,将它们放入:function可能会更好。