Как использовать shift для выбора части командной строки (как во многих текстовых редакторах)?
1 ответ
4
Один из способов сделать это
- определить новые виджеты, которые активируют маркировку на сдвинутых клавишах движения,
- переопределить все виджеты действий для работы с регионом (если есть) и
- переопределить все виджеты движения по умолчанию, чтобы отключить маркировку.
Вот подтверждение концепции (для 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