Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vim Shell命令完成_Vim_Tab Completion - Fatal编程技术网

Vim Shell命令完成

Vim Shell命令完成,vim,tab-completion,Vim,Tab Completion,可以为用户命令提供-complete=shellcmd选项。这结果非常令人失望,因为它没有像vim的命令内置完成一样工作,而是在路径中重复完成shell命令的名称 我想写一个命令,完成命令名和文件。有没有一种方便的方法可以做到这一点,或者使用内置的vim功能,或者通过一个插件?为什么不在使用bash completion时利用它呢?您应该能够用/etc/bash_派生一个bash shell,并通过管道与它交谈以询问它。那样你就能吃到所有的贝壳糖果了 当然,您也可以像我一样,使用C-z挂起Vim

可以为用户命令提供
-complete=shellcmd
选项。这结果非常令人失望,因为它没有像vim的命令内置完成一样工作,而是在路径中重复完成shell命令的名称


我想写一个命令,完成命令名和文件。有没有一种方便的方法可以做到这一点,或者使用内置的vim功能,或者通过一个插件?

为什么不在使用bash completion时利用它呢?您应该能够用/etc/bash_派生一个bash shell,并通过管道与它交谈以询问它。那样你就能吃到所有的贝壳糖果了


当然,您也可以像我一样,使用C-z挂起Vim,将其放回shell。

我最终编写了一个名为。它不是真正的超级megazord真棒,但它确实实现了我所期望的功能,即或多或少地模拟
所使用的完成方式:。这就是说,这是一种“伪shell完成”:它完成了第一个“单词”的命令,并从此处生成文件。基本的
\
空格转义似乎可以正常工作

假壳完井 安装
shell\u complete
有点复杂,特别是对于那些不熟悉的人来说。插件有几个依赖项,并且没有一个是“已发布的”,也就是说VAM还不知道它们。您可以通过安装(通过
git clone
;有关更多信息,请参阅文档)另一个我调用的插件,让VAM了解它们。无论如何,一旦完成此操作,您应该能够只
:ActivateAddons tt_addons
,然后
:ActivateAddons shell_complete

如果您没有使用VAM,那么您必须下载(或者更可能是下载git clone
)所有相关模块,然后将它们混合到您的vim目录中,或者使它们成为病原体捆绑包,或者您拥有的其他功能。如果你最终真的想这么做,那么开始使用VAM可能是值得的。如果你是一个拒绝这么做的暴躁的勒德分子,请告诉我,如果有兴趣的话,我可能会把这件事放到vim.org上

我认为如何使用
shell\u complete
是很明显的(至少在文档中是这样),但是如果你想看到它的实际应用,你可以查看我的插件,它使用它来完成
:RePutShell
命令
reput
目前也仅通过github提供,同样的注意事项也适用于通过VAM进行安装

使用shell的实际shell完成 为了记录在案,我认为sehe关于使用shell本身完成的建议完全是一闪而过的。事实上,我花了相当长的时间研究如何做到这一点,并确定这是可能的,至少在理论上是如此。我最初认为这样做比做
shell_complete
更容易,但事实证明bash(像vim一样)没有提供任何编程方式来访问它的完成工具,所以你最终基本上不得不在bash中重新实现它们,使用
grep
和friends删除配置后。Bash对这类事情很差劲,所以我胆怯地拒绝参加那场战斗,至少目前是这样


如果有人如此勇敢/愚蠢地接受这个标准,他们可能会利用这个标准。我设法让它完成由自定义完成函数处理的完成。然而,这只是谜题的一小部分,因为bash还提供了大约6½种其他完成方法。它在某种程度上补充了shell_complete提供的功能,因此,将两者协同合并成一种笨拙、醉酒的vim shell completion Voltron可能是值得的。

分叉似乎可以工作,但我希望它能够跨平台兼容。当然,这可以通过vim的内置globbing功能来实现;最棘手的部分似乎是正确地分割现有线路。好吧,这让我不再为vim显然没有为
:公开自己的完成而烦恼了。有选择地利用bash completion并退回到使用vim功能的插件将非常酷。。另外:
^Z
在这里没有用处,因为shell命令本身将由使用其输出的vim函数执行。好的,我明白了。这实际上可能是一个很好的特性请求(使其可插拔(公开API),或者只是实现您想要的改进)。See或@sehe:我想有一些不允许公开编程完成功能的潜规则:bash也不支持这一点。似乎有一种局部解决方案,它似乎可以通过函数完成,但不提供文件名完成的回退。使用管道与子流程通信似乎不起作用,因为选项卡中的管道只会导致它被合并到命令中。@sehe:我考虑过用这种方式使用管道,但是它看起来像是改变目录和做任何其他与环境相关的事情——这样vim的环境变量的变化就会反映在完成结果中——会非常复杂,而且不会有太多的收获。不过,这取决于bash的启动时间。也许这是一个理想的选择。不管怎么说,这次我要好好亲一亲。