如何展开当前文件的完整路径以传递给 Vim 中的命令?

当我进入命令模式并键入

:!mycommand %

在当前文件上执行命令(将 %展开为当前文件名)。 是否有类似的结构来扩展完整文件名(使用完整路径) ?

我正在使用 Windows。

57078 次浏览

附加 :p,例如。

:!mycommand %:p

%:p:h会给出文件所在目录的路径。

:!mycommand %:p

相关阅读:

:!cd %:p:h

另外两个答案对我不起作用(出于某种原因)。但是,我发现这个组合在正常模式下输入时会显示完整路径:

1然后按 CtrlG

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

如果你想在你的 vimrc中使用完整路径,你可以这样做:

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

这将为您提供一个在 Windows 上带有反斜杠的路径。

获取当前文件的名称 Http://vim.wikia.com/wiki/get_the_name_of_the_current_file

设置 _ working _ directory _ to _ the _ current _ file Http://vim.wikia.com/wiki/set_working_directory_to_the_current_file

要打印出当前的 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)的绝对路径的任何符号链接,然后 execsource,包含在函数局部 vim 变量 l:vimrcfilename中的 fnameescape-ed 文件名:

 "  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")

备注:

参考文献