Comment afficher le mode Vi actuel lors de l'utilisation des raccourcis clavier Vi dans le shell?


15

J'utilise les raccourcis clavier vi dans mon shell tcsh.

Maintenant, je ne sais pas dans quel mode vi je suis ( insertmode ou commandmode), ce qui entraîne beaucoup de frustration.

Quelqu'un connaît-il un moyen d'afficher le mode vi actuel dans le shell? (en incluant dans l'invite ou quelque chose)

Réponses:


4

Je ne crois pas qu'il existe un moyen de déterminer visuellement dans quel mode vous êtes, mais si vous modifiez un peu votre comportement, cela n'aura pas d'importance.

Si vous souhaitez être en mode commande, appuyez sur ÉCHAP avant de taper une commande.

Si vous souhaitez être en mode insertion, appuyez sur ESC et i avant de saisir du contenu.

Vous finirez par appuyer beaucoup sur ESC, mais chaque utilisateur vi que j'ai rencontré le fait de toute façon.


1
Le problème est que, dans le shell, les ESC supplémentaires ne sont pas ignorés - lorsque je donne un ESC supplémentaire, puis tape une commande (dites h pour vous déplacer vers la gauche), il émet simplement un bip et ne fait rien.
sundar

2
Par "extra ESC", je veux dire appuyer sur ESC quand je suis déjà en mode commande - ce que je fais beaucoup car je ne sais pas dans quel mode je suis.
sundar - Rétablir Monica

Vous avez raison. Je l'utilise depuis si longtemps que je ne remarque même plus ce comportement. Encore une fois, la réponse la plus simple. Si vous appuyez sur ESC et h et que rien ne se produit, appuyez de nouveau sur h. Je pense que cela ouvre une autre question. Pourquoi le fait d'appuyer sur ESC en mode 'commande' des raccourcis clavier vi empêche-t-il le caractère suivant d'être interprété correctement? vi lui-même ne fait pas cela. Je peux taper ESC 10 fois et la commande suivante fonctionne toujours comme prévu.
Bob Weber

Un autre conseil, éteignez la cloche. C'est incroyablement ennuyeux juste pour la raison que vous décrivez - et parce qu'il émet un bip à la fin de la tabulation. Il existe différentes manières de procéder en fonction de votre environnement.
Bob Weber

1
Ok, j'essaie actuellement cette solution. Le mappage du verrouillage des majuscules à l'évasion a facilité l'implémentation, mais je ne suis pas encore habitué à ESC-i pour le mode insertion. J'espère que je le ferai bientôt. > Si vous appuyez sur ESC et h et que rien ne se passe, appuyez à nouveau sur h Le problème est que c'est assez frustrant et brise beaucoup le flux. C'est une chose supplémentaire à laquelle je dois penser en plus de la commande que je forme. Je préfère les raccourcis clavier vi pour la raison même qu'ils sont dans ma mémoire musculaire et donnent une chose de moins à penser - ce genre de rupture cet objectif lui-même ...
Sundar - Rétablir Monica

3

J'ai parcouru la documentation et je dois dire que je n'ai trouvé aucun moyen de détecter et d'afficher le vi-mode actuel. J'espère que vous aurez une agréable surprise et que quelqu'un trouvera une solution, mais je ne vois certainement pas de moyen de faire ce que vous demandez.

Je pense qu'il y a un moyen de le faire, mais c'est une exagération massive pour une petite gêne, et je ne pense pas que c'est ce que vous aviez en tête lorsque vous avez posé cette question. Si cela est vrai, arrêtez de lire maintenant et profitez de votre vie.

OTOH, si c'est vraiment votre bête noire, et que cela vous rend fou, et que vous voulez vraiment absolument désespérer de toucher ce problème, voici mon idée de la façon de procéder:

  1. Obtenez une copie de la programmation avancée dans l'environnement UNIX (R) de W. Richard Stevens.
  2. Lisez les chapitres sur les flux et les E / S du terminal.
  3. Téléchargez le code source dans le livre susmentionné, qui comprend un exemple de flux pouvant être superposé sur un terminal.
  4. Implémentez votre gestion de la combinaison de touches Échap (ou les deux touches de changement de mode) et indiquez-la via une cloche ou une manipulation en arrière-plan de la ligne actuelle.

En bref, Unix implémente les E / S du terminal en tant que flux d'E / S en duplex intégral entre le pilote de périphérique et le processus utilisateur, dans lequel des modules peuvent être insérés. Il est organisé comme une pile, vous pouvez donc superposer autant de flux que vous le souhaitez. La somme des flux injectés crée votre comportement d'E / S de terminal.

Lorsqu'un personnage est entré, le premier module doit l'inspecter et le transmettre (s'il le souhaite). Lorsque la réponse arrive dans la direction opposée, elle a à nouveau l'occasion de l'inspecter et de la transmettre. C'est ainsi qu'un Ctrl-C est traité à un niveau supérieur à une touche de caractère normale.

Vous pouvez créer un binaire implémentant un module de flux qui, lorsqu'il est appelé, s'exécute silencieusement au premier plan, inspectant et transmettant toutes les frappes, effectuant votre action préférée sur les frappes qui vous intéressent. À toutes fins utiles, il semblera que vous travaillez sur le shell. Oooh. Vous pouvez invoquer ce binaire sur la dernière (ou la première, ou n'importe quelle) ligne de votre .tcshrc et vous ne sauriez même pas qu'il est là.

Il y a une bonne introduction ici , mais je n'ai pas trouvé grand-chose sur ce sujet, probablement parce qu'il a dépassé son apogée.


2

Cette page a un script assez détaillé qui définit ce que vous voulez (et plus) dans zsh . Peut-être pourrait-il être adapté pour fonctionner avec tcsh (je ne connais pas très bien ce shell).


Je ne connais pas non plus tcsh, mais je pense que la page que vous avez montrée utilise des widgets zsh (avec zle). Je ne pense pas que d'autres obus aient cela, mais s'ils le font, cela ferait certainement l'affaire.
BrianH

1

À toute personne ayant ce problème exact (comme moi): j'ai trouvé une solution à stackoverflow . Apparemment, il existe un support natif pour cela dans readline, vous pouvez donc simplement ajouter ce qui suit à votre ~/.inputrc:

set show-mode-in-prompt on

Et pour personnaliser l'utilisation réelle des personnages:

set vi-ins-mode-string "custom-ins"
set vi-cmd-mode-string "custom-cmd"

0

Édition en ligne de commande avec tcsh

Il existe deux modes principaux d'édition de la ligne de commande,
basés sur les deux éditeurs de texte les plus couramment utilisés, Emacs et vi.

Avec les liaisons vi , vous devez basculer entre les modes d' insertion et de commande ;
différentes commandes sont utiles dans chaque mode.

Le mode vi a deux sous-modes, lemode d' insertion et le mode de commande .

  • Le mode par défaut est insérer .
  • Vous pouvez basculer entre les modes en appuyant surEsc .
  • Alternativement, en mode commande ,
    taper 'a' (ajouter) ou 'i' (insérer) vous ramènera en mode insertion
    .

Plus de notes sur la page de tcshpersonnalisation déjà liée ci-dessus.


2
Vos liens vont aux livres O'Reilly sous copyright ...
BrianH

0

J'ai eu exactement le même problème et par accident j'ai trouvé la solution. Bien que ce fil soit ancien, je n'ai trouvé aucun autre site Web offrant une solution, donc je suppose que publier sur ce fil est correct.

Réinitialisez simplement les paramètres de votre programme terminal ou de votre shell. J'utilise actuellement PuTTY, et je viens de supprimer mes paramètres enregistrés pour ma connexion enregistrée et recréé une session enregistrée. A fonctionné comme un charme.

J'espère que cela t'aides!


0

Veuillez voir ma réponse sur SO . Bash 4.4 / Readline 7.0 ajoutera la prise en charge de cette fonctionnalité, et dans l'intervalle, j'ai publié des versions corrigées de Bash 4.3 / Readline 6.3 sur github .

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.