Pelo que tenho visto, ambos set -o emacs
e bindkey -e
são usados para modificar o comportamento do seu editor de linha de terminal para emular, emacs
enquanto set -o vi
e bindkey -v
são usados para emular vi
atalhos de teclado. Como ambos set -o
parecem bindkey
fazer a mesma coisa, fiquei me perguntando quais eram as diferenças entre os dois e se havia alguma diferença.
Parece que set -o
funciona para a maioria dos shells, embora bindkey
seja um zle
comando específico. Esta é a única diferença? Além disso, eles vinculam as mesmas chaves ou existem algumas chaves onde se set -o
vinculam bindkey
a operações diferentes?
Responder1
bindkey -v/-e
é a tcsh
sintaxe (um bindkey
builtin foi adicionado ao tcsh no 5.19PL2 em 1990), enquanto set -o vi/emacs
é a sintaxe do ksh (já presente no ksh85, provavelmente antes, pois o ksh tinha o modo emacs/vi pelo menos já em 1983).
No zsh
, bindkey
foi adicionado o 2.0 em 1991 que veio com a primeira versão do zle (1.0 a versão anterior usada foi readline
emprestada do bash
).
zsh
, já que a primeira versão 1.0 tinha setopt
que definir opções (além das opções passadas na linha de comando como em csh
/Bourne), enquanto (t)csh
e bash
usava variáveis especiais. No 2.0, uma -o
opção (tanto para o intérprete quanto para o set
builtin) foi adicionada para compatibilidade com ksh
( bash
ele próprio converteu suas variáveis especiais em opções definidas com um novo shopt
builtin no 2.0 em 1996; esse é um conjunto separado de opções daqueles definidos set -o
lá; set -o
suporte adicionado por volta de 1990).
As "opções" vi
e emacs
não foramadicionado ao zsh até 2003na versão 4.1.1 embora. O paradigma "opção" não é muito apropriado para isso, pois quando você define a emacs
opção, ele desativa o vi
modo.
Você notará isso zsh -o emacs
e zsh -o vi
atualmente não funciona corretamente nos relatórios zsh zsh: invalid module name `zsh/zle'
na inicialização (umerro).
A maioria dos shells, inclusive, zsh
também seleciona o modo de edição padrão com base no valor das variáveis de ambiente $EDITOR
e $VISUAL
para tentar combinar o modo de edição de linha com a preferência do editor do usuário.