我找到了一个简短的脚本来启用笔记万事韦尔,其中包括:
function n { nano ~/n/$1.txt }
我想扩展它来完成制表符,这样如果我想编辑预先存在的注释“foobar”(~/n/foobar.txt),我可以输入foo[TAB]
并让它自动完成foobar
,而不是必须每次都输入“foobar”。问题是 bash 的内置制表符补全似乎以当前目录为中心,因此如果我位于不是 ~/n 的文件夹中,那么我的制表符补全会失败 - 或者更糟糕的是,会完成错误事情,因为也许我在 ~/snafu/ 中有一个名为 'footastic' 的文件(这意味着我输入$ n foo[TAB]
,而不是看到$ n foobar
,我查看我的输入并看到:$ n footastic
。
所以,在所有的序言之后,问题是:如果可能的话,我如何告诉 bash 在我输入 'n' 之后,对于就这一次我希望它假设我们正在使用 ~/n 中的文件来完成,而不是使用当前目录中的文件?
如果你理解了所有这些电子自言自语,那么恭喜你,如果你能做到的话回答那个,非常感谢!
答案1
这可能会让你到达那里......
在 .bashrc 中启用自定义选项卡完成
shopt -s progcomp
创建一个 compgen 函数并将其添加到 .bashrc后你的笔记功能。
_notes() { local cur cur=${COMP_WORDS[COMP_CWORD]} COMPREPLY=( $(compgen -f $HOME/n/$cur | cut -d"/" -f5 ) ) } complete -o filenames -F _notes n
这对我来说很有效——在基础层面上。我还没有解决嵌套目录的问题......
参考:
答案2
为了跟进 jasonwryan 的答案,我使用 cut 来修剪已知路径目标的开头:
_c ()
{
local cur
COMPREPLY=()
cur=${COMP_WORDS[COMP_CWORD]}
case "$cur" in
*)
COMPREPLY=( $(compgen -f /src/$cur | cut -c 6-) )
;;
esac
return 0
} &&
complete -o filenames -F _c c
这允许我直接操作下面的任何目录、子目录或文件名/src/