Ich versuche, einen Befehl zu erstellen, der die aktuelle Zeile in eine neue Registerkarte kopiert, sie dann bei Punkt (.) unterbricht, dann eine leere Zeile darunter (am Ende des Textes) hinzufügt und schließlich zum Anfang des Textes geht (erste Linie). Ich verwende folgenden Code:

command Lnew y | tabnew | pu | s/\. /\r\r/g | noh | o | 1G 

Es funktioniert bis zum noh Teil, aber die Teile o und 1G funktionieren nicht. Wo ist das Problem?

vim
0
rnso 24 Juni 2018 im 05:33

3 Antworten

Beste Antwort

Ihr Befehl ist eine Mischung aus Ex-Befehlen und Befehlen im normalen Modus. Sie haben zwei Möglichkeiten:

  • Verwenden Sie nur Ex-Befehle

    y | tabnew | put | s/\. /\r\r/g | nohlsearch | put='' | 1
    
  • Stellen Sie Ihren normalen Modusbefehlen :help :normal voran

    y | tabnew | put | s/\. /\r\r/g | nohlsearch | normal! o^O1G
    

    Verwenden Sie <C-v><C-o>, um das Literal ^O einzufügen.

3
romainl 24 Juni 2018 im 09:37

Eine mögliche Verfeinerung:

command! Lnew y | tabnew | pu  | -d | s/\. /\r/g | noh | pu=''  | 1

Der Befehl Ex 'put' fügt eine neue Zeile über der kopierten Zeile hinzu. Durch Hinzufügen des Befehls '-d' wird dies behoben.

Beim Lesen fragt die Frage nach dem Teilen bei Punkt und dem Hinzufügen einer Leerzeile am Ende des Textes. Es scheint, dass nur ein '\ r' im Ersatzbefehl benötigt wird.

2
rgt47 25 Juni 2018 im 15:15

In Ihrem Befehl Suchen und Ersetzen müssen Sie auch Leerzeichen überspringen, anstatt:

s/\. /\r\r/g

Sie müssten verwenden:

s/\.\ /\r\r/g

Ich hatte in meinen frühen Tagen von Vim einige Zeit damit zu kämpfen. Hoffe das hilft.

1
Kourosh Taheri-Golvarzi 24 Juni 2018 im 15:27