如何扩展当前文件的完整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的答案
获取当前文件的名称http://vim.wikia.com/wiki/Get_the_name_of_the_current_file
Set_working_directory_to_the_current_file http://vim.wikia.com/wiki/Set_working_directory_to_the_current_file
如果你想使用你的vimrc
的完整path,你可以使用这样的东西:
let vimFiles = '$HOME/.vim' let absPath = expand(vimFiles . '/subDir')
这会给你一个在Windows上反斜杠的path。