Esta pergunta segue diretamente da resposta . Neste caso, sou especificamente incapaz de entender a parte que diz:
Nesse sentido, seu comportamento é mais próximo do emacs do que no modo bash (readline) / ksh / zsh emacs, mas parte do editor de linha incorporado do driver do terminal (no modo canônico), onde Ctrl-Wexclui a palavra anterior (werase, também no vi )
Aqui estamos falando de shells e não de editores, que são dois programas completamente diferentes. O que significa dizer que o shell está em algum modo de editor?
PS: Você pode basear sua resposta na premissa de que eu entendo o que é um shell e como usar o vim para edição básica.
Respostas:
No modo "vi", você pode editar / navegar no prompt do shell atual como uma linha no editor vi. Você pode vê-lo como um arquivo de texto de uma linha. Analogamente, no modo "emacs", você pode editar / navegar na linha de comando atual usando (alguns) os atalhos do Emacs.
Exemplo
Por exemplo, no modo vi, você pode fazer algo como (no bash):
Em emacs-mode você pode bater por exemplo Ctrl+ Apara saltar no início de uma linha (vi: Ctrl+ [, 0ou ESC, 0). Você pode ativar o modo emacs via
set -o emacs
(no bash, ksh, zsh etc.).Leia a linha
Muitos programas interativos de linha de comando (incluindo o bash ) usam a biblioteca readline . Assim, você pode configurar qual modo de entrada usar (vi ou emacs) e outras opções em um único local, de modo que todos os programas que usam o readline tenham exatamente a mesma interface de edição / navegação.
Por exemplo, minha configuração de linha de leitura se parece com:
Por exemplo, zsh / ksh não usa o readline até onde eu sei, mas também suporta modos vi / emacs que são muito parecidos com o bash / readline.
Obviamente, o modo vi / emacs em um shell de linha de comando é apenas um subconjunto do conjunto completo de recursos do editor. Nem todo recurso faz sentido em um shell de linha de comando, e alguns recursos são mais complicados de oferecer suporte do que outros.
Modo canônico
Antes que os modos vi / emacs de shells interativos de linha de comando 'fossem inventados', seu shell usaria apenas o modo canônico do seu terminal, que fornece apenas um conjunto limitado de comandos de edição (por exemplo, Ctrl+ Wpara excluir a última palavra.
fonte
set -o | grep 'emacs\|vi'
. No zsh (onde eu tenho o modo vi), isso não funciona.Você notará que, quando você executa
cat
um prompt de shell em um terminal,cat
deve escrever para stdout o que lê de stdin, e pressionar a, você vê uma
eco de volta pelo driver do terminal, mascat
não escreve issoa
(você vê apenas uma
, aquele ecoado pelo driver do terminal).No entanto, se você digitar a Backspace b Enter, não verá a
cat
saídaa\010b\015
, masb\012
(b
e nova linha).Isso ocorre porque o driver do terminal (estamos falando de software no kernel, não no emulador de terminal
xterm
) implementa um editor de linhas muito básico quando no modo canônico . O driver do terminal pode ser configurado usandoioctl()
chamadas do sistema, como ao usar ostty
comando Por exemplo, para sair do modo canônico, você pode fazerstty -icanon
. Se você fizer:Em seguida, você verá o
echo
(com o qual você poderia ter desativadostty -echo
) e acat
saída ao mesmo tempo.Esse editor é um editor de linha. Ou seja, cabe ao usuário editar uma linha de texto até que seja enviada ao aplicativo que lê o dispositivo terminal ao pressionar Enter.
Os recursos de edição desse editor são muito limitados. Na maioria das implementações, existem apenas 4 chaves de edição (na verdade caracteres) também configuráveis com
stty
:^H
ou^?
geralmente): apaga o caractere anterior^U
geralmente): vazio (kill) a linha inserida até o momento^W
): apaga a palavra anterior^V
): insira o próximo caractere literalmente (cancele o significado especial de todos os itens acima)Antigamente, pensava-se que esse editor de linha de driver de terminal seria estendido com recursos mais sofisticados. É por isso que nenhum dos shells anteriores possui recursos de edição de linha de comando (você obteria os mesmos recursos de edição de linha no prompt do shell do que quando executava
cat
como fizemos acima).No entanto, isso realmente nunca aconteceu, talvez parte do motivo seja a bagunça com terminais diferentes que não enviam os mesmos caracteres em algumas teclas pressionadas, o que tornou evidente que isso não deve ser implementado no espaço do kernel.
Assim, alguns shells começaram a abandonar o modo canônico do driver do terminal e a implementar seu próprio editor de linha. Na época,
emacs
evi
eram os editores visuais de texto mais populares com ligação de teclas e modo de operação completamente diferentes. Emvi
, você tem um modo para inserir texto e outro para editar. Ememacs
, você está sempre entrando no modo de texto , mas a edição é feita pressionando as combinações de teclas (como^b
mover o caractere para trás).Não havia nenhum ponto para as conchas no momento apresentarem suas próprias chaves diferentes. Isso causaria frustração para as pessoas terem que aprender outra. No entanto, escolher um (
emacs
ouvi
) estilo sobre o outro teria sido uma maneira de alienar os usuários do outro editor.De acordo com https://www.usenix.org/legacy/publications/library/proceedings/vhll/full_papers/korn.ksh.a :
Então, em vez disso, eles implementaram ambos e uma interface para os usuários escolherem entre os dois.
ksh
foi provavelmente o primeiro no início dos anos 80 (reutilizando código que foi escrito separadamente para adicionar um modo vi e um modo emacs ao shell Bourne, como visto acima), seguido portcsh
(tcsh
inicialmente só tinhaemacs
ligação de teclas, ovi
modo foi adicionado posteriormente) e mais tardebash
ezsh
no início dos anos 90.Você alterna entre os dois modos em
bash
,zsh
ouksh
comset -o vi
ouset -o emacs
, e combindkey -e
oubindkey -v
emtcsh
ouzsh
.O POSIX na verdade especifica o
vi
modo e não oemacs
modosh
(a história mostraemacs
sh
que Richard Stallman se opôs ao POSIX especificar o modo para ).O modo padrão para
bash
, as variantes de domínio público deksh
(pdksh, mksh, oksh)tcsh
ezsh
é o modo emacs (embora comzsh
, sejavi
se você$EDITOR
forvi
), enquanto na AT&Tksh
é o modo burro , a menos que$EDITOR
ou$VISUAL
mencionevi
ouemacs
.ksh
posteriormente, também adicionou umgmacs
modo para acomodar os usuários de Goslingemacs
que lidavam de maneira Ctrl+Tdiferente.Agora a manipulação de
^W
ememacs
ou emtcsh
modo de emacs, provavelmente antecede awerase
personagem no editor de linha terminal, por isso não podemos culpá-los por isso e minha declaração sobre "partida ..." pode ser visto como enganosa. É só que eu acho que é irritante quando as coisas gostamemacs
,tcsh
ouinfo
se comportam de maneira diferente de tudo o resto quando você digita Ctrl-W. Você pode imaginar que eu achei muito mais irritante quando alguns aplicativos começaram a fechar a janela quando você digitou Ctrl-W.fonte
pdksh
também analisa$EDITOR
porvi
e alterna modos na inicialização; Eu removi isso paramksh
(especialmente porque eu realmente só mantenho o modo Emacs de qualquer maneira).^W
fechamento de janelas).