Bash:SPACE触发的完成

时间:2016-10-01 15:18:16

标签: bash terminal bash-completion

在bash中,我想实现以下工作流程(括号中显示提示,_是光标):

  1. Type" foo" ($ foo_
  2. 按空格键。在此刻:
    • 如果foo是一个函数,请说function foo() { printf "hello from foo" }
      1. 打印空格($ foo _
      2. 调用该函数并在空格后打印hello from foo - 无新行($ foo hello from foo_
    • 如果foo不是函数,则打印空格并将其打印($ foo _
  3. 我试过了:

    • 将空间发送0x0a(返回)到终端仿真器(Mac上的iTerm2)。这有效,除了它显然也打印换行符
    • 使用内置完整功能:complete -F foo -o nospace foo。这有效,但我必须输入foo然后SPACE然后TAB输入hello from foo以便内联打印
    • 我听说你可以某种方式将\n - 吃脚本嵌入PS1。真的不知道如何开始使用那个。

    我还可以捕获一个快捷方式,例如Ctrl+T来执行foo - 但我真的只想按SPACE

    理想情况下,空格只会对输入终端的第一个单词表现得这样。任何帮助将不胜感激,请保存我的理智。

    为什么在这个世界上我需要这个:(我真的很棒)我有一个类似emacs的ido脚本,当我输入cd时我想调用它然后是SPACE

1 个答案:

答案 0 :(得分:0)

执行此操作的方法是将-n 1与read一起使用。例如:

foo(){
  echo hello from foo
}

string=''
while read -n 1 a ; do
  if [ "$a" = "" ] ; then
        tpe=`type -t $string`
        if [ "$tpe" = "function" ] ; then
              $string
        fi
        string=''
  else
        string="$string$a"
  fi
done