Uma maneira de fazer isso é
- define novos widgets que ativam a marcação em teclas de movimento deslocadas,
- redefina todos os widgets de ação para operar na região (se houver um) e
- redefina todos os widgets de movimento padrão para desativar a marcação.
Aqui está uma prova de conceito (para xterm
), trabalhando para:
-
Shift-Left
eShift-Right
: comece a selecionar à esquerda / direita, respectivamente -
Left
,Right
: cancelar a seleção e mover para a esquerda / direita, respectivamente, -
Delete
: excluir seleção se houver um, caso contrário, caractere sob o cursor.
Os avisos de isenção se aplicam (pode haver outras formas melhores, seu gato pode comer sua torradeira, etc.).
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