web-dev-qa-db-fra.com

Clôturer entre parenthèses avec Vim

Existe-t-il un moyen de mettre du texte entre parenthèses (ou entre accolades) dans vim? 

En d'autres termes, comment feriez-vous cela?

Chaîne initiale:

It is sunny outside.

Chaîne finale:

It is (sunny) outside.

Sur une note amusante, je viens de frapper :w pour soumettre cette question. 

Heureux vim-ing, SOCommunity!

52
eqb

Surround.vim devrait faire l'affaire. Si vous voulez répéter cela avec '.', Voyez ici .

32
mwilson

Pour un mot, j'ai utilisé:

bcw()<Esc>P

En d’autres termes, allez au début du mot, coupez le mot et passez en mode insertion, tapez les crochets, puis quittez le mode insertion et collez le mot dans.

Gardez à l'esprit que cela écrasera votre registre yank.

Vous pouvez bien sûr remplacer bcw par le type de mouvement et de sélection dont vous avez besoin, comme

5cc{<Enter>}<Esc>P
58
Ian Hatch

Voici des exemples utilisant surround.vim . En mode normal vim, placez votre curseur sur le mot souhaité (ensoleillé dans ce cas) et tapez:

ysiw

Puis tapez )

Alors:

chaîne initiale:

It is sunny outside.

Chaîne finale:

It is (sunny) outside.

Espace supplémentaire: Utilisez le parenthèse d'ouverture, ou un crochet, comme ysiw( pour entourer de parens et d'un espace entre paren et début + fin de Word)

Plus facile en mode visuel Passez en mode visuel en appuyant sur v. Maintenant, si vous tapez S(, le mot sera entouré d'espaces. Toutefois, si vous utilisez le ) de fermeture à la place de S), il ne sera pas entouré d'espaces.

Ceci s'applique à tous les environnements de paire de crochets, <> [] {} (), pas simplement à (). Le comportement de S< est tel qu'il attend une balise Enclosure de sorte que seul S> puisse entourer en tant que <>.

Plus:

Tapez ysiw suivi de } pour faire la même chose pour les curlies

Pourrait aussi bien ajouter quelques exemples ici:

  • tapez cs(' à [c] accrocher [s] les arrondissements de (à '

  • cs'( pour passer de 'environs à ()

  • ds(. à [d] elete ( [s] tout à fait autour

Encore plus:

Et pourquoi ne pas citer le reste de la page de Tpope pour nous éviter de cliquer sur le lien?

// commence la citation:

C'est plus facile à expliquer avec des exemples. 

Appuyez sur cs"' à l'intérieur

"Bonjour le monde!" pour le changer en

'Bonjour le monde!'

-

Maintenant, appuyez sur cs'<q> pour le changer en

Bonjour le monde!

-

Pour boucler la boucle, appuyez sur cst" pour obtenir

"Bonjour le monde!"

-

Pour supprimer complètement les délimiteurs, appuyez sur ds"..

Bonjour le monde!

-

Maintenant, avec le curseur sur "Bonjour", appuyez sur ysiw] (iw est un objet texte).

[Bonjour le monde! Faisons ces accolades et ajoutons de l'espace (utilisez} Au lieu de {sans espace): cs]{

{ Bonjour le monde!

-

Enroulez maintenant la ligne entière entre parenthèses avec yssb ou yss).

({ Bonjour le monde!)

-

Revenir au texte d'origine: ds{ds)

Bonjour le monde!

-

Soulignez le bonjour: ysiw<em>

Bonjour monde!

-

Enfin, essayons le mode visuel. Appuyez sur une majuscule V (pour le mode visuel linéaire ) Suivie de S<p class="important">.

<p class="important">
  <em>Hello</em> world!
</p>

Ce plugin est très puissant pour l'édition HTML et XML, un créneau qui semble actuellement sous-exploité dans Vim Land. (Par opposition à l'insertion HTML/XML, pour laquelle de nombreux plugins sont disponibles). Ajouter, modifier et supprimer des paires de balises simultanément est un jeu d'enfant.

La commande . fonctionnera avec ds, cs et yss si vous installez repeat.vim .

25
Danny
6
Ahmed Kotb

Vous pouvez définir un mappage simple pour ce genre de chose. Cela devrait le faire. En mode normal, tapez z pour entourer un mot entre parenthèses. 

:nnoremap <leader>z viw<esc>a)<esc>hbi(<esc>lel
6
Rook

Pourquoi ne pas utiliser :s// ( rechercher et remplacer )?

Par exemple:

:s/sunny/(&)/

Vous avez probablement autre chose en tête, mais je ne peux pas dire de votre question ce que c'est.

(& est un raccourci pour le texte correspondant)

3
jwd

Vous pouvez utiliser les commandes suivantes:

cw(<C-r><C-o>")<ESC>

L'avantage est que vous pouvez utiliser la commande dot pour répéter cette action pour différents mots. Cela fonctionne pour les enceintes personnalisées aussi, par exemple:

Avant le changement:

Word

puis utilisez la commande:

cw\enquote{<C-r><C-o>"}<ESC>

Résultat final:

\enquote{Word}
1
Cur1o5

Je sais que c’est une vieille question, mais une solution aussi complexe n’a pas encore été mentionnée et je suis certaine que cela pourrait aider quelqu'un. Dans mon .vimrc fichier, j'ai une ligne comme celle-ci:

xnoremap <silent> ( <ESC>:let p = &paste<CR>:set paste<CR>:let a = line2byte(line('.')) + col('.')<CR>gvc()<ESC>:if getregtype() ==# 'V'<CR>call setreg('"', substitute(@", '\n$', '', ''), 'c')<CR>endif<CR>P:exe "goto ".a<CR>:exe "let &paste=".p<CR>

Il suffit de sélectionner du texte en mode visuel et d’appuyer sur (. Ce mappage fonctionne également pour le mode visuel linéaire et par blocs.

Comment ça marche?

<ESC> quittera le mode visuel

:let p = &paste<CR>:set paste<CR>...:exe "let &paste=".p<CR> s'assurera que la macro sera exécutée en mode coller (car autoindent et des améliorations similaires pourraient inclure des espaces supplémentaires que nous ne souhaitons pas), tandis que l'état de collage après la macro restera identique à celui avant l'exécution de la macro.

:let a = line2byte(line('.')) + col('.')<CR> trouvera le décalage d'octet actuel (basé sur 1)

gv resélectionnera le texte précédemment sélectionné

c supprimera la sélection et nous amènera en mode insertion pour remplacer la sélection

()<ESC> mettra nos parenthèses désirées et quittera le mode insertion

:if getregtype()==#'V'<CR>call setreg('"',substitute(@",'\n$','',''),'c')<CR>endif<CR> enlèvera le \n final du registre non nommé (") et changera son type en caractère, mais seulement s'il le faisait avant (pour permettre le collage à partir du registre entre parenthèses)

P va coller le texte précédemment remplacé entre parenthèses

:exe "goto ".a<CR> ramènera le curseur sur la position précédente (goto utilise un décalage basé sur 0, nous n'avons donc pas besoin d'incrémenter la position précédemment enregistrée d'une unité à cause de la parenthèse gauche insérée)

0
Eamileann

Pour quelque chose comme cela, il est probablement préférable de jouer avec des gammes et des groupes que d'utiliser des plugins externes:

:%s~\v(\w{5}) ~(\1) ~g

ce qui précède recherche un mot de 5 lettres suivi d’un espace, regroupe la correspondance à l’aide de () et la remplace par les parenthèses qui entourent la correspondance groupée.

0
gts

Je préfère ne pas utiliser de plug-ins et je veux que tout reste restreint à mes fichiers de points pour une portabilité facile. Le moyen le plus simple auquel je puisse penser est simplement de l’enregistrer et de le rejouer. Si vous prévoyez de l’utiliser plus souvent d’une session à l’autre, vous pouvez également mapper la clé dans votre fichier .vimrc, mais je n’en ai pas besoin (et j’ai vraiment du mal à déterminer la frappe à mapper). 

En supposant que vous ayez une compréhension de vim de niveau débutant, disons que j'ai une ligne (pour des raisons de simplicité) que je souhaite entourer de crochets. par exemple.

hello world

Passez en mode normal. q1 pour commencer l'enregistrement. Maintenant, fais ce qui suit

ESC ^i[ ESC $a] ESC

Cela laissera la ligne actuelle entre parenthèses. Vous pouvez maintenant choisir n’importe quelle ligne et appuyer sur @1 pour la répéter. 

Si, par exemple, vous souhaitez que le mot actuel soit entre parenthèses, il vous suffit d’enregistrer et de lire la recette suivante:

ESC bi[ ESC ea] ESC

Vous pouvez bien sûr essayer d’optimiser pour les frappes au clavier, mais cela me sert pour le moment. 

0
zakishaheen