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

ske*_*ept 121 vim

当我进入命令模式并键入

:!mycommand %
Run Code Online (Sandbox Code Playgroud)

我在当前文件上执行了我的命令(%扩展为当前文件名).是否有类似的构造扩展完整文件名(使用完整路径)?

我正在使用Windows.

Ann*_*rom 158

:!mycommand %:p

有关:

:!cd %:p:h

  • @keflavich`:help filename-modifiers` (55认同)
  • 你如何在VIM帮助中找到这些? (22认同)
  • @HVNSweeting Shell:`cd~; vim .vimrc`,Vim:`:!echo%:h`,应显示'.' 对于相对路径. (2认同)

Umb*_*ule 64

其他两个答案对我不起作用(出于某种原因).但是,我发现此组合在正常模式下键入时显示完整路径:

1然后按CtrlG

来源:Vim Tips Wiki上的" 获取当前文件的名称 ".参见{count}CTRL-G:help CTRL-G.

  • 那是一个不同的话题.问题是将缓冲路径包含在命令字符串中(因此是前导的`:!`).您的`{count} CTRL-G`序列用于在UI中显示完整路径. (5认同)
  • @StefanMajewsky关于问题标题实际上把我带到了这里,这应该是选择的答案. (2认同)

mar*_*ton 29

附加:p,例如

:!mycommand %:p
Run Code Online (Sandbox Code Playgroud)

而且%:p:h会给你该文件所在目录的路径.


Wes*_*ner 9

要打印出当前的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
Run Code Online (Sandbox Code Playgroud)

例如(使用vim函数),to resolve()expand()任何符号链接到当前脚本的绝对路径<sfile>:p(而不是%:p),然后exec到函数本地vim变量中包含sourcefnameescape-ed文件名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")
Run Code Online (Sandbox Code Playgroud)

笔记:

参考