Вопрос или проблема
виджеты zle работают с помощью клавиш Ctrl-Right, Ctrl-Left (первый виджет запускает режим выделения):
c-sel-r-reg () {
local WORDCHARS=${WORDCHARS/\/}
zle select-in-word
}
zle -N c-sel-r-reg
bindkey "^[Oc" c-sel-r-reg
c-l-reg () {
local WORDCHARS=${WORDCHARS/\/}
zle vi-backward-word
zle end-of-line
zle -U " "
}
zle -N c-l-reg
bindkey "^[Od" c-l-reg
Чтобы отменить то, что вы называете “режимом выделения” с помощью виджета zsh zle, нужно:
zle set-mark-command -n -1
или, если вы предпочитаете:
REGION_ACTIVE=0
То, что поддерживает zsh, в основном совместимо с формами emacs и vim. Текст между меткой ($MARK) и курсором ($CURSOR) выделен. В документации также упоминается регион (emacs) или визуальный режим (vim). Типичное поведение, которое вы получаете с Windows-программами, не особенно мощное. Лучше изучить, как vim или emacs выполняют задачи, но стиль выделения, похожий на Windows, можно в большинстве случаев эмулировать, если заменить несколько виджетов. Например, self-insert должен будет очищать выделение перед вставкой текста. Основное ограничение заключается в том, что выделение всегда должно либо начинаться, либо заканчиваться на курсоре.
Ответ пользователя okapi был идеальным. Здесь я немного подробнее объясню для тех, кто, как и я, только начинает работать с Zsh Line Editor.
Вот пример привязки клавиши Ctrl+G
которая достигает того же эффекта, что и в Emacs:
она ведет себя как обычный CTRL-g в Zsh, когда выделение не сделано,
в то время как она отменяет выделение, когда оно активно:
# Определить виджет для отмены метки
function emacs-cancel-mark() {
if [[ $REGION_ACTIVE -eq 1 ]]; then
zle set-mark-command -n -1 # Деактивировать метку
else
zle send-break # Вести себя как C-g в Emacs, когда метка не активна
fi
}
zle -N emacs-cancel-mark
# Привязать к CTRL-g
bindkey "^g" emacs-cancel-mark
Использование set-mark-command -n -1
было отличной идеей.
Я цитирую дословно руководство zsh, где объясняется отрицательный числовой аргумент:
set-mark-command
(^@
) (не привязан) (не привязан)Установите метку в позиции курсора.
Если вызывать с отрицательным
числовым аргументом, не устанавливайте метку, а деактивируйте регион, чтобы
он больше не был выделен (он все еще доступен для других
целей). В противном случае регион помечается как активный.
Ответ или решение
Как отключить режим выделения в Zsh, не добавляя текст в $BUFFER
Вопрос о том, как отключить так называемый "режим выделения" в Zsh, представляет собой интересную задачу, особенно если учесть, что многие команды в Zsh вдохновлены поведением редакторов Emacs и Vim. Ниже описан способ, как этого можно достичь, используя встроенные возможности Zsh, без добавления текста в $BUFFER
.
Подробное объяснение
Zsh Line Editor (ZLE) предоставляет достаточно гибкие инструменты для обработки текста и управления выделенной областью. В продемонстрированной ситуации, при выделении текста между переменными $MARK
и $CURSOR
, текст подсвечивается. Этот режим часто называется регионом (emacs) или визуальным режимом (vim).
Чтобы завершить режим выделения, можно использовать следующую команду:
zle set-mark-command -n -1
Этот метод эффективен, так как он деактивирует маркер, не изменяя содержимого буфера. Как альтернатива, можно использовать:
REGION_ACTIVE=0
Реализация через привязку клавиш
Ниже приводится пример, как можно использовать данную команду для создания нового виджета и последующей привязки его к сочетанию клавиш Ctrl+G
, аналогично тому, как это реализовано в Emacs:
# Определение виджета для отмены выделения
function emacs-cancel-mark() {
if [[ $REGION_ACTIVE -eq 1 ]]; then
zle set-mark-command -n -1 # Деактивировать выделение
else
zle send-break # Поведение как у C-g в Emacs, если выделения нет
fi
}
zle -N emacs-cancel-mark
# Привязка к Ctrl-G
bindkey "^g" emacs-cancel-mark
Заключение
Этот подход позволяет пользователю более гибко управлять режимом выделения в Zsh, не прибегая к добавлению лишнего текста в буфер. Использование команды set-mark-command -n -1
обеспечивает простое и понятное отключение выделения, что делает Zsh более удобным инструментом для профессиональных пользователей. Внедрение этого решения может значительно улучшить взаимодействие с терминалом, особенно для тех, кто предпочитает работать в стиле Emacs или Vim.
Беря в расчет различные вкусы пользователей и мощные возможности Zsh, использование описанного метода содействует не только в повышении эффективности работы, но и в лучшем понимании возможностей настройки вашего рабочего окружения.