Wie kann ich den vollständigen Pfad der aktuellen Datei erweitern, um ihn an einen Befehl in Vim zu übergeben?

123

Wenn ich in den Befehlsmodus gehe und tippe

:!mycommand %

Ich lasse meinen Befehl für die aktuelle Datei ausführen ( %wird auf den aktuellen Dateinamen erweitert). Gibt es ein ähnliches Konstrukt, das den vollständigen Dateinamen (mit dem vollständigen Pfad) erweitert?

Ich benutze Windows.

skeept
quelle
:! mycommand "%"
SdidS

Antworten:

161

:!mycommand %:p

Verbunden:

:!cd %:p:h

Annika Backstrom
quelle
23
Wie finden Sie diese in der VIM-Hilfe?
Keflavich
57
@keflavich:help filename-modifiers
Annika Backstrom
Um ein Verzeichnis zu erhalten, das die aktuelle Datei enthält, denke ich, dass%: h ausreicht. Warum brauchen Sie hier%: p: h?
HVNSweeting
1
@HVNSweeting :%pist der absolute Pfad zur Datei und nicht der relative Pfad. :%p%hist der absolute Pfad zum übergeordneten Verzeichnis der Datei. Die Verwendung von just %:hkann zu einem relativen Pfad führen.
Annika Backstrom
2
@HVNSweeting Shell : cd ~ ; vim .vimrc, Vim : :!echo %:h, sollte '.' Anzeigen. für den relativen Pfad.
Annika Backstrom
65

Die beiden anderen Antworten haben bei mir nicht funktioniert (aus irgendeinem Grund). Ich habe jedoch festgestellt, dass diese Kombination den vollständigen Pfad anzeigt, wenn sie im normalen Modus eingegeben wird:

Drücken Sie 1dannCtrlG

Quelle: " Holen Sie sich den Namen der aktuellen Datei " im Vim Tips Wiki. Siehe auch den {count}CTRL-GAbschnitt von :help CTRL-G.

Umber Ferrule
quelle
5
Das ist ein anderes Thema. Die Frage betrifft das Einfügen des Pufferpfads in eine Befehlszeichenfolge (also die führende :!). Ihre {count}CTRL-GSequenz dient zur Anzeige des vollständigen Pfads in der Benutzeroberfläche.
Stefan Majewsky
3
@StefanMajewsky bezüglich des Fragentitels, der mich tatsächlich hierher gebracht hat, sollte dies die gewählte Antwort sein.
doc_id
29

Anhängen :p, z

:!mycommand %:p

Und %:p:hgibt Ihnen den Pfad des Verzeichnisses an, in dem sich die Datei befindet.

Martin Clayton
quelle
9

So drucken Sie den aktuellen vim-Dateinamen aus:

:help expand
:echo expand("%:p")    " absolute path
:echo expand("%:p:h")  " absolute path dirname
:echo expand("%:p:h:h")" absolute path dirname dirname
:echo expand("%:.")    " relative path
:echo expand("%:.:h")  " relative path dirname
:echo expand("%:.:h:h")" relative path dirname dirname

:echo expand("<sfile>:p")  " absolute path to [this] vimscript

:help filename-modifiers

Zum Beispiel (mit Vim - Funktion), um resolve()und expand()jegliche symbolischen Links auf den absoluten Pfad zum aktuellen Skript <sfile>:p(statt %:p), und dann execzu sourcedem fnameescape-ED Dateinamen , die in einem funktions lokalen Vim variable l:vimrcfilename:

 "  g:__sfile__dirname     -- directory containing this vimrc script
 "                            after symlinks
 "                            ~dirname(abspath(realpath(__file__)))
 let g:__sfile__dirname=fnamemodify(resolve(expand("<sfile>:p")), ":h")

 "  Source_dotvim(filename)  -- source dirname(this_vimrc)/filename
 function Source_dotvim(filename)
     let l:vimrcfilename=g:__sfile__dirname . "/" . a:filename
     if filereadable(l:vimrcfilename) && !empty(l:vimrcfilename)
         "source s:vimrcfilename "this doesn't work, so exec:
         exec "source " . fnameescape(l:vimrcfilename)
     else
         echo l:vimrcfilename . " empty or not found."
     endif
 endfunction 

 call Source_dotvim("vimrc.local.01-env.vimrc")

Anmerkungen:

Verweise

Wes Turner
quelle
0

Wenn Sie den vollständigen Pfad in Ihrem verwenden möchten vimrc, können Sie Folgendes verwenden:

let vimFiles = '$HOME/.vim'
let absPath  = expand(vimFiles . '/subDir')

Dadurch erhalten Sie einen Pfad mit Backslashes unter Windows.

Matthias Braun
quelle