Comment définir et déterminer le mode d'édition en ligne de commande de Bash?

10

Comment définir le mode d'édition de la ligne de commande viou emacsle Bash ET comment déterminer le mode actuellement défini?

Blcknx
la source

Réponses:

6

Puisque votre question est spécifique à bash:

Pour le définir définitivement pour chaque nouvelle session:

echo 'set -o vi' >> ~/.bashrc

ou (recommandé), ajoutez (ou modifiez) une ligne dans ./inputrc:

set editing-mode vi

Cela définira le mode d'édition de readline qui est utilisé par plusieurs autres programmes à côté de bash.

Il est facile de désactiver les deux options:

shopt -ou vi emacs

Pour en définir un, soit:

set -o vi

Ou

shopt -os vi

Pareil pour emacs. Réglage des vidésarmements emacset vice-versa.

Pour répertorier l'état:

$ shopt -op emacs
set +o emacs

$ shopt -op vi
set -o vi

Ou les deux à la fois:

$ shopt -op emacs vi
set +o emacs
set -o vi

Pour tester si viest défini:

shopt -oq vi      &&   echo vi is set

Ou (syntaxe ksh):

[[ -o vi ]]        &&   echo vi is set

emacs:

shopt -oq emacs   &&   echo emacs is set

Ou:

[[ -o emacs ]]    &&   echo emacs is set

ou, pour tester qu'aucune option n'est définie:

! ( shopt -oq emacs || shopt -oq vi ) && echo no option is set
Isaac
la source
16

À set:

set -o vi

Ou:

set -o emacs

(régler l'un désactive l'autre. Vous pouvez faire set -o vi +o vipour désarmer les deux)

Vérifier:

if [[ -o emacs ]]; then
  echo emacs mode
elif [[ -o vi ]]; then
  echo vi mode
else
  echo neither
fi

Cette syntaxe vient de ksh. C'est set -o viPOSIX. set -o emacsn'est pas (comme Richard Stallman s'est opposé au emacsmode spécifié par POSIX) mais très courant parmi les implémentations de shell. Certains shells prennent en charge des modes d'édition supplémentaires. [[ -o option ]]n'est pas POSIX, mais pris en charge par ksh, bash et zsh. [ -o option ]est pris en charge par bash, kshet yash(notez qu'il -os'agit également d'un opérateur OU binaire pour [).

Stéphane Chazelas
la source
Cela fonctionne et il est surprenant, qu'il soit si difficile de déterminer le mode.
Blcknx
4
set -o | egrep -w '^emacs|vi'retournera si emacs ou vi est défini.
Stephen Harris
4

Il y en a aussi bind -V | grep editing-mode.

man bash est énorme mais mérite une lecture approfondie.

studog
la source