Как отменить режим выбора в zsh другим способом, помимо добавления текста в $BUFFER?

Вопрос или проблема

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

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

Капча загружается...