在Vim命令中使用当前目录

8

对于我编写的Haskell程序,我知道可执行文件在路径中的名称与当前目录的名称相同。现在我想创建一个映射,如下所示:

:map <leader>rr :!curdir()<cr>

然而,我所知道的唯一命令是getcwd(),它会给我整个路径而不是只有目录的名称。

有没有一种简单的方法仅提取目录的名称?


请查看此答案 - romainl
下面的答案是很好的 vimscript 解决方案。如果您没有地图,也可以使用 = register 进行动态评估。(在输入 ex 命令的一部分(如 :!)后,键入“C-R =”,然后是下面的 vimscript 解决方案之一。 - darcyparker
@darcyparker 都不好。不要使用任何正则表达式来执行此类任务,因为有专门的函数可用。假设 / 是路径分隔符的人是错误的。假设 /\ 都是路径分隔符的人同样是错误的。而且,假设 \ 在 Windows 上始终是路径分隔符的人也是错误的。我也不知道在什么情况下路径分隔符会是 :,但可能是这样。大多数 *nix 系统可以在文件名中包含 \ : - ZyX
2个回答

14

使用

fnamemodify(getcwd(), ':t')

或者

fnamemodify('.', ':p:h:t')

在第二种情况下,:h 是必需的,因为 :p 会发出尾部路径分隔符(因此由 :t 选择的最后一个路径组件现在为空字符串)。

要将此移入您的映射中,请使用:

:noremap \rr :!<C-r>=shellescape(fnamemodify('.', ':p:h:t'), 1)<CR><CR>

关于为什么不应该使用:map的描述,请参见这里


0
你可以使用类似以下的代码:
split(getcwd(), "/")[-1]

路径分隔符/不是必需的。 - ZyX
@ZyX,你在谈论哪个操作系统? - taro
Windows:这里的路径分隔符取决于“&shellslash”选项,可以是“\”或“/”。据我所知,Macintosh有时候路径分隔符可能是“:”,但我不知道在哪些情况下。 - ZyX
在之前的评论中应该是“\/”。Markdown解析器在这里有些原因认为在反引号-反斜杠-反引号序列中反斜杠是转义反引号。反引号-反斜杠-反斜杠-反引号也不起作用:反引号会被显示为:\\ - ZyX
如果我理解正确的话,在OSX之前的MacOS中,它使用:作为目录分隔符。 - dash-tom-bang

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