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!
Surround.vim devrait faire l'affaire. Si vous voulez répéter cela avec '.', Voyez ici .
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
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 enBonjour 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
ouyss)
.({ 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 deS<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 .
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
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)
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}
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)
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.
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.