5

Как использовать shift для выбора части командной строки (как во многих текстовых редакторах)?

1 ответ1

4

Один из способов сделать это

  1. определить новые виджеты, которые активируют маркировку на сдвинутых клавишах движения,
  2. переопределить все виджеты действий для работы с регионом (если есть) и
  3. переопределить все виджеты движения по умолчанию, чтобы отключить маркировку.

Вот подтверждение концепции (для xterm), работающей для:

  • Shift-Left и Shift-Right: начать выбор влево / вправо, соответственно,
  • Left , Right: отмена выбора и перемещение влево / вправо соответственно,
  • Delete: удалить выделение, если оно есть, в противном случае символ под курсором.

Применяются обычные заявления об отказе от ответственности (могут быть другие и более эффективные способы, ваша кошка может съесть тостер и т.д.).

bindkey -e

function zle-line-init {
    marking=0
}
zle -N zle-line-init

function select-char-right {
    if (( $marking != 1 )) 
    then
        marking=1
        zle set-mark-command
    fi
    zle .forward-char
}
zle -N select-char-right

function select-char-left {
    if (( $marking != 1 )) 
    then
        marking=1
        zle set-mark-command
    fi
    zle .backward-char
}
zle -N select-char-left

function forward-char {
    if (( $marking == 1 ))
    then
        marking=0
        NUMERIC=-1 zle set-mark-command
    fi
    zle .forward-char
}
zle -N forward-char

function backward-char {
    if (( $marking == 1 ))
    then
        marking=0
        NUMERIC=-1 zle set-mark-command
    fi
    zle .backward-char
}
zle -N backward-char

function delete-char {
    if (( $marking == 1 ))
    then
        zle kill-region
        marking=0
    else
        zle .delete-char
    fi
}
zle -N delete-char

bindkey '^[[1;2D' select-char-left   # assuming xterm
bindkey '^[[1;2C' select-char-right  # assuming xterm

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