: Bereich ! Befehl
schreibt den Text aus dem Bereich in eine Pipe (löscht ihn aus dem Dateipuffer), führt den Befehl in der Pipe aus, liest die Standardausgabe des Befehls und fügt ihn in den Puffer ein, in dem sich der Bereich befand. Das ist die
vim
Funktion, die Sie verwenden. Diese Funktion ist mit demsort
Befehl sehr nützlich . Ich kann mich nicht erinnern, jemals eine andere Situation gesehen zu haben, in der diesevim
Funktion nützlich ist. das scheint keine zu sein.Sie wollen
: Bereich w! Befehl
die schreibt den Bereich an ein Rohr (aber nicht löscht er nicht aus dem Dateipuffer), führt das Kommando auf dem Rohr, und lässt die Standardausgabe des Befehls (falls vorhanden), gehen Sie einfach auf den Bildschirm (dhvim
‚s Standard Ausgabe). (Der Abstand zwischen dem Bereich und demw
ist optional.)- Der Bereich kann von einer Marke zur anderen reichen (
'<
und'>
ist tatsächlich eine Marke ), eine Zeile zur anderen oder nur eine einzelne Zeile. Solange Sie nur{{…}}
eine Zeile haben, können Sie einfach zur Zeile gehen (Sie müssen sie nicht hervorheben) und.
als Bereich verwenden. Wenn Sie nur eine{{…}}
Datei in der Datei haben, können Sie sie als Bereich verwenden/{{.*}}/
(oder sogar/{{/
, wenn dies eindeutig ist). So wird dein Befehl: / {{/ w! sed bla bla bla
- Ich ziehe es vor, Strings zu zitieren, die Zitate mit Zitaten benötigen, anstatt einen Millionen Backslashes auf sie zu werfen. Ich denke, das ist nur eine persönliche Präferenz. Wenn Backslashes für Sie funktionieren, verwenden Sie sie.
- Ausgefallene reguläre Ausdrücke (mit denen
|
nach dem einen oder anderen Muster gesucht wird) haben ihren Platz in der Welt. Ich neige dazu, mehreresed
Befehle zu verwenden. 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 das{{
und alles davor entfernt}}
und das und alles danach entfernt. 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. Wenn Sie einen Shell-Befehl mit
!
fromvim
ausführen, wird ein nicht verdeckter%
Befehl in der Befehlszeile durch den Namen der gerade bearbeiteten Datei ersetzt. (Versuchen Sie es: type:!echo abc%def
.) Wir können dies verwenden, um den Pfadnamen zu dem Verzeichnis zu bestimmen, 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 ihn durch den Dateinamen und verlässt den{{
. Beachten Sie, dass dieser subcommand muss verwenden, um ein (nicht leere) Trennzeichen, das nicht in dem Pfad / Dateinamen erscheint, so können wir nicht verwenden/
. Wenn Sie Verzeichnisnamen oder Dateinamen mit vertikalen Strichen haben, wählen Sie ein anderes Zeichen, das Sie als Trennzeichen verwenden möchten. Der zweite Unterbefehls|[^/]*{{||
entfernt den Dateinamen-Teil des%
Dateinamens, lässt den Verzeichnis-Teil (falls vorhanden) und entfernt den{{
. Der dritte Unterbefehl entsprichts|}}.*||
dem zweiten Unterbefehl (s/}}.*//
) des vorherigen Befehls. es entfernt das}}
und alles danach.Während Befehle müssen immer ein Trennzeichen verwenden, die nicht in dem angezeigt wird oder den Text (oder das Trennzeichen zu entkommen, wenn es angezeigt wird), ist dies ein Problem nur für den ersten Befehl. Ich habe in allen drei nur für Konsistenz verwendet.
s/pattern/replacement/
pattern
replacement
s
|
TL; DR
Benutzen:
: / {{/ w! sed -es |. * {{|% {{| ' -es '[^ /] * {{||' -e 's |}}. * ||' | xargs xdg-open
PS Ich gehe davon aus, dass Sie feststellen, dass diese nicht funktionieren, wenn der Dateiname Leerzeichen enthält.