假设我正在运行 Vim ,并且 pwd 返回
/home/rafid/myproject
假设我当前正在编辑该文件
/home/rafid/myproject/website/editpage.php
有没有什么命令可以返回这个给我?
website/editpage.php
那就是文件相对于当前文件夹的路径。假设我正在运行 Vim ,并且 pwd 返回
/home/rafid/myproject
假设我当前正在编辑该文件
/home/rafid/myproject/website/editpage.php
有没有什么命令可以返回这个给我?
website/editpage.php
那就是文件相对于当前文件夹的路径。尽管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>
另一种选择是编写 vim 函数。这是我谦虚的尝试:
function! Relpath(filename)
let cwd = getcwd()
let s = substitute(a:filename, l:cwd . "/" , "", "")
return s
endfunction
您可以使用Relpath函数来处理任何完整路径名,它会从参数中剥离当前目录的名称。
例如,尝试:echo Relpath(expand("%:p"))
(:p
修饰符要求Vim返回完整路径)。显然,在您的情况下,这并不是必需的,因为%
本身就返回相对路径。但是,在其他情况下,它可能会派上用场。
这适用于我:
:echo expand("%")
<c-r>%
来插入当前文件名。 - Peter Rincker块引用 这对我有用:
:echo expand("%")
只有在使用相对文件打开该文件时才有效:
for vi ./foo, expand("%") will be ./foo
for vi /tmp/foo expand("%") will be /tmp/foo
/tmp
目录下,执行vi /tmp/foo
命令,那么Vim会计算出相对路径,并且expand("%")
命令会显示foo
。但是如果我在/tmp
目录下保持Vim打开状态,然后执行:e /tmp/bar
命令,那么expand("%")
命令将显示完整路径。 - joeytwiddle是的,你可以使用
:args
这将为您提供当前文件的文件名,仅供信息目的。
解决方法可以是 :cd .
,看起来会重新评估路径的相对性。尽管如此,我同意这非常令人恼火。
:echo expand("%:~:.")
进行扩展。更多信息可以在:help filename-modifiers
中找到。 - Adam Byrtekfnamemodify
完美解决了这个问题! - latortuga