Eu usaria zsh
, onde o editor de linhas tem muito mais recursos e é muito mais personalizável:
#! /bin/zsh -
insert-and-accept() {
zle self-insert
# RBUFFER= # to discard everything on the right
zle accept-line
}
zle -N insert-and-accept
bindkey ";" insert-and-accept
bindkey "^M" self-insert
vared -p "><> " -c srcCommand
Com bash-4.3
ou acima, você pode fazer algo semelhante com um hack como:
# bind ; to ^Z^C (^Z, ^C otherwide bypass the key binding when entered
# on the keyboard). Redirect stderr to /dev/null to discard the
# useless warning
bind '";":""' 2> /dev/null
# new widget that inserts ";" at the end of the buffer.
# If we did bind '";":";"', readline would loop indefinitely
add_semicolon() {
READLINE_LINE+=";"
((READLINE_POINT++))
}
# which we bind to ^Z
bind -x '"":add_semicolon' 2> /dev/null
# read until the ^C
read -e -d $'' -t 180 -p '><> ' srcCommand
Observe que, nessa versão, o ;
é sempre inserido no final do buffer de entrada, não na posição atual do cursor. Altere o add_semicolon
para:
add_semicolon() {
READLINE_LINE="${READLINE_LINE:0:READLINE_POINT++};"
}
Se você quiser inseri-lo no cursor e tudo o que está à direita é descartado. Ou:
add_semicolon() {
READLINE_LINE="${READLINE_LINE:0:READLINE_POINT};${READLINE_LINE:READLINE_POINT}"
READLINE_POINT=${#READLINE_LINE}
}
se você quiser inseri-lo no cursor, mas quiser preservar o que está à direita, como na abordagem zsh
.
Se você não quiser o ;
em $srcCommand
, você pode retirá-lo depois com srcCommand="${srcComman//;}"
, por exemplo, mas será necessário inseri-lo no widget para que ele seja exibido por zle
/ readline
.