使用 zsh 在 rake 中添加文件自动完成功能

使用 zsh 在 rake 中添加文件自动完成功能

我已经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

相关内容