2017-05-24 7 views
1

ich die folgenden Dinge in vi erreichen will:Vi mehr Befehle in einer Zeile

  • entfernen erste paar Spalten
  • Linien entfernen mit spezifischen Worten
  • alles nach dem ersten Wort entfernen.

Ich habe den folgenden Befehl in Bezug auf obigen Anforderungen

:%s/new page //g ersten beiden Spalten zu entfernen.
:g/abc/d, :g/xyz/d, :g/ddd/d, um Zeilen zu entfernen, die mit bestimmten Wörtern beginnen.
:%s/ .*//g alles nach dem ersten Wort zu entfernen.

Insgesamt möchte ich die folgenden Befehle auszuführen:

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

Wie kann ich alle oben genannten Befehle in einem einzigen Befehl auszuführen.

Ich habe versucht |, aber es hat nicht funktioniert.

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

Ich erhalte die folgende Fehlermeldung:

E147: Cannot do :global recursive

Wie kann ich das erreichen. Ich möchte alle Befehle in einem einzigen Befehl ausführen.

Dank

+1

Sie können nach einem ': g' keine weiteren Befehle hinzufügen. –

Antwort

4

Sie alle diese Befehle in Funktion setzen können: entweder es

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

und rufen Sie direkt an:

:call AllMyCommands() 

oder über einen benutzerdefinierten Befehl:

command! Foo call AllMyCommands() 
:Foo 

oder v ia eine benutzerdefinierte Zuordnung:

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

ich versucht habe | aber es hat nicht funktioniert.

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

Im Allgemeinen können Befehle nacheinander getrennt ausgeführt werden, indem |, aber es gibt Ausnahmen, wie :help :bar sagt:

These commands see the '|' as their argument, and can therefore not be 
followed by another Vim command: 
[...] 
:global 
[...] 

Als Abhilfe können Sie sie wickeln in :execute:

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

Aber es ist wahrscheinlich besser, sie in eine :function, wie per @ romainls Antwort, zu setzen.

Verwandte Themen