Führen Sie einen Befehl mit einem Dateinamen aus dem vim-Puffer aus

0

Ich arbeite mit einigen DokuWiki -ähnliche Dateien. Die Dateien haben zugehörige PNG-Dateien im selben Verzeichnis. Sie werden in der folgenden Syntax referenziert:

{{ Dateiname .png}} 

Ich möchte ein Makro schreiben, das die nehmen würde Dateiname .png und idealerweise den Pfad der Datei, die bearbeitet wird, und übergeben Sie diese Parameter an xdg-open.

Am nächsten habe ich es bisher geschafft:

:'<,'>!sed s/\{\\\|\}//g|xargs xdg-open

Das ist grob, verwischt die aktuelle Zeile, erfordert, dass ich mich im Pfad der Datei befinde und verlangt, dass der visuelle Modus verwendet wird, um den Text hervorzuheben .... aber es funktioniert.

Ich habe Probleme, eine Dokumentation zu finden, mit der ich die aktuelle Zeile sicher nach dem Dateinamen durchsuchen und dann den Pfad der aktuellen Datei und den Zieldateinamen an übergeben kann xdg-open in der vim-Befehlszeile.

Wenn Sie fertig sind, kann ich das Makro idealerweise starten, um die eingebettete Datei anzuzeigen.


Nach der Antwort von G-Man und einigen Fummeln funktioniert das Folgende gut:

:.w !sed -e 's|.*{{|%{{|' -e 's|[^/]*{{||' -e 's/^/"/' -e 's/}}.*/"/' | xargs xdg-open

Dies fügt ein doppeltes Anführungszeichen ein ( " ) Zeichen am Anfang und Ende des Pfads / Dateinamens, unterstützt also Namen, die Leerzeichen enthalten, Apostrophe (einfache Anführungszeichen) und einige andere Sonderzeichen.

mgjk
quelle

Antworten:

1
  • :  Angebot !  Befehl 

    schreibt den Text aus dem Angebot zu einer Pipe (Löschen aus dem Dateipuffer), läuft die Befehl Liest die Standardausgabe des Befehls in der Pipe und fügt es in den Puffer ein, wo die Angebot war. Das ist das vim Funktion, die Sie verwenden. Diese Funktion ist sehr nützlich bei der sort Befehl. Ich kann mich nicht erinnern, jemals eine andere Situation gesehen zu haben wo dies vim Funktion ist nützlich; dies scheint nicht einer zu sein.

    Sie wollen

    :  Angebot   w!  Befehl 
    welche schreibt das Angebot zu einer Pipe (löscht sie jedoch nicht aus dem Dateipuffer), läuft die Befehl auf dem Rohr und lässt die Standardausgabe des Befehls (falls vorhanden) Gehen Sie einfach zum Bildschirm (d. h. vim Standardausgabe). (Der Raum zwischen dem Angebot und das w es ist optional.)
  • Das Angebot kann von einer Marke zur anderen sein ( '< und '> sind effektiv Marken), eine Zeile zu einer anderen oder nur eine einzelne Zeile. Solange Sie nur einen haben {{…}} auf einer Linie Sie können einfach zur Zeile gehen (Sie müssen sie nicht markieren) und verwenden . wie dein Bereich. Wenn Sie nur einen haben {{…}} in der Datei, Sie können verwenden /{{.*}}/ (oder auch /{{/, wenn das einzigartig ist) als Ihren Bereich. So wird dein Befehl
    :/{{/ w!  sed  bla bla bla 
  • Ich ziehe es vor, Strings zu zitieren, die zitiert werden müssen mit Anführungszeichen . anstatt sie mit einer Million Backslashes zu bewerfen. Ich denke, das ist nur eine persönliche Präferenz. Wenn Backslashes für Sie funktionieren, verwenden Sie sie.
  • Lust auf reguläre Ausdrücke (mit | nach einem Muster suchen haben ihren Platz in der Welt. Ich neige dazu, mehrere zu verwenden sed Befehle. Wieder was auch immer.
  • Meine Version von dem, was Sie jetzt tun, würde ungefähr so ​​aussehen:
    :/{{/ w!  sed -e 's /.*{{//' -e '/}}.*//' | xargs xdg-open 
    was entfernt die {{ und alles davor, und entfernt die }} und alles danach. Dies erfordert jedoch immer noch, dass Sie sich in dem Verzeichnis befinden, in dem sich die PNG-Datei befindet.
  • Die PNG-Datei befindet sich im selben Verzeichnis wie die Textdatei. Es ist nützlich zu beachten, dass wenn Sie einen Shell-Befehl mit ausführen ! von vim. ein nicht entkleideter % in der Befehlszeile wird durch den Namen der Datei ersetzt, die Sie gerade bearbeiten. (Versuchen Sie es: Tippen Sie ein :!echo abc%def.) Damit können wir den Pfadnamen ermitteln in das Verzeichnis, in dem sich die Dateien befinden. So können wir den obigen Befehl verbessern, um:

    :/{{/ w!  sed -es |. * {{|% {{| ' -es | [^ /] * {{|| ' -e 's |}}. * ||' | xargs xdg-open 
    Der erste sed-Unterbefehl, s|.*{{|%{{|. entfernt alles vor dem {{ und ersetzt es durch den Dateinamen, und verlässt die {{. Beachten Sie, dass dieser Unterbefehl Muss Verwenden Sie ein (nicht leeres) Trennzeichen Das wird nicht im Pfad / Dateinamen angezeigt /. Wenn Sie Verzeichnisnamen oder Dateinamen mit senkrechten Strichen haben, Wählen Sie einen anderen Charakter, der als Trennzeichen verwendet werden soll. Der zweite Unterbefehl, s|[^/]*{{||. entfernt die Dateiname-Teil des % Dateiname, Verlassen des Verzeichnisbereichs (falls vorhanden) und entfernt das Verzeichnis {{. Der dritte Unterbefehl s|}}.*||. ist das gleiche wie der zweite Unterbefehl ( s/}}.*// ) aus dem vorherigen Befehl; es entfernt das }} und alles danach.

    Während s/ Muster / Ersatz / Befehle müssen immer ein Trennzeichen verwenden, das nicht in dem pattern oder der replacement Text (oder entgehen Sie dem Trennzeichen, wenn es erscheint), Dies ist ein Problem nur für den ersten s Befehl. ich benutzte | in allen drei nur für Konsistenz.

TL; DR

Benutzen:

:/{{/w !sed -e 's|.*{{|%{{|' -e 's|[^/]*{{||' -e 's|}}.*||' | xargs xdg-open

P.S. Ich gehe davon aus, dass Sie erkennen, dass diese nicht funktionieren Wenn der Dateiname Leerzeichen enthält.

G-Man
quelle
Das ist auf so vielen Ebenen hilfreich. Für Ihre zusätzlichen Informationen habe ich es richtig funktioniert, mit Leerzeichen in Verzeichnispfaden und Dateinamen. Ich füge den neuen Befehl in einer Bearbeitung hinzu.
mgjk