Come posso espandere il percorso completo del file corrente per passare a un comando in Vim?


Risposte:


161

:!mycommand %:p

Relazionato:

:!cd %:p:h


23
Come li trovi nell'aiuto VIM?
keflavich

57
@keflavich:help filename-modifiers
Annika Backstrom

per ottenere la directory che contiene il file corrente, penso che%: h sia sufficiente. Perché è necessario%: p: h qui?
HVNSweeting

1
@HVNSweeting :%pè il percorso assoluto del file, piuttosto che il percorso relativo. :%p%hè il percorso assoluto della directory principale del file. Utilizzando just %:hpuò risultare in un percorso relativo.
Annika Backstrom

2
@ HVNSweeting Shell:, cd ~ ; vim .vimrcVim :, :!echo %:hdovrebbe visualizzare '.' per il percorso relativo.
Annika Backstrom

65

Le altre due risposte non hanno funzionato per me (per qualche motivo). Tuttavia, ho scoperto che questa combinazione mostra il percorso completo quando viene digitato in modalità Normale:

1Quindi premereCtrlG

Fonte: " Ottieni il nome del file corrente " su Vim Tips Wiki. Vedi anche la {count}CTRL-Gsezione di :help CTRL-G.


5
Questo è un argomento diverso. La domanda riguarda l'inclusione del percorso del buffer in una stringa di comando (quindi la prima :!). La {count}CTRL-Gsequenza è per visualizzare il percorso completo nell'interfaccia utente.
Stefan Majewsky

3
@StefanMajewsky riguardo al titolo della domanda che in effetti mi ha portato qui, questa dovrebbe essere la risposta scelta.
doc_id

29

Aggiungi :p, ad es

:!mycommand %:p

E %:p:hti darà il percorso della directory in cui risiede il file.


9

Per stampare il nome del file vim corrente:

: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

Ad esempio (con funzione vim), per resolve()e expand()eventuali collegamenti simbolici al percorso assoluto allo script corrente <sfile>:p(anziché %:p), e poi execper sourceil fnameescapenome del file -ed contenuta in una variabile vim funzione locale 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")

Appunti:

Riferimenti



0

Se vuoi usare il percorso completo nel tuo vimrc, puoi usare qualcosa del genere:

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

Questo ti darà un percorso con i backslash su Windows.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.