Qual é a diferença entre `set -o emacs` e `bindkey -e`?

Qual é a diferença entre `set -o emacs` e `bindkey -e`?

Pelo que tenho visto, ambos set -o emacse bindkey -esão usados ​​para modificar o comportamento do seu editor de linha de terminal para emular, emacsenquanto set -o vie bindkey -vsão usados ​​para emular viatalhos de teclado. Como ambos set -oparecem bindkeyfazer a mesma coisa, fiquei me perguntando quais eram as diferenças entre os dois e se havia alguma diferença.

Parece que set -ofunciona para a maioria dos shells, embora bindkeyseja um zlecomando específico. Esta é a única diferença? Além disso, eles vinculam as mesmas chaves ou existem algumas chaves onde se set -ovinculam bindkeya operações diferentes?

Responder1

bindkey -v/-eé a tcshsintaxe (um bindkeybuiltin 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, bindkeyfoi adicionado o 2.0 em 1991 que veio com a primeira versão do zle (1.0 a versão anterior usada foi readlineemprestada do bash).

zsh, já que a primeira versão 1.0 tinha setoptque definir opções (além das opções passadas na linha de comando como em csh/Bourne), enquanto (t)cshe bashusava variáveis ​​especiais. No 2.0, uma -oopção (tanto para o intérprete quanto para o setbuiltin) foi adicionada para compatibilidade com ksh( bashele próprio converteu suas variáveis ​​especiais em opções definidas com um novo shoptbuiltin no 2.0 em 1996; esse é um conjunto separado de opções daqueles definidos set -olá; set -osuporte adicionado por volta de 1990).

As "opções" vie emacsnã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 emacsopção, ele desativa o vimodo.

Você notará isso zsh -o emacse zsh -o viatualmente não funciona corretamente nos relatórios zsh zsh: invalid module name `zsh/zle'na inicialização (umerro).

A maioria dos shells, inclusive, zshtambém seleciona o modo de edição padrão com base no valor das variáveis ​​de ambiente $EDITORe $VISUALpara tentar combinar o modo de edição de linha com a preferência do editor do usuário.

informação relacionada