Как «привязать -x» сочетание клавиш и обновить приглашение

Я пытаюсь привязать переключение ветки git к нажатию клавиши с помощью следующей конфигурации:

bind -x '"et":"git checkout -"'

Это работает как шарм, однако у меня также есть следующий установочный код для отображения имени ветки в PS1:

PS1='${debian_chroot:+($debian_chroot)}u@:W $(parse_git_branch)$ '

Имя ветки не обновляется после вызова сочетания клавиш, пока я не сделаю, скажем, cd ..

Единственный известный обходной путь, о котором я знаю, — это обновить конфигурацию следующим образом:

bind '"et":"git checkout - n"'

Ничего страшного, но мне интересно, как лучше всего добиться желаемого поведения с сохраненным ключом -x. Что я пока искал в Google, так это то, что есть redraw-current-line функция, но дело в том, что она не установлена ​​на моем Ubuntu, и я понятия не имею, как ее установить.

1 ответ
1

redraw-current-line это команда в строке чтения, вы не устанавливаете ее. Bash использует библиотеку readline и все, команда уже есть. Вы используете его с bind встроенный.

Мои тесты показывают redraw-current-line перерисовывает приглашение без повторной оценки. PROMPT_COMMAND не запускается, поэтому вы также не можете использовать его для обновления приглашения. Для сравнения: clear-screen ведет себя аналогично.

Другими словами, Bash запоминает ваше приглашение и перерисовывает его, не запуская parse_git_branch очередной раз. Кажется, единственный способ на самом деле переоценить — ввести команду (возможно, пустую) и нажать Входить. Ваш "git checkout - n" эмулирует это: git checkout - это команда и n работает как Входить.

Я понимаю по крайней мере в одном аспекте bind -x '"et":"git checkout -"' Это лучше чем bind '"et":"git checkout - n"'. Прежняя привязка может использоваться при вводе случайной команды, и она не влияет на то, что вы набираете. Последняя привязка в таком случае порождает беспорядок.

Но только последняя привязка переоценивает подсказку.

Есть относительно сложный способ съесть пирог:

_save_command_line() {
   READLINE_LINE_OLD="$READLINE_LINE"
   READLINE_POINT_OLD="$READLINE_POINT"
   READLINE_LINE=
   READLINE_POINT=0
}

_restore_command_line() {
   READLINE_LINE="$READLINE_LINE_OLD"
   READLINE_POINT="$READLINE_POINT_OLD"
}

bind -x '"C-xC-s":"_save_command_line; git checkout -"'
bind -x '"C-xC-r":"_restore_command_line"'
bind '"et":"C-xC-snC-xC-r"'

Теперь, если вы наберете Escт тогда Bash:

  • Отправить Ctrl+Икс,Ctrl+s себе, это будет работать _save_command_line; git checkout -; Примечание _save_command_line не только сохраняет, но и очищает командную строку;
  • Отправить n себе, т.е. Ctrl+j который работает как Входить; так что это Входить в нашей теперь пустой командной строке; это будет переоценивать PS1 и распечатайте новую подсказку;
  • Отправить Ctrl+Икс,Ctrl+р себе, это будет работать _restore_command_line.

Таким образом вы можете бежать git checkout - а также повторно оцените приглашение, не прерывая текущую командную строку.

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *