2013-01-02 11 views
8

ich eine Liste von Dateien habe ich in VIM mit diesem Befehl geöffnet haben:Mit VIM Befehl auf allen geöffneten Dateien

vim `cat list.txt` 

Ich suche auf alle geöffneten Dateien, diesen Befehl auszuführen:

:99,104 norm i# 

(von Linien 99-104, legen sie einen Kommentar „#“) < --Einfach arbeitet

Wenn ich den obigen Befehl ausführen es einzufügen arbeitet auf der aktuellen Datei wie erwartet. Wie bekomme ich VIM, um den gleichen Befehl für alle geöffneten Dateien auszuführen? Ich versuchte :argdo, :windo, :bufdo, aber hatte kein Glück.

Irgendwelche Vorschläge?

Antwort

11

Ich denke, bufdo funktionieren würde, wenn Sie set hidden haben (damit bufdo Puffer zu ändern, ohne zu speichern), bevor:

:set hidden 
:bufdo 99,104 norm i# 

Dann alle Dateien mit :bufdo! w oder :wa speichern.

(Anmerkung: set hidden könnte auch mit set autowrite ersetzt werden.)

+0

Danke, vermisste ich die „: Set versteckt“. Prost. –

3

Ich denke, sed wäre eine bessere Option sein, wenn Sie es verwenden können. sed ist ein Befehlszeileneditor und kein interaktiver Editor wie vim.

sed -i '99,104s/^/#/' list of files 
+1

'sed' ist ein _stream_editor. Wenn Sie einen (echten) _text_editor haben möchten, der von einem Skript oder der Befehlszeile gesteuert werden kann, gibt es 'ed' und' ex'. –

1

Weil Sie alle Dateien als Argumente geliefert haben, ist :argdo der richtige Befehl. (Es sei denn, Sie öffnen andere Dateien, :bufdo würde auch funktionieren.) Wenn Sie nicht wollen :set hidden (wie in der anderen Antwort angezeigt), müssen Sie sofort den Puffer über :update persistent. Da Sie einen :normal Befehl verwenden, müssen Sie es in :execute beilegen zu können, eine anderen Ex-Befehl verketten:

:argdo 99,104 execute 'norm i#' | update