Que fait: open do in vim?

18

La documentation de Vim a ceci à dire sur la :opencommande:

This command is in Vi, but Vim only simulates it:

                                                        *:o* *:op* *:open*
:[range]o[pen]                      Works like |:visual|: end Ex mode.
                                {Vi: start editing in open mode}

:[range]o[pen] /pattern/    As above, additionally move the cursor to the
                                column where "pattern" matches in the cursor
                                line.

Vim does not support open mode, since it's not really useful.  For those
situations where ":open" would start open mode Vim will leave Ex mode, which
allows executing the same commands, but updates the whole screen instead of
only one line.

Il ne commente pas la nature de la "simulation", et pourquoi elle est considérée comme une simulation plutôt qu'une véritable commande avec un comportement différent. Lorsqu'il est exécuté à partir du mode ex (Q), il se comporte en effet comme décrit.

Cependant, il semble également y avoir une commande ouverte différente. Lorsqu'il est exécuté à partir de la ligne de commande normale ou à partir du mode ex avec différents arguments, il semble être synonyme de :edit. Lorsqu'il est exécuté en mode commande avec a /pattern/, il positionne le curseur et s'exécute apparemment :edit(la position du curseur n'étant évidente que si: l'édition échoue.) Il peut également être exécuté en tant que :open /pattern/ file, ce qui positionne le curseur et s'exécute:edit file

Ma question est: pourquoi cela n'est-il pas documenté? Y a-t-il des différences par rapport à ce :editque je ne remarque pas? Était-il :openautrefois synonyme de :editet n'a été modifié que plus tard dans le but de se conformer à mi-chemin avec POSIX?

Aléatoire832
la source

Réponses:

13

Le «mode ouvert» de vi était utile pour les terminaux qui avaient une seule ligne, comme les terminaux sur papier. En mode ouvert, vi avait une "vue sur une seule ligne" du fichier. Le déplacement du curseur redessinerait la ligne entière et les caractères supprimés s'imprimeraient différemment.

La "simulation" que fait vim consiste simplement à soutenir la commande, à la faire agir (comme le dit la documentation) comme :visualet puisque :visualc'est "sinon la même chose que :edit", c'est probablement pourquoi vous la voyez agir comme :edit.

Du point de vue du code source, :openest implémenté dans ex_docmd.c( ex_open()). Il fait quelques trucs pour traiter le cas où il est fourni une expression régulière, mais se termine toujours par un appel à do_exedit().

L'implémentation de :edit, :baddet :visualest contenue dans la ex_edit()fonction dans le même fichier, et cette fonction est un appel direct à do_exedit()(rien d'autre). Ainsi, à l'exception de la gestion du paramètre d'expression régulière, le même code est appelé. do_exedit()est un peu velu, et son comportement est fortement modifié en fonction de la commande réelle qui a été émise, mais il ne vérifie jamais explicitement les jetons de commande pour ouvrir / modifier / visuel. Ainsi, les trois commandes entraînent l'exécution du même code plus ou moins do_exedit().


la source
8

D' une introduction à l'édition d'affichage avec Vi :

Si vous êtes sur un terminal papier ou un terminal qui n'a pas de curseur pouvant se déplacer hors de la ligne du bas, vous pouvez toujours utiliser le jeu de commandes de vi, mais dans un mode différent. Lorsque vous donnez une commande vi, l'éditeur vous indiquera qu'elle utilise le mode ouvert. Ce nom vient de la commande open dans ex, qui est utilisée pour entrer dans le même mode.

La seule différence entre le mode visuel et le mode ouvert est la manière dont le texte est affiché.

En mode ouvert, l'éditeur utilise une fenêtre à une seule ligne dans le fichier, et le déplacement vers l'arrière et vers l'avant dans le fichier entraîne l'affichage de nouvelles lignes, toujours en dessous de la ligne actuelle. Deux commandes de vi fonctionnent différemment en open: z et ^ R. La commande z ne prend pas de paramètres, mais dessine plutôt une fenêtre de contexte autour de la ligne actuelle, puis vous ramène à la ligne actuelle.

Si vous êtes sur un terminal papier, la commande ^ R retapera la ligne actuelle. Sur ces terminaux, l'éditeur utilise normalement deux lignes pour représenter la ligne actuelle. La première ligne est une copie de la ligne lorsque vous avez commencé à la modifier, et vous travaillez sur la ligne en dessous de cette ligne. Lorsque vous supprimez des caractères, l'éditeur saisit un certain nombre de \ pour vous montrer les caractères qui sont supprimés. L'éditeur réimprime également la ligne actuelle peu de temps après ces modifications afin que vous puissiez voir à nouveau à quoi ressemble la ligne.

Il est parfois utile d'utiliser ce mode sur des terminaux très lents qui peuvent prendre en charge vi en mode plein écran. Vous pouvez le faire en entrant ex et en utilisant une commande ouverte.

:openest un artefact d'origine de Vim en tant que clone Vi qui est complètement inutile aujourd'hui. Je peux seulement supposer qu'il reste là pour la compatibilité POSIX.

Malgré de vagues similitudes, :openn'est pas une alternative à :edittout effort d'imagination.

romainl
la source