web-dev-qa-db-fra.com

Quelle est la différence entre les commandes s, c et r dans vi / vim?

J'essaie de clarifier cela dans le livre OReilly sur Vim, mais les exemples présentés ne sont pas assez clairs. Une clarification via des exemples/cas d'utilisation au lieu d'une explication directe serait très utile.

L'exemple de texte pourrait être:

With a
screen editor,
you can
scroll the page, move the cursor.
40
lalit

Supposons que vous avez foo dans le document et que le curseur se trouve sur f.

Maintenant, en appuyant sur rb cela changera en boo, et vous êtes de retour en mode commande. Appuyer sur sb accomplira la même chose, mais vous êtes en mode insertion et pouvez insérer plus de caractères. Enfin, c nécessite une sorte de mouvement; par exemple. vous pouvez taper cw pour supprimer l'intégralité de Word et passer en mode insertion. En revanche, cl est essentiellement identique à s.

69
chirlu
:help c
:help s
:help r

Facile.

Au lieu de perdre votre temps sur ce livre, découvrez comment utiliser la documentation interne impressionnante de Vim:

:h s
:h :command
:h 'option'
:h function()
:h ctrl-x
:h i_ctrl-x
:h subject
:h foo<Tab>
:helpgrep foo
23
romainl

Descriptions

s (s ubstitute) supprimera le caractère courant et placera l'utilisateur en mode insertion avec le curseur entre les deux caractères environnants. 3s, par exemple, supprimera les trois caractères suivants et placera l'utilisateur en mode insertion.

c (c hange) prend un mouvement vi/vim (tel que w, j, b, etc.) . Il supprime les caractères de la position actuelle du curseur jusqu'à la fin du mouvement. Notez que cela signifie que s est équivalent à cl (la documentation Vim elle-même prétend que ce sont des synonymes).

r (r eplace) ne passe jamais du tout en mode insertion. À la place, il attend un autre caractère, qu'il utilisera ensuite pour remplacer le caractère actuellement sous le curseur.

Exemples

Prenez votre exemple de texte et l'image du curseur au début du mot "can" (ligne 3).

Taper spl<Esc> dans vi/vim.

Ici, nous avons s pour s ubstitute. pl est le texte à insérer et <Esc> quittera le mode d'insertion. Ensemble, il changera can en plan comme ceci:

With a
screen editor,
you plan
scroll the page, move the cursor.

Taper cwcould<Esc> dans vi/vim.

c est pour c hange, et w indique à c de supprimer le prochain mot, can. Ensuite, nous tapons le texte pour le mode d'insertion, could. Enfin, nous devons taper <Esc> pour quitter le mode d'insertion. La commande changera can en could comme ceci:

With a
screen editor,
you could
scroll the page, move the cursor.

Taper rf dans vi/vim.

Ici, nous tapons r pour r eplace, puis f comme nouveau caractère que r utilise pour remplacer le caractère d'origine par. Cela change can en fan comme ceci:

With a
screen editor,
you fan
scroll the page, move the cursor.

Remarques

Il existe de nombreuses utilisations cachées des commandes simples de vi/vim qui mettent en évidence plus de différences entre ces commandes. Comme j'utilise presque toujours vim sur vi, ces fonctionnalités peuvent être exclusives à vim, je n'en suis pas certain.

Maximiser l'utilité de commandes comme c, y et d qui prennent des mouvements nécessite d'avoir une bonne compréhension des objets texte (type help text-objects in vim. Ce ne sont pas dans vi.)

Comme r prend un caractère au lieu de passer en mode insertion, vous pouvez saisir des caractères qui seraient autrement difficiles à ajouter. Taper r<C-R> (c'est r, puis ctrl -r) remplace le caractère actuel par un caractère ctrl-r. Cela peut être surprenant car appuyer sur ctrl-r en mode insertion attend une autre touche qui est le registre à coller.

Ces trois commandes peuvent être répétées avec le . commande, substituant, changeant ou remplaçant la même région par rapport au curseur par le texte donné.

Lorsque vous saisissez un nombre n avant la commande, s et c supprimez n éléments (caractères pour s ou mouvements pour c), puis insère du texte une fois. Toutefois, l'utilisation d'un nombre n avant r remplace les caractères n suivants par autant de copies du caractère choisi. Par exemple, 4r0 pourrait remplacer 1234 avec 0000 tout à la fois.

13
David J