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


Réponses:


161

:!mycommand %:p

En relation:

:!cd %:p:h


23
Comment les trouvez-vous dans l'aide VIM?
keflavich

57
@keflavich:help filename-modifiers
Annika Backstrom

pour obtenir le répertoire qui contient le fichier courant, je pense que%: h suffit. Pourquoi avoir besoin de%: p: h ici?
HVNSweeting

1
@HVNSweeting :%pest le chemin absolu du fichier, plutôt que le chemin relatif. :%p%hest le chemin absolu vers le répertoire parent du fichier. L'utilisation de just %:hpeut donner un chemin relatif.
Annika Backstrom

2
@HVNSweeting Shell:, cd ~ ; vim .vimrcVim :, :!echo %:hdevrait afficher "." pour le chemin relatif.
Annika Backstrom

65

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:

Appuyez sur 1puisCtrlG

Source: « Obtenir le nom du fichier actuel » sur le Wiki Vim Tips. Voir également la {count}CTRL-Gsection sur :help CTRL-G.


5
C'est un sujet différent. La question est d'inclure le chemin du tampon dans une chaîne de commande (donc le début :!). Votre {count}CTRL-Gséquence est pour afficher le chemin complet dans l'interface utilisateur.
Stefan Majewsky

3
@StefanMajewsky concernant le titre de la question qui m'a en fait amené ici, cela devrait être la réponse choisie.
doc_id

29

Ajouter :p, par exemple

:!mycommand %:p

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


9

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()tous les liens symboliques vers le chemin absolu vers le script actuel <sfile>:p(au lieu de %:p), puis execvers sourcele fnameescapenom de fichier -ed contenu dans une variable vim locale de la fonction 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:

Références



0

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.