如何在Vim中扩展完整路径以将其传递给命令?

134

当我进入命令模式并输入

:!mycommand %

我在当前文件上执行命令(%会被扩展为当前文件名)。 是否有类似的结构可以扩展完整的文件名(包括完整路径)?

我使用的是Windows。


类似于https://dev59.com/LnRB5IYBdhLWcg3wCjgV和https://dev59.com/0XNA5IYBdhLWcg3wjOlS。 - Nathan Hartley
:!mycommand "%" - SddS
6个回答

174

:!mycommand %:p

Related:

:!cd %:p:h


26
在Vim帮助文档中如何查找这些内容? - keflavich
62
@keflavich :help filename-modifiers - Annika Backstrom
1
@HVNSweeting :%p 是文件的绝对路径,而不是相对路径。:%p%h 是文件所在目录的绝对路径。仅使用 %:h 可能会得到一个相对路径。 - Annika Backstrom
2
@HVNSweeting Shell: cd ~ ; vim .vimrc,Vim::!echo%:h,应该显示相对路径的“。”。 - Annika Backstrom
还有一个 %:.,它返回相对于当前目录的文件路径 - 通常比绝对路径更方便。 - jobwat
显示剩余3条评论

66

其他两个答案对我没有用(原因不明)。但是我发现这个组合在正常模式下输入时会显示完整路径:

按下1,然后再按CtrlG

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


5
这是一个不同的话题。问题是关于在命令字符串中包含缓冲路径(因此前面有 :!)。你的 {count}CTRL-G 序列用于在用户界面中显示完整路径。 - Stefan Majewsky
3
@StefanMajewsky,关于这个问题标题,实际上正是我来到这里的原因,这应该是被选中的答案。 - doc_id

29

添加:p,例如:

:!mycommand %:p

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


21

打印当前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),然后exec执行fnameescape处理过的文件名,该文件名包含在一个函数局部的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")

注:

参考资料



0

如果你想在你的 vimrc 中使用完整路径,你可以使用类似以下的代码:

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接