Changer la forme (ou la couleur) du curseur pour indiquer le mode vi dans bash

30

Pour clarifier: je ne demande pas comment changer le curseur lors de l'utilisation de vim dans un terminal . Je veux que le curseur change lors du basculement entre le mode d'entrée et le mode de commande dans le vi-mode de Bash:

set -o vi <CR> type some text <ESC> (the cursor changes shape/color)
i (cursor change back) etc... 

J'ai trouvé un script qui permet de changer la couleur du curseur sur les changements de mode dans zsh , mais je ne veux pas changer de shell uniquement pour cette seule fonctionnalité.

Existe-t-il un moyen d'amener le curseur à changer de forme, comme dans gvim, (ou même juste la couleur) lors du basculement entre les modes de commande et d'insertion sur la ligne de commande Bash?

joecan
la source
Même question dans SO pour Putty, pas de réponse tho :( - stackoverflow.com/questions/2393383/…
studgeek

Réponses:

5

ajoutez ces deux lignes à ~ / .inputrc :

set vi-ins-mode-string \1\e[5 q\2
set vi-cmd-mode-string \1\e[2 q\2
saints
la source
4
Cette réponse serait beaucoup plus utile si vous expliquez ce qu'ils font et fournissez un certain contexte, par exemple, si les paramètres nécessitent que l'utilisateur ait une version particulière de Readline.
Anthony G - justice pour Monica
:) voici l'entrée manuelle: gnu.org/software/bash/manual/html_node/…
Holytrousers
1
Cela ne fonctionnera que sur les terminaux et les émulateurs de terminaux qui comprennent DECSCUSR.
JdeBP
Je devais ajouter set show-mode-in-prompt onen ~/.inputrcaussi pour faire ce travail.
ronakg
4

Copié à partir d'ici - Style vim d'édition en ligne de commande

Devrait être disponible en bash4.3 - voir le changelog -

j.  New user-settable variable, show-mode-in-prompt, adds a characters to the
    beginning of the prompt indicating the current editing mode.

bash4.3 est actuellement au rcstade, vous devriez pouvoir obtenir des packages pour la plupart des distributions sans compiler à partir des sources, mais pas dans les référentiels principaux. Par exemple. Ubuntu (amd64) ici et Debian (dépôt expérimental) ici .

Graeme
la source
Notez que: l'invite ne sera pas mise à jour si vous utilisez une PS1 personnalisée qui contient un caractère de nouvelle ligne. trouvé ici
pgericson
@pgericson Il semble fonctionner avec une PS1 personnalisée contenant une nouvelle ligne pour moi sur bash 4.4.12.
DuBistKomisch
2

Je n'ai pas trouvé de vraie solution, mais cela pourrait peut-être vous aider (ou aider quelqu'un d'autre) à en trouver une meilleure.

Vous devez créer un script (par exemple kmtest.sh)

#!/bin/bash
# Script "kmtest.sh"

TEST=`bind -v | awk '/keymap/ {print $NF}'`
if [ "$TEST" = 'vi-insert' ]; then
   echo -ne "\033]12;Green\007"
else
   echo -ne "\033]12;Red\007"
fi

et après l'avoir ajouté à votre PS1, quelque chose comme:

export PS1="\u@\h \$(kmtest.sh)> "

mais comme je l'ai dit, ce n'est pas ce que vous voulez, car cela ne change la couleur du curseur qu'après un cr. Bonne chance

gb

gogolb
la source
Est-ce que cela a réellement fonctionné pour vous? Cela n'a pas fonctionné pour moi; il a juste rendu le curseur rouge. Je ne pense pas que kmtest.sh soit exécuté à chaque fois que je bascule entre les modes d'insertion et de commande. Il semble qu'il ne soit exécuté qu'à la création de l'invite.
joecan
1

Il semble qu'il y ait un moyen de le faire en piratant la ligne de lecture. Peut-être pourrions-nous faire pression pour qu'elle soit intégrée?

Voici ma réponse sur SO https://stackoverflow.com/a/12201092/255961 que je mettrai à jour si j'obtiens plus d'informations.

studgeek
la source
1

Bien que ce ne soit pas exactement ce que vous voulez (changer dynamiquement le curseur), bash 4.4 / readline 7.0 ajoutera le support pour changer dynamiquement l'invite . Vous pourrez spécifier des indicateurs de mode personnalisés pour les modes d'insertion / commande (c'est différent de l' show-mode-in-promptoption actuelle qui est codée en dur à utiliser +et: ).

Malheureusement, ces versions sont actuellement en version bêta et ne semblent pas encore avoir corrigé tous les bogues. Il leur manque également la possibilité de spécifier où, dans l'invite, vous souhaitez que l'indicateur de mode apparaisse.

Dans l'intervalle, j'ai publié des versions corrigées de bash 4.3 / readline 6.3 sur github avec cette fonctionnalité.

Dylan Cali
la source
0

J'ai posé la même question il y a quelque temps sur AskUbuntu lors de la transition de Gvim à Console Vim.

J'ai reçu une réponse, mais cela impliquait de basculer les paramètres du terminal gnome, et ces paramètres s'appliquaient sur tous les terminaux. Ainsi, il était possible que le curseur du terminal gnome soit parfois bloqué dans le mauvais état.

Je suis toujours intéressé à savoir si vous obtenez une solution satisfaisante, mais au fil du temps, je me suis ajusté au manque d'informations sur l'état du mode dans le curseur. Peut-être que j'appuie sur échapper plus souvent (par exemple, escpour m'assurer que je suis en mode commande; esc ipour m'assurer que je suis en mode insertion); je regarde peut-être l'état affiché en bas de l'écran; peut-être que je viens d'intérioriser le mode.

Jeromy Anglim
la source
3
Juste pour clarifier, votre question n'est pas la même que la mienne. Vous avez demandé comment changer le curseur dans Vim sur la console. Ceci est bien documenté sur le wiki Vim . Je veux savoir comment faire cela dans le vi-mode de Bash .
joecan