如何扩展当前文件的完整path以传递给Vim中的命令?

当我去命令模式和types

:!mycommand % 

我得到我的命令执行当前文件( %扩展到当前的文件名)。 是否有一个类似的构造,扩展完整的文件名(完整的path)?

我正在使用Windows。

:!mycommand %:p

有关:

:!cd %:p:h

另外两个答案不适合我(出于某种原因)。 但是,我发现这个组合显示正常模式下input的完整path:

1,然后按Ctrl G

来源:Vim Tips Wiki上的“ 获取当前文件的名称 ”。 另请参阅:help CTRL-G{count}CTRL-G部分。

追加:p ,例如

 :!mycommand %:p 

%:p:h会给你文件所在目录的path。

要打印出当前的vim文件名:

 :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 

例如(使用vim函数),将任何符号链接resolve()expand()到当前脚本<sfile>:p (而不是%:p )的绝对path,然后exec以获取fnameescape -ed文件名包含在一个函数本地vimvariablesl: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") 

笔记:

  • :help fnamemodify
  • “当前文件”: %:p (缓冲文件)/ <sfile>:p (脚本文件)
  • expand('<sfile>')不能在一个函数内工作
  • l:varname不起作用; 所以, exec – string连接 – 和fnameescape
  • :messages打印最近200 vim [error,]消息

参考

  • annika-backstrom的回答
  • umber-ferrule的回答
  • tito-11的答案

如果你想使用你的vimrc的完整path,你可以使用这样的东西:

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

这会给你一个在Windows上反斜杠的path。