我已经oh-my-zsh
安装了rails
插件,当我使用zsh
完成时rake
,它会使用来自的任务列表完成rake -T
。
当我运行特定测试时,其中一个参数是测试文件的路径:
rake test test/models/dummy_model.rb
我经常尝试自动完成这条路径,但显然不起作用。
rake test test/models/...
除了任务之外,我还希望能够从文件路径完成。我该怎么做?
答案1
如果我理解正确的话,这种情况只会发生在你使用表单时rake test ...
。然后你可以用这个补丁来对付$fpath/_rake
diff --git a/Completion/Unix/Command/_rake b/Completion/Unix/Command/_rake
index 7fed949..96ee930 100644
--- a/Completion/Unix/Command/_rake
+++ b/Completion/Unix/Command/_rake
@@ -37,12 +37,16 @@ case "$state" in
;;
target)
local -a targets
- targets=( ${${(f)"$(_call_program targets $words[1] -sT $opt_args[(I)(-N|--nosearch)] ${(kv)opt_args[(I)(-f|--rakefile)]} 2>/dev/null)"}/(#b)rake ([^ ]##) ##\# (*)/${${match[1]}//:/\\:}:${match[2]:l}} )
- if (( ! ${targets[(I)rake aborted!]} )) then
- _describe -t targets 'rake target' targets && ret=0
- else
- _message -e targets 'rake target'
- fi
+ if [[ $words[$((CURRENT-1))] == "test" ]]; then
+ _files && ret=0
+ else
+ targets=( ${${(f)"$(_call_program targets $words[1] -sT $opt_args[(I)(-N|--nosearch)] ${(kv)opt_args[(I)(-f|--rakefile)]} 2>/dev/null)"}/(#b)rake ([^ ]##) ##\# (*)/${${match[1]}//:/\\:}:${match[2]:l}} )
+ if (( ! ${targets[(I)rake aborted!]} )) then
+ _describe -t targets 'rake target' targets && ret=0
+ else
+ _message -e targets 'rake target'
+ fi
+ fi
;;
esac
该补丁原则上添加了检查前一个参数是否等于“test”的条件。如果是,则通过函数而不是 rake 目标if [[ $words[$((CURRENT-1))] == "test" ]];
返回文件和目录。_files
答案2
经过多年的挫折,我创建了一个新的 zsh rake 自动完成功能,您可能会觉得它很有用。非常简单,但它支持 rake 选项、任务名称和文件。由于我对 zsh 不太熟悉,因此评论很多。https://gist.github.com/gurgeous/2aea9f096a7801215ff38cd031e17dd4