[Innerhalb von vim ein Programm (gedit im Beispiel) starten und
ihm als Parameter die aktuell in vim editierte Datei übergeben]
Christian Garbs:
>Mahlzeit!
>Frank Beythien <
nospa...@efbe.prima.de> wrote:
>> vim ab.sh
>> :w | !gedit %
>> also in Vim Datei sichern und externen Editor aufrufen.
>> Nach ändern und speichern fragt vim was mit der Datei passieren soll:
>Zu meinem eigenen Erschrecken muss ich sagen "das ist ja vollkommen
>logisch, das liest sich wie ein Buch":
> - ! kenne ich von meinen Vertippern bei :q!
> - | ist ne Pipe, ganz klar
Was soll hier ein Pipe? Das »|« ist nur dazu da, den zweiten
Ex‐Modus‐Befehl »!« vom ersten (»w«) abzutrennen. Du könntest
also statt dessen in zwei Zeilen eingeben:
:w
:! gedit %
Dagegen würde
:w ! gedit %
– also ohne das trennende »|« – bedeuten, den aktuellen
Pufferinhalt in eine temporäre Datei zu schreiben und dem
externen Programm gedit beim Start als Standardeingabe einen
geöffneten Kanal auf diese temporäre Datei mitzugeben.
Probiere mal
:w ! dir -l /dev/fd/.
und
:w ! less
In einem Linux ist /dev/fd ein Symbolic Link, das auf
/proc/self/fd zeigt. Dieses Verzeichnis liegt im
Pseudodateisystem /proc und enthält zu jedem offenen
Filedescriptor des Prozesses, der dieses Verzeichnis liest, ein
symbolic Link, das auf die Datei verweist, auf die das
jeweilige Filedescriptor Zugriff bietet.
> - % kann dann nur noch der aktuelle Dateiname sein
Ja, das soll es, aber es funktioniert nicht wirklich. Versuche
mal, eine Datei, deren Namen eine Leerstelle enthält, zu
verwenden:
Innerhalb von vim:
:edit mit\ Leerstelle
Innerhalb von vim die Datei abspeichern:
:w
Aufruf des Programms »dir« zeigt, dass die Datei vorhanden ist:
:! dir -Q
Aber, den Dateinamen an »dir« zu übergeben, schlägt leider fehl:
:! dir -Q -- %
Und zwar deshalb, weil der Dateiname an der Leerstelle zerbricht.
Um das zu reparieren, müsste vim wissen, wie er die Kommandozeile
für das mit »!« gestartete Shell zusammenstellen muss, damit
Zeichenketten (hier: der Dateiname) nicht an Leerstellen und
anderen, vom Shell speziell interpretierten Zeichen zerbrechen.
Das allerdings ist nicht für alle Shells gleich. Neben der
Möglichkeit, zu konfigurieren, welches Shell gestartet werden
soll (anzeigen mit »:set shell?«) bräuchte vim eine Möglichkeit,
eine Funktion quote_a_string_for_the_shell zu konfigurieren, die
dann z.B. für das POSIX‐Shell und die Zeichenkette
»mit Leerstelle« die Zeichenkette »'mit Leerstelle'« liefert.
Was bei einer Datei mit dem ulkigen Namen »;rm -r .« passieren
würde (ja, das ist ein möglicher Dateiname!), will ich gar nicht
ausprobieren.
Friedhelm