在Vim获得相对路径

Raf*_*fid 13 vim relative-path

说我正在运行Vim和pwd返回

/home/rafid/myproject
Run Code Online (Sandbox Code Playgroud)

并说我正在编辑该文件

/home/rafid/myproject/website/editpage.php
Run Code Online (Sandbox Code Playgroud)

是否有任何命令可以为我返回此信息?

website/editpage.php
Run Code Online (Sandbox Code Playgroud)

也就是说,文件相对于当前文件夹的路径.

joe*_*dle 18

虽然expand('%')经常有效,但在极少数情况下却没有.但你可以通过调用强制Vim始终显示相对路径fnamemodify:

:echo fnamemodify(expand("%"), ":~:.")
Run Code Online (Sandbox Code Playgroud)

从手册:

    :.      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 ":~:.".
Run Code Online (Sandbox Code Playgroud)

:~是可选的.如果可能,它将减少相对于您的主文件夹的路径(~/...).(不幸的是,仅适用于您的家,它不会把/home/fred~fred,如果你不是在为登陆fred.)

如果您的空间有限,并且可以使用关于文件所在位置的"模糊"信息进行管理,那么请查看pathshorten()将文件夹名称压缩到一个字符的位置:

:echo pathshorten('~/.vim/autoload/myfile.vim')
~/.v/a/myfile.vim
Run Code Online (Sandbox Code Playgroud)

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

  • 感谢您为我指明了正确的方向。仅供记录,看起来修饰符也可以直接使用 `:echo Expand("%:~:.")` 进行扩展。更多信息可以在“:help filename-modifiers”中找到。 (2认同)

nim*_*odm 11

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

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

您使用任何完整路径名称调用Relpath,它将从其参数中删除当前目录名称.

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


ice*_*ime 5

这对我有用:

:echo expand("%")
Run Code Online (Sandbox Code Playgroud)

  • 您还可以在插入模式下使用`<cr>%`来插入当前文件名. (3认同)
  • 这并不总是有效,取决于您最初打开文件的方式.有关更完整的解决方案,请参阅@joeytwiddle对此问题的回答. (2认同)