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

如何扩展当前文件的完整路径以传递给Vim中的命令?,vim,Vim,当我进入命令模式并键入 :!mycommand % 我在当前文件上执行命令(%扩展为当前文件名)。 是否有类似的结构扩展完整文件名(使用完整路径) 我正在使用Windows。附加:p,例如 :!mycommand %:p 和%:p:h将为您提供文件所在目录的路径。:!mycommand%:p 相关的: :!cd%:p:h其他两个答案对我不起作用(出于某种原因)。但是,我发现在正常模式下键入时,此组合显示完整路径: 按1,然后按CtrlG 来源:Vim Tips Wiki上的“”。另请参见的{

当我进入命令模式并键入

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


我正在使用Windows。

附加
:p
,例如

:!mycommand %:p

%:p:h
将为您提供文件所在目录的路径。

:!mycommand%:p

相关的:


:!cd%:p:h

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

按1,然后按CtrlG


来源:Vim Tips Wiki上的“”。另请参见的
{count}CTRL-G
部分。

如果您想在
vimrc
中使用完整路径,可以使用如下内容:

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

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

获取当前文件的名称

将工作目录设置为当前文件

要打印当前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
注:

  • :帮助fnamemodify
  • “当前文件”:
    %:p
    (缓冲文件)/
    :p
    (脚本文件)
  • :消息
    打印最近的200条vim[错误]消息
参考资料


类似于和:!mycommand“%”如何在VIM help中找到它们?@keflavich
:help filename modifiers
要获取包含当前文件的目录,我认为%:h就足够了。为什么这里需要%:p:h?@HVNSweeting
:%p
是文件的绝对路径,而不是相对路径<代码>:%p%h是文件父目录的绝对路径。仅使用
%:h
可以产生一个相对路径。@HVNSweeting Shell:
cd~;vim.vimrc
,vim:
:!echo%:h
,相对路径应显示“.”。这是另一个主题。问题是在命令字符串中包含缓冲区路径(因此前导的
:!
)。您的
{count}CTRL-G
序列用于在UI中显示完整路径。@StefanMajewsky关于实际上将我带到这里的问题标题,这应该是选择的答案。
 "  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")