2009-11-13 9 views
5

Du point de vue de la programmation, lorsque vous définissez le shell bash à utiliser vi ou emacs viautilisation Bash de vi ou emacs

set -o vi 

ou

set -o emacs 

Qu'est-ce qui se passe réellement ici? J'ai lu un livre où il prétend que le shell bash utilise l'un ou l'autre de ces éditeurs pour l'entrée dans le shell lui-même, mais je pensais qu'il pouvait avoir utilisé readline.

Répondre

5

Bash utilise toujours readline. Readline utilise le mode emacs ou vi et règle les changements de mode entre les différents modes d'édition. Vous pouvez vérifier le dossier lib/readline dans le code source de base pour voir les différentes liaisons de touches.

+0

'bind -p' vous montrera les raccourcis clavier actifs. –

+1

Notez également: si vous mettez 'set editing-mode vi' (ou' set editing-mode emacs') dans votre fichier ~/.inputrc, les autres programmes qui utilisent readline accepteront vos actions d'édition de ligne de commande préférées. Quand j'ai vu que cela donnait à ma capacité d'édition readline de shell de python je suis allé "ooh aah". Note pour Python cela ne fonctionne que dans le shell Python lancé à partir de la ligne de commande, pas Idle. – Aaron

1

Il utilise les séquences de touches qui sont familières aux utilisateurs de l'un de ces éditeurs pour modifier la ligne de commande. Readline est la fonctionnalité qui fournit cette fonctionnalité à Bash et à d'autres programmes.

De man bash:

 
READLINE 
     This is the library that handles reading input when using an interac‐ 
     tive shell, unless the --noediting option is given at shell invocation. 
     Line editing is also used when using the -e option to the read builtin. 
     By default, the line editing commands are similar to those of emacs. A 
     vi-style line editing interface is also available. Line editing can be 
     enabled at any time using the -o emacs or -o vi options to the set 
     builtin (see SHELL BUILTIN COMMANDS below). To turn off line editing 
     after the shell is running, use the +o emacs or +o vi options to the 
     set builtin. 
+0

ok mais pour l'entrée réelle il utilise readline? – Recursion

+0

Oui."Modifier" signifie l'entrée et l'édition. –

1

D'après ce que je sais, readline est ce qui fournit la fonctionnalité édition de la ligne pour bash. Une condition: lorsque vous appuyez sur v en mode de commande vi, vous obtenez l'éditeur vi complet pour modifier votre ligne de commande.

De man bash:

READLINE
          C'est la bibliothèque qui gère la saisie lors d'une shell interactif, sauf si l'option --noediting est donnée à l'appel du shell. Par défaut, les commandes d'édition de ligne sont similaires à celles d'emacs. Une interface d'édition de ligne de type vi est également disponible. Pour désactiver la modification de ligne après l'exécution de l'interpréteur de commandes, utilisez les options +o emacs ou +o vi pour intégrer le code set.

Lorsque le shell vous présente une invite (sauf si vous êtes en mode non-édition), vous êtes déjà en utilisant readline. Vous serez soit en mode emacs soit en mode d'insertion vi (c'est pourquoi vous pouvez simplement utiliser ESC pour revenir au mode de commande vi).

+0

C'est quand vous appuyez sur 'v' en mode de commande ** en mode' vi'. –

1

Selon les BASH_BUILTINS page de manuel (1) (sur Fedora 8):

set [--abefhkmnptuvxBCHP] [-o option] [arg ...] 

... (sauter toutes les options une seule lettre)

 
     -o option-name 
      The option-name can be one of the following:

...

   emacs Use an emacs-style command line editing interface. This is 
        enabled by default when the shell is interactive, unless the 
        shell is started with the --noediting option. 
. ..
 
      vi  Use a vi-style command line editing interface. 
J'interprète cela comme signifiant que bash interprète directement les commandes pour l'édition de ligne. Cette option définit simplement quel jeu de commandes utiliser. Voir la page man pour readline (3).

Questions connexes