在Vim中获取相对路径
假设我正在运行Vim和pwd返回在Vim中获取相对路径,vim,relative-path,Vim,Relative Path,假设我正在运行Vim和pwd返回 /home/rafid/myproject 说我正在编辑这个文件 /home/rafid/myproject/website/editpage.php 有没有命令可以帮我返回这个 website/editpage.php 即文件相对于当前文件夹的路径。是的,您可以使用 :args 这将为您提供当前文件的文件名,以供参考。这适用于我: :echo expand("%") 另一个选项是编写vim函数。以下是我谦虚的尝试: function! Relpath(
/home/rafid/myproject
说我正在编辑这个文件
/home/rafid/myproject/website/editpage.php
有没有命令可以帮我返回这个
website/editpage.php
即文件相对于当前文件夹的路径。是的,您可以使用
:args
这将为您提供当前文件的文件名,以供参考。这适用于我:
:echo expand("%")
另一个选项是编写vim函数。以下是我谦虚的尝试:
function! Relpath(filename)
let cwd = getcwd()
let s = substitute(a:filename, l:cwd . "/" , "", "")
return s
endfunction
使用任何完整路径名调用Relpath,它将从其参数中删除当前目录名
例如,尝试
:echo Relpath(展开(“%:p”)
(:p
修饰符要求Vim返回完整路径)。显然,这在您的情况下是不必要的,因为%
本身返回相对路径。但是,在其他情况下,它可能会派上用场。如果使用autocmd始终设置正在处理的缓冲区的当前目录(cd%:p:h),则只需键入:cd即可
大宗报价
这对我有用::echo expand(“%”) 这仅在使用相对文件打开该文件时有效:
for vi ./foo, expand("%") will be ./foo
但是
虽然expand('%')
经常有效,但也有一些地方不起作用。但是您可以通过调用fnamemodify
,强制Vim始终显示相对路径:
:echo fnamemodify(expand("%"), ":~:.")
从手册中:
:. Reduce file name to be relative to current directory, if
possible. File name is unmodified if it is not below the
current directory.
For maximum shortness, use ":~:.".
:~
是可选的。它将尽可能减少相对于主文件夹的路径(~/…
)。(不幸的是,这只适用于您的家庭;如果您不是以fred
身份登录,它不会将/home/fred
转换为~fred
)
如果您的空间有限,并且可以使用有关文件位置的“模糊”信息进行管理,请查看将文件夹名称压缩为一个字符的pathshorten()
:
:echo pathshorten('~/.vim/autoload/myfile.vim')
~/.v/a/myfile.vim
参考资料:
:h fnamem
和:h pathsh
请注意,我不想要文件名,我想要相对路径。所以不仅仅是editpage.php,还有“website/editpage.php”。是的,它会考虑到这一点。您试过了吗?您还可以在插入模式下使用%
插入当前文件名。这并不总是有效,取决于您最初打开文件的方式。有关更完整的解决方案,请参阅@Joey Twiddle对此问题的回答。对于下一个登录此页面的人,请查看此vim提示,以了解有关使用autocmd设置cd的更多详细信息。如果我在/tmp
中并执行vi/tmp/foo
操作,那么Vim计算出相对路径,然后展开(“%”
显示foo
。但是,如果我在/tmp
中保持vim打开并执行:e/tmp/bar
操作,则展开(“%”)将显示完整路径。感谢您为我指明了正确的方向。仅就记录而言,似乎还可以使用:echo expand(“%:~:”)
直接展开修饰符。更多信息可以在:help filename modifiers
上找到。谢谢您的回答!我在vim中工作,试图在docker容器中执行命令(运行特定的测试文件),因此绝对路径对我来说不起作用。Docker看不到完整路径,容器中的测试运行程序抛出错误,因为它找不到文件<代码>fnamemodify
工作正常!
:echo pathshorten('~/.vim/autoload/myfile.vim')
~/.v/a/myfile.vim