Cette question découle directement de la réponse . Dans ce cas, je suis spécifiquement incapable de comprendre la partie qui dit:
À cet égard, son comportement est plus proche de celui d'Emacs qu'en mode bash (readline) / ksh / zsh emacs, mais s'écarte de l'éditeur de ligne intégré du pilote de terminal (en mode canonique), où Ctrl-Wsupprime le mot précédent (werase, également en vi ).
Nous parlons ici de shells et non d'éditeurs qui sont deux programmes complètement différents. Que signifie dire que le shell est dans un mode éditeur?
PS: Vous pouvez baser votre réponse sur la prémisse que je comprends ce qu'est un shell et comment utiliser vim pour l'édition de base.
Réponses:
En mode "vi", vous pouvez modifier / naviguer sur l'invite du shell actuel comme une ligne dans l'éditeur vi. Vous pouvez le regarder comme un fichier texte d'une ligne. De façon analogue, en mode "emacs", vous pouvez éditer / naviguer dans la ligne de commande actuelle en utilisant (certains) des raccourcis Emacs.
Exemple
Par exemple, en vi-mode, vous pouvez faire quelque chose comme (en bash):
En mode emacs, vous pouvez par exemple Ctrlappuyer Asur + pour sauter au début d'une ligne (vi: Ctrl+ [, 0ou ESC, 0). Vous pouvez activer le mode emacs via
set -o emacs
(en bash, ksh, zsh etc.).Readline
De nombreux programmes de ligne de commande interactifs (y compris bash ) utilisent la bibliothèque readline . Ainsi, vous pouvez configurer le mode d'entrée à utiliser (vi ou emacs) et d'autres options en un seul endroit de sorte que chaque programme utilisant readline ait exactement la même interface d'édition / navigation.
Par exemple ma configuration readline ressemble à:
Par exemple, zsh / ksh n'utilise pas readline pour autant que je sache, mais prend également en charge les modes vi / emacs qui sont très similaires à celui bash / readline.
Bien sûr, le mode vi / emacs dans un shell de ligne de commande n'est qu'un sous-ensemble de l'ensemble complet des fonctionnalités de l'éditeur. Toutes les fonctionnalités n'ont pas de sens dans un shell de ligne de commande et certaines fonctionnalités sont plus compliquées à prendre en charge que d'autres.
Mode canonique
Avant que les modes vi / emacs des shells de ligne de commande interactifs «ne soient inventés», votre shell n'utilisait que le mode canonique de votre terminal qui ne fournit qu'un ensemble limité de commandes d'édition (par exemple Ctrl+ Wpour supprimer le dernier mot.
la source
set -o | grep 'emacs\|vi'
. Dans zsh (où j'ai vi-mode), cela ne fonctionne pas.Vous remarquerez que lorsque vous exécutez
cat
à l'invite du shell sur un terminal,cat
étant censé écrire sur stdout ce qu'il lit à partir de stdin, et appuyez sur a, vous voyez una
écho en retour par le pilote du terminal, maiscat
n'écrit pas celaa
(vous voyez un seula
, celui repris par le pilote de terminal).Cependant, si vous tapez a Backspace b Enter, vous ne voyez pas la
cat
sortiea\010b\015
, maisb\012
(b
et la nouvelle ligne).C'est parce que le pilote de terminal (nous parlons de logiciel dans le noyau, pas dans l'émulateur de terminal comme
xterm
) implémente un éditeur de ligne très basique en mode canonique . Le pilote de terminal peut être configuré à l'aide d'ioctl()
appels système comme lors de l'utilisation de lastty
commande. Par exemple, pour quitter le mode canonique, vous pouvez le fairestty -icanon
. Si tu fais:Ensuite, vous verrez à la fois le
echo
(que vous auriez pu désactiverstty -echo
) et lacat
sortie en même temps.Cet éditeur est un éditeur de ligne. C'est-à-dire qu'il appartient à l'utilisateur de modifier une ligne de texte jusqu'à ce qu'elle soit envoyée à l'application lisant le terminal en appuyant sur Enter.
Les capacités d'édition de cet éditeur sont très limitées. Dans la plupart des implémentations, il n'y a que 4 touches d'édition (en fait des caractères) également configurables avec
stty
:^H
ou^?
généralement): effacer le caractère précédent^U
habituellement): vide (tue) la ligne entrée jusqu'ici^W
): efface le mot précédent^V
): entrez littéralement le caractère suivant (annulez la signification spéciale de tout ce qui précède)Dans le passé, on pensait que cet éditeur de ligne de pilote de terminal serait étendu avec des capacités plus sophistiquées. C'est pourquoi aucun des premiers shells n'a de capacités d'édition en ligne de commande (vous obtiendriez les mêmes capacités d'édition en ligne à l'invite du shell que lors de l'exécution
cat
comme nous l'avons fait ci-dessus).Cependant, cela ne s'est vraiment jamais produit, peut-être en partie à cause du désordre avec différents terminaux qui n'envoient pas les mêmes caractères lors de certaines pressions sur les touches, ce qui rendait évident que cela ne devrait pas être implémenté dans l'espace du noyau.
Certains shells ont donc commencé à abandonner le mode canonique du pilote de terminal et à implémenter leur propre éditeur de ligne. À l'époque,
emacs
etvi
étaient les éditeurs de texte visuel les plus populaires avec un mode de liaison et de fonctionnement des touches complètement différent. Dansvi
, vous disposez d'un mode de saisie de texte et d'un mode d'édition. Dansemacs
, vous êtes toujours en mode texte , mais l'édition se fait en appuyant sur des combinaisons de touches (comme^b
pour déplacer le caractère vers l'arrière).Il n'y avait aucun intérêt pour les shells à l'époque à proposer leur propre liaison de clés différente. Cela aurait causé de la frustration pour les gens à devoir en apprendre un autre. Cependant, choisir un (
emacs
ouvi
) style plutôt que l'autre aurait été un moyen sûr d'aliéner les utilisateurs de l' autre éditeur.Selon https://www.usenix.org/legacy/publications/library/proceedings/vhll/full_papers/korn.ksh.a :
Au lieu de cela, ils ont implémenté les deux et une interface permettant aux utilisateurs de choisir entre les deux.
ksh
était très probablement le premier au début des années 80 (réutilisation de code qui avait été écrit séparément pour ajouter un mode vi et un mode emacs au shell Bourne comme vu ci-dessus) suivi partcsh
(tcsh
initialement, il n'y avait qu'uneemacs
liaison de clé, levi
mode a été ajouté plus tard) et plus tardbash
etzsh
au début des années 90.Vous basculez entre les deux modes dans
bash
,zsh
ouksh
avecset -o vi
ouset -o emacs
, et avecbindkey -e
oubindkey -v
danstcsh
ouzsh
.POSIX spécifie en fait le
vi
mode et non leemacs
mode poursh
(l'histoire raconte que Richard Stallman s'est opposé à ce que POSIX spécifie leemacs
mode poursh
).Le mode par défaut
bash
, le domaine public variantes deksh
(pdksh, mksh, oksh),tcsh
etzsh
est le mode emacs (mais aveczsh
, il estvi
si votre$EDITOR
est -vi
), tandis que dans le AT & Tksh
, il est le muet mode à moins$EDITOR
ou les$VISUAL
mentionsvi
ouemacs
.ksh
a également ajouté plus tard ungmacs
mode pour accueillir les utilisateurs de Goslingemacs
qui géraient Ctrl+Tdifféremment.Maintenant, la gestion de
^W
inemacs
ou entcsh
mode emacs est probablement antérieure auwerase
caractère dans l'éditeur de ligne de terminal, donc nous ne pouvons pas vraiment leur en vouloir et ma déclaration sur le "départ ..." peut être considérée comme trompeuse. C'est juste que je trouve ça irritant quand des choses commeemacs
,tcsh
ouinfo
se comportent différemment de tout le reste lorsque vous tapez Ctrl-W. Vous pouvez imaginer que je l'ai trouvé beaucoup plus irritant lorsque certaines applications ont commencé à fermer leur fenêtre lorsque vous avez tapé Ctrl-W.la source
pdksh
parse également$EDITOR
pourvi
et commutateurs modes sur le démarrage; J'ai supprimé cela pourmksh
(d'autant plus que je ne maintiens vraiment le mode Emacs de toute façon).^W
fermer des fenêtres).