我希望在vimscript中对bash dirname
命令或python os.path.split()[0]
执行与任何路径字符串(不一定是当前文件的路径)相同的操作。
示例所需行为:
/a/b/
- > /a
/a/b
- > /a
我试过fnamemodify()
但是对我而言,它的输出似乎取决于是否存在目录:
:ec fnamemodify( '/usr/idontexist', ':p:h')
给出:
/usr
这很好,但是:
:ec fnamemodify( '/usr/bin', ':p:h')
给出:
/usr/bin
这不是我想要的,我无法弄清楚它在做什么。
我希望找到一个跨平台的解决方案。
答案 0 :(得分:8)
您是否已阅读:h
:
When the file name ends in a path separator, only the path
separator is removed. Thus ":p:h" on a directory name results
on the directory name itself (without trailing slash).
这就是原因:
:ec fnamemodify( '/usr/bin/', ':p:h') "directory, ending with /
-> /usr/bin
:ec fnamemodify( '/usr/bin/', ':h') "directory, ending with /
-> /usr/bin
:ec fnamemodify( '/usr/bin', ':p:h') "directory, not ending with /
-> /usr/bin
:ec fnamemodify( '/usr/bin', ':h') "directory, not ending with /
-> /usr
所以决定输出有两个因素。
separator
:p
要实现目标,如果字符串以/
(或\ in win?)
结尾,则可以删除最后一个字符,然后传递给不带:p
的函数
答案 1 :(得分:5)
fnamemodify( '/usr/idontexist', ':h')
:p
修饰符会将路径扩展为完整路径。因此它必须是一条真正的道路。如果你没有弄乱真正的路径,就不要使用:p
。
见
:h filename-modifiers