Чего я хочу добиться, так это привязать Ctrl-C к очистке строки без выдачи новой строки (а-ля ipython) только при редактировании командной строки, сохраняя при этом Ctrl-C в качестве триггера сигнала прерывания при выполнении команды. Я использую bindkey -v
, то есть редактирование строк в режиме vi, но я считаю, что это не имеет значения.
В качестве примечания, я бы хотел, чтобы эта функция не создавала ситуаций, когда Ctrl-C не прерывал бы текущую команду.
Я копаюсь в этом в свободное время, поэтому мне будут интересны любые подсказки. Если я найду что-то достаточно надежное, я опубликую это как ответ.
Любая функция с именем TRAPINT
внутри вашего .zshrc будет перехватывать сигналы прерывания, отправленные Ctrl-C. Внутри вы захотите проверить, находитесь ли вы в режиме вставки, чего можно добиться, проверив переменную ${KEYMAP}
. Если это не так, вы должны передать возвращаемое значение родительского процесса (см. этот ответ для подсказки по этому поводу). Это приводит нас к следующему фрагменту:
TRAPINT() {
if [[ "${KEYMAP}" = "viins" -o "${KEYMAP}" = "main" ]]; then
zle kill-whole-line
zle reset-prompt
else
return ${128+$1}
fi
}
Это будет работать, если вы используете редактирование строк в режиме vi. Он также должен поймать emacs-mode, где KEYMAP
должно быть установлено на main
, хотя я не тестировал этот конкретный вариант использования. zle reset-prompt
иногда требуется для обновления дисплея.