Wie führe ich eine Python-Anweisung für jede Zeile aus?

10

Ich habe den folgenden Beispielcode, der die aktuelle Zeile mithilfe der Python-Anweisung ändert:

:py import vim; vim.current.line="["+vim.current.line+"]"

Wie kann ich diese Anweisung für jede Zeile in der aktuellen Datei ausführen?

Verwandte: Wie können Sie Python in Vim verwenden? beim Stapelüberlauf

Kenorb
quelle

Antworten:

10

Sie können den pydoseit Vim 7.4 verfügbaren Befehl verwenden. Das Handbuch beschreibt, wie es besser funktioniert als ich:

: [range] pydo {body}

Führen Sie die Python-Funktion "def _vim_pydo (line, linenr): {body}" für jede Zeile im [Bereich] aus, wobei die Funktionsargumente nacheinander ohne nachfolgendes <EOL> und den aktuellen auf den Text jeder Zeile gesetzt werden Zeilennummer. Die Funktion sollte einen String oder None zurückgeben. Wenn eine Zeichenfolge zurückgegeben wird, wird sie in der aktuellen Runde zum Text der Zeile. Der Standardwert für [Bereich] ist die gesamte Datei: "1, $".

Für Ihr Beispiel können Sie einen Befehl wie den folgenden verwenden:

:python import vim
:pydo vim.current.buffer[linenr - 1] = '[%s]' % line

Das linenr - 1Bit ist da, weil die Zeilen in vim.current.buffer0 indiziert sind, aber Vim beginnt, die Zeilen von 1 zu zählen.

Das Schöne ist, dass Sie einfach einen benutzerdefinierten Befehl definieren können, um Ihren Python-Code in einer Reihe von Zeilen auszuführen:

command! -range=% BracketLines 
    \ <line1>,<line2>pydo vim.current.buffer[linenr - 1] = '[%s]' % line
toro2k
quelle
1
Es ist seit Version 7.4 verfügbar.
Kenorb
7

Sie können den aktuellen Puffer mit vim.current.bufferabrufen, der iterierbar ist. Sie können eine forSchleife verwenden, um jede Zeile abzurufen.

Sie können die Zeilen ändern, indem Sie sie zuweisen. Wenn wir das zusammenstellen, erhalten wir:

:py from vim import *
:py for i, line in enumerate(current.buffer): current.buffer[i] = '[%s]' % line

Siehe auch :help python-buffer.

Martin Tournoij
quelle