web-dev-qa-db-fra.com

Comment puis-je développer le chemin complet du fichier actuel pour passer à une commande dans Vim?

Quand je passe en mode commande et tape

:!mycommand %

Je fais exécuter ma commande sur le fichier courant (% est étendu au nom de fichier actuel). Existe-t-il une construction similaire qui développe le nom de fichier complet (avec le chemin d'accès complet)?

J'utilise Windows.

120
skeept

:!mycommand %:p

En relation:

:!cd %:p:h

157
Annika Backstrom

Les deux autres réponses n'ont pas fonctionné pour moi (pour une raison quelconque). Cependant, j'ai trouvé que ce combo affiche le chemin complet lorsqu'il est tapé en mode Normal:

Presse 1 puis CtrlG

Source: " Obtenez le nom du fichier actuel " sur le wiki Vim Tips. Voir aussi le {count}CTRL-G section de :help CTRL-G .

64
Umber Ferrule

Ajouter :p, par exemple.

:!mycommand %:p

Et %:p:h vous donnera le chemin du répertoire dans lequel réside le fichier.

29
martin clayton

Pour imprimer le nom de fichier vim actuel:

: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

Par exemple (avec une fonction vim), vers resolve() et expand() tout lien symbolique vers le chemin absolu du script actuel <sfile>:p (Au lieu de %:p ), puis exec à source le nom de fichier fnameescape- contenu dans une variable de fonction locale vim 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")

Remarques:

Les références

9
Wes Turner
2
Tarek Saied

Si vous souhaitez utiliser le chemin complet dans votre vimrc, vous pouvez utiliser quelque chose comme ceci:

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

Cela vous donnera un chemin avec des barres obliques inverses sous Windows.

0
Matthias Braun