Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[vi] externen Editor aufrufen

2 views
Skip to first unread message

Christian Garbs

unread,
Mar 11, 2022, 2:12:17 PM3/11/22
to
Mahlzeit!

Ich bin normalerweise Emacs-Nutzer, mache aber aus verschiedenen
Gründen immer mehr "kleinere Sachen" im vi. Das ist vom Niveau her
noch so "suchen, Zeile löschen, Wörter ändern".

Ich überlege jetzt, EDITOR=vi zu setzen, um mal mehr zu üben.

Wenn ich dann aber beim Bearbeiten einer Datei bemerke, dass die
Änderungen doch umfangreicher werden und ich jetzt gerne den Emacs
hätte, kann ich dann on-the-fly Emacs aus dem vi aufrufen?

Also konkret:

Ich bearbeite ein Datei im vi und möchte per Kommando/Makro/Tastendruck
die Datei, die ich gerade offen habe, im Emacs weiterbearbeiten. Nach
dem Beenden von Emacs möchte ich dann wieder im vi sein und dort die
Änderungen, die ich im Emacs gemacht habe, vorfinden.

Dass die aktuelle Datei zwischendurch 2x gespeichert werden muss, ist
mir bewusst und das soll auch gerne so sein.

Kann man eine vi-Session an Emacs eskalieren? ;-)

Ich vermute ganz stark, dass das möglich ist, allein fehlt mir das "wie?".
Googeln nach "vi edit file in external editor" und ähnlichem war
bisher nicht erfolgreich.

Danke und Gruß
Christian
--
....Christian.Garbs....................................https://www.cgarbs.de
Biochemists wear designer genes

Frank Beythien

unread,
Mar 11, 2022, 2:49:30 PM3/11/22
to
Am 11.03.22 um 20:12 schrieb Christian Garbs:
ich nehme mal gedit, emacs verwende ich nicht.

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:

W11: Achtung: Datei "ab.sh" wurde verändert, seit mit dem Editieren
angefangen wurde
Siehe ":help W11" für mehr Information.
[O]K, (L)oad File, Load File (a)nd Options:
Betätigen Sie die EINGABETASTE oder geben Sie einen Befehl ein

MfG
Frank

Christian Garbs

unread,
Mar 11, 2022, 3:16:52 PM3/11/22
to
Mahlzeit!

Frank Beythien <nospa...@efbe.prima.de> wrote:
> Am 11.03.22 um 20:12 schrieb Christian Garbs:

>> Ich bearbeite ein Datei im vi und möchte per Kommando/Makro/Tastendruck
>> die Datei, die ich gerade offen habe, im Emacs weiterbearbeiten. Nach
>> dem Beenden von Emacs möchte ich dann wieder im vi sein und dort die
>> Änderungen, die ich im Emacs gemacht habe, vorfinden.
>>
>> Dass die aktuelle Datei zwischendurch 2x gespeichert werden muss, ist
>> mir bewusst und das soll auch gerne so sein.
>>
>> Kann man eine vi-Session an Emacs eskalieren? ;-)

> ich nehme mal gedit, emacs verwende ich nicht.
>
> 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
- % kann dann nur noch der aktuelle Dateiname sein

Das kann ich mir dann hoffentlich sogar merken :)

Großartig, danke!
Christian
--
....Christian.Garbs....................................https://www.cgarbs.de
Auch ein blinder Trinker findet mal 'n Korn.

Christian Weisgerber

unread,
Mar 11, 2022, 5:30:06 PM3/11/22
to
On 2022-03-11, Christian Garbs <mi...@cgarbs.de> wrote:

> Ich bearbeite ein Datei im vi und möchte per Kommando/Makro/Tastendruck
> die Datei, die ich gerade offen habe, im Emacs weiterbearbeiten. Nach
> dem Beenden von Emacs möchte ich dann wieder im vi sein und dort die
> Änderungen, die ich im Emacs gemacht habe, vorfinden.

Grundsätzlich kann man in vi(1) Textabschnitte mit '!' durch einen
externen Filter drehen. Da Emacs wahrscheinlich aber nicht die zu
editierende Datei von stdin lesen und nach stdout schreiben mag,
passt das nicht.

Man kann mit ':' in den ex(1)-Modus gehen und dort einfach mit
!<cmd> einen beliebigen Befehl über eine Shell absetzen, z.B. auch
"emacs datei". Nach Beenden kann man dann mit 'e' die geänderte
Datei wieder einlesen und weiterbearbeiten. Nachteil ist, dann man
den Dateinamen explizit angeben muss.

--
Christian "naddy" Weisgerber na...@mips.inka.de

Friedhelm Waitzmann

unread,
Mar 25, 2022, 7:00:32 PM3/25/22
to
[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
0 new messages