1

Я использую zsh на своем Mac, и после некоторой хитрости bindkey мне удалось получить left/right/delete/backspace для работы с zsh (и bash). В git --interactive это работает некорректно.

Когда я пытаюсь зафиксировать вещи в интерактивном режиме, работает только backspace. Когда я нажимаю влево, вправо, удаляю, я получаю управляющие последовательности ANSI для этих клавиш: ^[[D ^[[C ^[[3~ . Когда я ищу их в моем списке bindkey, они, кажется, настроены правильно, хотя:

% bindkey | \grep -F "^[[D" 
"^[[D" backward-char
% bindkey | \grep -F "^[[C"
"^[[C" forward-char
% bindkey | \grep -F "^[[3~"
"^[[3~" delete-char

Это происходит как при использовании bash, так и при использовании zsh. Это также происходит, когда я использую xterm X11 вместо Terminal.app. Я нашел множество сообщений об этих проблемах в самом zsh (например, на этом форуме, в этом сообщении или в самом SU), но ни один из них не относится к git.

Короче говоря: влево / вправо / удалить ключи работают в моей оболочке, но не в git --interactive Как я могу это исправить?

1 ответ1

1

Во-первых, специальные ключи обрабатываются самой программой, а не устройством tty. Когда вы нажимаете Left, Terminal.app отправляет ESC [D на bash, и интерпретирует его до библиотеки Readline bash .

Единственными исключениями являются ключи, перечисленные в stty -a - когда tty находится в "приготовленном" режиме, он сам интерпретирует такие нажатия клавиш как Backspace. (Bash и Zsh на самом деле сами используют "сырой" режим, но временно переключаются в "приготовленный" перед запуском программы.)

Во-вторых, shell и git --interactive - это совершенно не связанные программы. Когда вы запускаете git , оболочка приостанавливается. Все программы получают прямой доступ к устройству tty, и каждая использует свою собственную библиотеку для взаимодействия с ним - bash использует Readline, zsh использует свой собственный ZLE, git --interactive читает с терминала напрямую. Привязки, сделанные в zsh, применяются только тогда, когда zsh , а не git , читает с терминала.

Как я уже сказал, git --interactive читает напрямую из терминала, что означает, что вы не можете использовать с ним bindkey Zsh или Readline ~/.inputrc . Вы должны будете изменить программу, чтобы использовать Readline или подобную библиотеку. (Поскольку git-add--interactive является Perl-скриптом, вы можете переписать его части, чтобы использовать Term::ReadLine, но я не ожидаю, что он будет принят в апстриме.)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .