Le mode Ex a-t-il une utilisation pratique?


115

Vim a un mode Ex qui peut être entré en entrant Q, et un mode de ligne de commande avec lequel vous pouvez entrer q:. Les nouveaux utilisateurs de vim se plaignent généralement d’entrer accidentellement dans ces modes lorsqu’ils tentent de quitter vim. En tant que tel, je désactive ces clés dans mon ~/.vimrcpour m'empêcher de les frapper accidentellement (en particulier q:):

map q: <Nop>
nnoremap Q <nop>

Bien que j'ai lu la documentation de vim sur Ex , que je sois un utilisateur moyennement expérimenté et que je comprenne l'idée de base qui la sous-tend, je ne parviens toujours pas à en trouver une utilisation dans mon utilisation quotidienne de vim. En général, cela semble moins utile que de simplement entrer une commande de ligne de commande vim standard avec le préfixe :, car les modifications ne sont pas immédiatement répercutées.

Ex a-t-il une utilisation quotidienne pratique dans Vim moderne? Y a-t-il quelque chose de plus facile à faire en mode Ex qu'avec les commandes standard? Quelle est la différence entre le mode ligne de commande et le mode ex?


13
Qet q:sont très différents. Vous faites seulement référence à Qdroite?
jamessan

@ jamessan, en fait, il s'avère que je n'étais pas sûr ... vous avez raison, ils semblent faire des choses différentes, même si j'avais supposé qu'ils étaient fondamentalement les mêmes. Si vous répondez à cette question, il serait peut-être utile de clarifier ce point, car je suis évidemment confus.
Andrew Ferrier

Cette question est en cours de discussion sur Meta .
200_success

1
@AndrewFerrier Vous avez posé une question sur q:spécifiquement et vous l'avez mentionnée comme étant, parmi les deux séquences de touches, celle qui vous pose le plus de problèmes. Et deux des réponses ici peuvent être utiles aux personnes qui le recherchent par le terme correct.
Random832

4
Lorsque vous apprendrez quoi q/et comment q:faire, vous les considérerez probablement comme les commandes les plus utiles de Vim. Et oui, vous savez déjà comment les utiliser, vous ne savez pas encore ce qu’ils font. Regardez ce screencast pour le découvrir.
Sato Katsura

Réponses:


81

Qest, comme vous l'avez trouvé, en mode ex. Ce n'est pas tout à fait utile d'utiliser interactivement, mais cela existe parce que Vim peut être utilisé pour émuler l'ancien exbinaire. En fait, de nombreux systèmes fournissent la excommande simplement en la liant à vim.

q:, ou :<C-f>, à la place, fournit un moyen de parcourir votre historique de ligne de commande et de le modifier comme un tampon normal. Cela facilite la recherche d'une commande précédente que vous avez exécutée, modifiez-la avec les commandes Vim normales, puis exécutez la commande modifiée. Les commandes q/et q?existent pour fournir les mêmes fonctionnalités pour l'historique de recherche.


64

Vim en mode Ex est utile lorsque:

  • Vous avez besoin de modifier (plusieurs) fichiers de manière non interactive (dans le cadre du script).
  • Votre connexion est très lente ou l'écran n'est pas mis à jour après vos actions.
  • Les mappages et abréviations sont désactivés.
  • Les clés communes telles que Escapeou Controlne fonctionnent pas correctement.

Fondamentalement, vile mode visuel de exVim Ex est simplement une émulation de ex(ils exécutent toujours le même code), il est donc possible d’obtenir le mode de commande de exvi et vice-versa. Il existe actuellement deux modes: le mode Ex ( vim -e) et le mode Ex amélioré qui permet des commandes plus avancées que le mode Ex compatible vi ( vim -E). Voir: Quelle est la différence entre le mode Ex et le mode Ex amélioré?

Ex est la racine d'une famille de rédacteurs en chef: edit, exet vi. Ex est un super-ensemble de ed, l'extension la plus notable étant une fonction d'édition d'affichage. ex (1)

Éditer des fichiers de manière non interactive est l’utilisation la plus courante et les utilisateurs l’utilisent de la même manière sedet awk, bien qu’ils soient davantage orientés vers le flux - ils lisent uniquement le fichier du début à la fin (ils ne sont pas conçus pour fonctionner avec plusieurs lignes ) while vimest orienté tampon: vous pouvez avancer ou reculer dans le fichier à votre guise, ce qui le rend si puissant.

Fondamentalement:

sedest un S tream ED Itor, pas un éditeur de fichiers.

Néanmoins, les gens semblent en abuser pour essayer d’éditer des fichiers et la vérité est qu’il ne les édite pas. Deuxièmement, ses options telles que in-place ( -i) sont des extensions FreeBSD non standard et peuvent ne pas être disponibles sur d'autres systèmes d'exploitation. Donc, si vous voulez éviter le code non transférable, les frais d’E / S et les effets secondaires négatifs (tels que la destruction des liens symboliques), vous devez utiliser exl’éditeur standard basé sur les commandes UNIX (avec ed) BashFAQ .


Une autre chose que je trouve utile en mode Ex est de l'utiliser comme un terrain de jeu (similaire à la pythonconsole) où vous pouvez exécuter plusieurs commandes à la suite, travailler / déboguer des expressions régulières, vérifier la configuration de vim, exécuter des commandes externes ou travailler avec des registres, etc. .

Par exemple:

let @d = '<td></td>'
let @r = '<tr>' . repeat(@d, 5) . '</tr>'
echo @r
let @t = '<table>' . repeat(@r, 5) . '</table>'
reg

ce qui est plus facile en mode Ex qu'en mode normal (où vous ne pouvez voir que votre dernière commande).


Usages pratiques

J'ai les alias suivants dans mon .bash_aliases:

alias trim="ex +'bufdo!%s/\s\+$//e' -scxa"
alias retab="ex +'set ts=2' +'bufdo retab' -scxa"

Remarque: L'utilisation bufdon'est pas exconforme à la méthode POSIX (selon le manuel ), vous pouvez donc envisager de l'utiliser avec find. Le !est utilisé pour forcer la commutation des tampons sans sauvegarder (sinon un avertissement est généré).

Le premier que j'utilise pour rogner les espaces de fin dans tous mes fichiers source, par exemple:

trim **/*.php

La seconde convertit tous les onglets en espaces (de manière récursive), par exemple:

retab **/*.php

Pour moi, utiliser retabsuffit, mais certains inconvénients sont décrits ici . Ajoutez un supplément -Vpour une sortie de verbosité accrue.

Notez que les exemples ci-dessus utilisant zsh / bash4 globbing ( **), assurez-vous donc que votre shell le supporte et qu'il est activé.

Pour des exemples plus pratiques (comme l'analyse de fichiers HTML), vérifiez:

Apprenez également plus sur le mode Ex sur:


Pouvez - vous s'il vous plaît poster un exemple de « l' édition (plusieurs) fichiers non-interactive » opération qui est plus simple à réaliser avec exqu'il est avec ed, sedou awk?
Sato Katsura

1
@SatoKatsura Ajout de deux utilisations pratiques qui traitent de plusieurs fichiers.
Kenorb

J'ai fouillé dans la documentation pour mieux comprendre le exmode. Je ne comprends pas pourquoi vous avez un bang ( !) dans votre commande de trimpseudonyme bufdo. Cela n'abandonnera-t-il pas simplement tous les changements dans tous les fichiers sauf le dernier? Si non pourquoi pas
Wildcard

@Wildcard Sans cela, !fondamentalement, cela ne fonctionnera pas, comme à chaque fois que la mémoire tampon est activée, exse plaindrait des modifications non enregistrées (et nous enregistrons les modifications à la fin avec xa). L’avertissement peut être désactivé, mais il est beaucoup plus facile de l’ajouter !.
Kenorb

Je vois ... Je suppose que je lis mal la documentation, alors; il spécifie que sans la !commande, la commande échouera si le tampon ne peut pas être abandonné, mais elle ne spécifie pas explicitement que !le tampon ne sera pas ignoré ... Donc, "abandonné" dans ce cas signifie "supprimé" , car il ne contient rien qui ne soit écrit sur le disque "? Ou quoi? (Je regarde :help bufdo)
Wildcard

18

J'utilise rarement le mode ex, mais quand j'en ai besoin, je suis reconnaissant de son existence.

J'accède parfois aux systèmes via ssh sur VPN, et ces connexions peuvent parfois devenir lentes. Pour aggraver le problème, j’ai parfois besoin d’éditer un fichier côté distant qui, en plus d’être derrière ssh et VPN, utilise une connexion série lente (donc 9600 bauds plus beaucoup de latence réseau).

Il arrive que ce soit comme cela que les retours visuels et les mises à jour d'écran deviennent plus un obstacle, car ce que je vois est retardé (l'effet est un peu comme parler dans un micro mais avec des haut-parleurs éloignés, comme dans un stade de sport. Les actions deviennent agitées. et parfois confus en raison de la réaction tardive).

Dans ce cas, le fait de ne pas afficher les modifications en retour est un avantage utile, car je peux en faire plus en moins de temps si je n'attends pas que l'écran se mette à jour.

Lorsque j'ai terminé les modifications, je retourne en mode visuel pour une mise à jour d'écran unique afin de réviser mon travail. Ensuite, je peux revenir en mode ex ou sauvegarder car j'ai terminé.


13

La fenêtre de ligne de commande est utile pour écrire des commandes longues et compliquées. Comme l'historique des commandes s'ouvre sous forme de fenêtre, vous pouvez utiliser n'importe quelle commande / mappage d'édition de vim.

Supposons que vous souhaitiez modifier une commande de substitution longue que vous avez exécutée une fois, mais que vous avez commis une erreur:

:%165,177s:here is a whole bunch of text I wnat to replace:here is the replacement:c

Afin de changer la chaîne de recherche, vous ne pouvez pas utiliser les mouvements vim comme bdans la ligne Ex pour naviguer (bien que je pense qu'il existe des mappages de touches pour cette navigation). Au lieu de cela, la plupart des gens appuient sur la flèche gauche plusieurs fois.

Une meilleure façon: appuyez sur q:pour aller dans la fenêtre de ligne de commande, kpour vous déplacer jusqu'à la dernière commande et pour naviguer avec des mouvements normaux vers la partie de la commande que vous souhaitez modifier. Vous voulez changer un mot entier, aucun problème: ciw.


OK merci. Etes - vous sûr q: est la ligne de commande Ex? L'aide utilise uniquement la phrase "Ex" pour le mode sélectionné Q, mais cela ne prend pas en charge l'édition standard de vim à laquelle vous faites référence q:, mais l'aide l'appelle simplement "Mode de ligne de commande". Je sais que j'ai confondu les deux au début, mais nous devrions probablement nous assurer que la distinction est claire.
Andrew Ferrier

1
J'ai cherché :help q:avant d'avoir décidé d'utiliser cette phrase, mais je pourrais être confus quant à la terminologie.
bsmith89

1
J'ai été confondu avec cette terminologie aussi. Je parle habituellement de taper une commande Ex comme suit :, mais je pourrais utiliser cette erreur.
bsmith89

3
Le contenu de votre réponse est tout à fait correct, mais la façon dont vous utilisez la terminologie est (pour moi) un peu déroutante. Je pense que vous interprétez la documentation légèrement à tort. q:ne pas ouvrir une ligne de commande Ex. Il ouvre la fenêtre de l'historique des commandes , dans laquelle les commandes Ex actuelles et précédentes peuvent être éditées. La ligne de commande Ex correspond à ce que vous obtenez lorsque vous appuyez sur :en mode normal.
Rich

3
FWIW Je pense que la documentation de Vim est également un peu confuse car, dans certains endroits, elle fait référence à toutes les :commandes en tant que commandes "Ex". À mon humble avis, seules les commandes réellement disponibles dans Ex doivent être considérées comme des commandes Ex.
Rich

6

Une personne malvoyante qui a commencé à devenir aveugle m'a dit de passer à ex, ce qui en fait un usage. Je suis moi-même considérablement plus âgé que vi et je suis passé d'ed à ex il y a longtemps (oui, je sais, "ed est l'éditeur standard"). La seule chose que je fais en mode vi, c'est% -bouncing pour faire correspondre les parens lors de l'écriture de code Lisp.


Cela me rappelle cette interview . Je ne me souviens pas si exspécifiquement a été mentionné cependant.
Martin Tournoij

Excellent aperçu, je n'aurais jamais pensé à cela. Merci beaucoup, bonne réponse.
Andrew Ferrier

2

Outre les utilisations déjà mentionnées ici, ex est également un moyen d’éditer des fichiers sur la console Linux si cela se trouve sur la plate-forme S / 390 et si la console est orientée ligne au lieu d’être écran.


0

Le mode Ex a-t-il une utilisation pratique?

Probablement pas. Cependant, bien que passer en mode Ex ne soit pas vraiment utile, il est toujours utile d'apprendre les commandes Ex, en particulier parce que vous utilisez des commandes d'édition ex avec :g/des commandes globales pour agir sur les lignes correspondantes.


-1

L'original "ex" était la version améliorée de l'éditeur de texte "ed" sous Unix. Dans 2BSD, un mode visuel a été ajouté et le nouvel éditeur s'appelle "vi".

Si on veut utiliser la ligne de commande ex, il passera en mode commande avec la touche ":". Donc, dans ma meilleure compréhension, ex n'est en fait pas là pour la nostalgie, c'est la partie pour fournir le mode commande.

Vous pouvez également entrer en mode insertion par

 :i 

puis appuyez sur "entrée et tapez votre texte. Quittez avec ^ c. Ou tapez le tout sur une seule ligne de commande, comme

 :i my multiline text \with a second line.^c

1
Étant donné que le mode Ex n'est pas tout à fait la même chose que le mode Ligne de commande , cela ne semble pas répondre à la question. Et comme note supplémentaire: le mode commande est un synonyme malheureux pour le mode normal, pas le mode ligne de commande.
8bittree

"Mode de commande" point pris. Seule excuse, lorsque nous avons changé en vi la nouvelle addition, nous étions considérés comme "visuels" (et non par le mode visuel actuel de Vim) par opposition à "commande" - maintenant, par ex. D'autre part, la ligne de commande semble invoquer le même do_cmdline () que ex. Non pas que cela suggère une "utilisation pratique", je l'avoue.
if2
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.