Я пытаюсь привязать переключение ветки 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 ответ
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 -
а также повторно оцените приглашение, не прерывая текущую командную строку.