在Vim中获取相对路径

23

假设我正在运行 Vim ,并且 pwd 返回

/home/rafid/myproject

假设我当前正在编辑该文件

/home/rafid/myproject/website/editpage.php

有没有什么命令可以返回这个给我?

website/editpage.php
那就是文件相对于当前文件夹的路径。
7个回答

36

尽管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。)

正如Adam在评论中指出的那样,这可以缩短为:

:echo expand("%:~:.")

参考::h expand<Tab>:h fnamem<Tab>


如果空间有限(例如在状态栏中使用),并且可以通过模糊的文件位置信息来处理,那么请尝试使用pathshorten(),它将文件夹名称缩短为一个字符:

:echo pathshorten('~/.vim/autoload/myfile.vim')
~/.v/a/myfile.vim

参考文献::h pathsh<Tab>


2
感谢您指引我正确的方向。仅供记录,看起来修饰符也可以直接使用 :echo expand("%:~:.") 进行扩展。更多信息可以在 :help filename-modifiers 中找到。 - Adam Byrtek
谢谢您的回答!我正在使用vim并尝试在docker容器内执行命令(运行特定的测试文件),因此绝对路径对我无效。 Docker无法看到完整路径,我的容器内测试运行程序会因找不到文件而抛出错误。 fnamemodify 完美解决了这个问题! - latortuga

11

另一种选择是编写 vim 函数。这是我谦虚的尝试:

function! Relpath(filename)
    let cwd = getcwd()
    let s = substitute(a:filename, l:cwd . "/" , "", "")
    return s
endfunction

您可以使用Relpath函数来处理任何完整路径名,它会从参数中剥离当前目录的名称。

例如,尝试:echo Relpath(expand("%:p")):p修饰符要求Vim返回完整路径)。显然,在您的情况下,这并不是必需的,因为%本身就返回相对路径。但是,在其他情况下,它可能会派上用场。


5
这对我有用:

这适用于我:

:echo expand("%")

4
你也可以在插入模式下使用 <c-r>% 来插入当前文件名。 - Peter Rincker
3
这种方法并不总是有效,而且取决于你最初打开文件的方式。请参阅@joeytwiddle在此问题上的回答,以获取更完整的解决方案。 - senbrow

1
如果你使用 autocmd 始终设置正在工作的缓冲区的当前目录 ( cd %:p:h ),那么你可以直接输入 :cd。

下一个访问此页面的人,请查看这个 Vim 技巧,了解有关使用 autocmd 设置 cd 的更多详细信息:http://vim.wikia.com/wiki/Set_working_directory_to_the_current_file - molicule

1

块引用 这对我有用:
:echo expand("%")

只有在使用相对文件打开该文件时才有效:

for vi ./foo, expand("%") will be ./foo

但是
for vi /tmp/foo expand("%") will be /tmp/foo

1
如果我在/tmp目录下,执行vi /tmp/foo命令,那么Vim会计算出相对路径,并且expand("%")命令会显示foo但是如果我在/tmp目录下保持Vim打开状态,然后执行:e /tmp/bar命令,那么expand("%")命令将显示完整路径。 - joeytwiddle

0

是的,你可以使用

:args

这将为您提供当前文件的文件名,仅供信息目的。


请注意,我不仅需要文件名,还需要相对路径。因此不仅仅是editpage.php,而是'website/editpage.php'。 - Rafid
是的,它会考虑到那个。你试过了吗? - kvista

0

解决方法可以是 :cd . ,看起来会重新评估路径的相对性。尽管如此,我同意这非常令人恼火。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接