2016-10-01 2 views
0

В Баш, я хотел бы, чтобы достичь следующего рабочего процесса (запрос, показанный в скобках, _ является курсор):Bash: ПРОСТРАНСТВО запускаемых завершение

  1. Тип "Foo" ($ foo_)
  2. Пресс-пространство , На данный момент:
    • если Foo функция, скажем function foo() { printf "hello from foo" }
      1. пространство печатается ($ foo _)
      2. функция вызывается и hello from foo печатается через пробел - не символ новой строки ($ foo hello from foo_)
    • если Foo не является функцией, пробел печатается, и это его ($ foo _)

Я попытался:

  • Создание пространства отправить 0x0a (возвращение) в эмулятор терминала (iTerm2 на Mac). Это работает, за исключением того, что он явно печатает символ новой строки, а также
  • Использование встроенной функции: complete -F foo -o nospace foo. Это работает, но я должен ввести foo затем SPACE затем TAB для hello from foo для печати ИНЛАЙН
  • Я слышал, что вы могли бы как-то встроить \n -eating скрипт в PS1. На самом деле не знаю, как начать работу с этим.

Я мог бы также ловушку ярлык, например Ctrl+T, чтобы выполнить Foo - но я бы очень хотел только нажать SPACE.

Идеальное пространство будет вести себя так, как только первое слово будет введено в терминал. Любая помощь будет оценена, пожалуйста, сохраните мое здравомыслие.

Почему в мире мне это нужно: (я выродка И) У меня есть сценарий ido-like ido, который я бы хотел вызвать, когда я набираю cd, а затем SPACE.

+0

Вы можете злоупотреблять 'edit-and-execute-command' и перегружать' $ VISUAL'. Затем нажмите '' или перестройте '' для запуска. Не рекомендовал бы. – andlrc

ответ

0

Способ использования этого -n 1 с чтением. Например:

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 
+0

Это здорово, спасибо. Есть ли способ использовать другие специальные клавиши, находясь внутри цикла? Например, , чтобы удалить символ. – hyperio

+0

Вместо if ["$ a" = ""] вы можете сделать оператор case. Вы должны попробовать, как это работает со специальными символами. –

Смежные вопросы