我正在尝试编写自己的完整命令。完成需要使用键入命令的一部分来进行路径搜索。
我试图获得以下行为
当我my_commad -ws my_ws -t[TAB]
在 my_ws/tests 下编写文件夹列表时,它显示为完成列表,我不知道如何打破它
我尝试了以下操作,但由于引号问题而失败,我猜
complete my_command 'n@-t@`echo $COMMAND_LINE | perl -ne '/-ws (\w+)/; print $1'`@'
我正在尝试编写自己的完整命令。完成需要使用键入命令的一部分来进行路径搜索。
我试图获得以下行为
当我my_commad -ws my_ws -t[TAB]
在 my_ws/tests 下编写文件夹列表时,它显示为完成列表,我不知道如何打破它
我尝试了以下操作,但由于引号问题而失败,我猜
complete my_command 'n@-t@`echo $COMMAND_LINE | perl -ne '/-ws (\w+)/; print $1'`@'
报价问题
正如您所提到的,您的命令的问题在于您需要转义的单引号内有单引号。有几种方法可以做到这一点。
如果
backslash_quote
设置了 shell 变量,则可以使用反斜杠转义内部单引号。echo $?backslash_quote
为1。set backslash_quote
或者,如果您的
backslash_quote
未设置并且您不想更改它,您可以将内部单引号替换为'"'"'
。两种解决方案都可以解决您的引号问题,结果将是后面的参数
-t
将由您的参数完成-ws
。无论如何,这不是您想要实现的目标。您希望它由“my_ws/tests 下的文件夹列表”来完成。
回答您的实际需求
对于更复杂的完成,您可能会考虑创建一个包装器脚本来解析
$COMMAND_LINE
变量并执行其他操作。例如,如果您希望
-t
$WS/tests 下的子目录完成后面的参数,您可以在主目录中编写类似于以下内容的脚本:然后在您的
complete
命令中,您将findtest.sh
使用$COMMAND_LINE
变量作为参数来调用脚本:结果:
假设
my_ws/tests
你下面有以下文件夹:然后尝试完成参数 for
-t
将导致:如果您不想显示完整路径,而只想显示下面的目录
my_ws/tests
而不显示前导路径,您可以将find
脚本中的命令更改为:结果:
其他建议
您可以添加其他功能来完成。例如:
或者更具可读性:
解释:
'p/*/(-ws)/'
- 在您之后的任何地方,my_command
它都会尝试完成-ws
。'n/-ws/d/'
- 之后-ws
它将尝试仅完成目录。'N/-ws/(-t)/'
- 如果在行中当前位置之前的两个单词是-ws
,则它期望的下一个参数是-t
。请注意,此处的顺序很重要,因为
tcsh
将尝试根据单词在complete
命令中出现的顺序来完成。例如,如果您将 移至'p/*/(-ws)/'
开头,它将始终尝试完成 to-ws
而不会尝试该行的其余部分。结果: