272 votes

Quelle(s) commande(s) de Vim peut-on utiliser pour citer/décocter des mots ?

Comment puis-je rapidement citer/décocter des mots et modifier la citation (par exemple, de l'anglais au français) ? ' à " ) dans Vim ? Je connais le surround.vim mais je voudrais utiliser uniquement Vim.

1 votes

Une solution dépend vraiment du contexte. Voulez-vous le faire sur une seule ligne, ou dans tout le fichier, ou juste pour une seule chaîne entre guillemets ?

0 votes

Pour un seul mot ou tous les mots d'une ligne. Par exemple, lors de la conversion de mots collés en chaînes de caractères.

3 votes

Pour ne pas citer un mot : F'x,x (et en conséquence pour les guillemets doubles) ; pour passer du simple au double : F'r",. (et par conséquent l'inverse). Contrairement aux réponses très compliquées ci-dessous.

340voto

jamessan Points 16420

Surround.vim sera votre réponse la plus simple. Si vous êtes vraiment contre son utilisation, voici quelques exemples de ce que vous pouvez faire. Ce n'est pas forcément le plus efficace, mais c'est pour cela que surround.vim a été écrit.

  • Citer un mot, en utilisant des guillemets simples
    ciw'Ctrl+r"'

    • ciw - Effacer le mot sur lequel se trouve le curseur et se retrouver en mode insertion.
    • ' - ajouter la première citation.
    • Ctrl+r" - Insérez le contenu du " le registre, alias le dernier yank/suppression.
    • ' - ajoutez la citation finale.
  • Supprimez les guillemets simples d'un mot.
    di'hPl2x

    • di' - Supprime le mot entre guillemets simples.
    • hP - Déplacez le curseur d'une place vers la gauche (au-dessus de la citation d'ouverture) et placez le texte qui vient d'être supprimé avant la citation.
    • l - Déplacez le curseur d'un cran vers la droite (au-dessus de la citation d'ouverture).
    • 2x - Supprimez les deux citations.
  • Remplacer les guillemets simples par des guillemets doubles
    va':s/\%V'\%V/"/g

    • va' - Sélectionnez visuellement le mot cité et les guillemets.
    • :s/ - Commencez un remplacement.
    • \%V'\%V - Ne correspond que les guillemets simples qui se trouvent dans la région sélectionnée visuellement.
    • /"/g - Remplacez-les tous par des guillemets.

1 votes

Cela fonctionne bien pour moi. Je viens de vérifier sur Google que le collage en mode insertion est également possible avec Ctrl+op.

1 votes

Utilisé en combinaison avec le mode d'enregistrement (q), il fonctionne comme un charme pour les travaux rapides.

0 votes

Pourquoi ciw et pas seulement cw ? Je trouve le premier cas déroutant et le second fonctionne bien.

231voto

Installero Points 2044

Citer un mot, en utilisant des guillemets simples

ciw'Ctrl+r"'

C'était plus facile pour moi de le faire de cette façon.

ciw '' Esc P

10 votes

Malheureusement, cela ne semble pas permettre . (répéter).

2 votes

Je préfère cela car je peux l'utiliser sur les terminaux/repls avec le mode vim puisque Ctrl+r est généralement déjà utilisé pour la recherche de l'historique inverse.

6 votes

@wilmoore Enregistrez ce qui précède comme une macro, puis rejouez.

46voto

Geoff Reedy Points 16508

Voici quelques cartes qui pourraient vous aider :

:nnoremap <Leader>q" ciw""<Esc>P
:nnoremap <Leader>q' ciw''<Esc>P
:nnoremap <Leader>qd daW"=substitute(@@,"'\\\|\"","","g")<CR>P

Si vous n'avez pas modifié la variable mapleader, activez le mapping avec \q" \q' ou \qd . Ils ajoutent respectivement des guillemets doubles autour du mot situé sous le curseur, des guillemets simples autour du mot situé sous le curseur et suppriment tous les guillemets autour du mot situé sous le curseur.

0 votes

Une idée géniale ! J'ai fini par ajouter map <Leader>' gewi'<Esc>A'<Esc> à mon .vimrc pour insérer des commentaires entre guillemets de la position actuelle à la fin de la ligne ; ce qui m'a aidé lors de la conversion de certains scripts MSDOS en bash.

0 votes

@Geoff, cela fonctionne bien pour les guillemets simples, mais pour les guillemets doubles, il insère ` "" "" ` devant le mot.

0 votes

@RameshVel Il est possible que certaines de vos propres macros aient affecté le côté droit du mappage. J'ai mis à jour la commande de mappage en nnoremap afin que les autres mappages ne soient pas développés. J'ai également amélioré les mappings. Les précédents avaient des problèmes lorsque le curseur se trouvait sur le premier mot d'une ligne.

29voto

Matteo Riva Points 14340

En plus des autres commandes, ceci mettra tous les mots d'une ligne entre guillemets (comme dans votre commentaire).

:s/\(\S\+\)/"\1"/

ou si vous voulez réduire le nombre de barres obliques inverses, vous pouvez mettre un \v modificateur (très-magique) au début du motif

:s/\v(\S+)/"\1"/

1 votes

Le texte que j'ai copié contenait également des virgules, j'ai donc modifié le texte comme suit :s/\v([a-Z]+)/"\1"/g

24voto

James Scriven Points 2027

Pour mettre entre guillemets simples (par exemple) ciw'<C-r>"'<esc> fonctionne, mais répéter ne fonctionnera pas. Essayez :

ciw'<C-r><C-o>"'<esc>

Cela met le contenu du registre par défaut "littéralement". Vous pouvez maintenant appuyer sur . sur un mot pour le mettre entre guillemets. Pour en savoir plus, voir :h[elp] i_ctrl-r et plus sur les objets texte à :h text-objects

Source : http://vimcasts.org/episodes/pasting-from-insert-mode/

4 votes

Excellent conseil ! Si quelqu'un veut faire un mapping à partir de cela, la notation correcte est la suivante ciw'<C-R><C-O>"'<Esc> .

0 votes

Que fait exactement <C-r>" ?

0 votes

@CodeCrack C'est CTRL-R. CTRL-R insère le contenu du registre au curseur et reste en mode insertion.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X