在Vim中获取相对路径

在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(

假设我正在运行Vim和pwd返回

/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