如何在Vim脚本中的路径下获取目录名称?

sta*_*ner 2 directory vim function path complete

我想要一个简单的解决方案来获取vim脚本中路径下的目录名称.

这是我尝试过的方法:代码.https://gist.github.com/4307744 功能位于L84行.

我使用此函数作为input()的完整函数.因此,此函数需要返回路径下的目录名列表.例如

to/path/
        - a/
        - b/
Run Code Online (Sandbox Code Playgroud)

我想得到ab.

我试图找到vim内部函数:help functions.只有找到了globpath(),但它会返回完整路径.

那么有人有一个简单的解决方案吗?(顺便说一句,为什么在Vim的路径下获取目录名很难?)

ZyX*_*ZyX 9

我不知道它是否是故意的,但是glob()如果模式结束时,只将目录限制为具有路径的目录/:

let directories=glob(fnameescape(top_directory).'/{,.}*/', 1, 1)
call map(directories, 'fnamemodify(v:val, ":h:t")')
Run Code Online (Sandbox Code Playgroud)

.一些解释:

  • fnameescape()转义top_directory(它应该to/path在示例中设置),以防止它中的特殊字符被自己展开(我以前曾经有过目录命名*.*).
  • {,.}是必要的,因为在unix上vim不会列出默认以dot开头的文件.请注意,通常.*模式匹配特殊...目录,然后删除,但由于某些原因{,.}*不匹配它们.
  • , 1, 1make glob()ignore 'suffixes''wildignore'options(第一个)并返回一个列表(第二个,需要最近的vim).
  • 最后(第二行)用于保留您请求的目录名称.通常:h:t只返回父目录名,但glob()输出路径to/path/a/,:h因此只删除尾部斜杠.:tstrip目录路径(返回尾随路径组件).没有:h剥离斜杠尾随路径组件将是空字符串.

您可以将所有内容合并为一行:

let directories=map(glob(fnameescape(top_directory).'/{,.}*/', 1, 1), 'fnamemodify(v:val, ":h:t")')
Run Code Online (Sandbox Code Playgroud)