Quelle (s) commande (s) Vim peut-on utiliser pour citer / retirer des mots?

204

Comment puis-je rapidement citer / retirer des mots et modifier les citations (par exemple de 'à ") dans Vim? Je connais le plugin surround.vim , mais je voudrais utiliser uniquement Vim.

Eugene Yarmash
la source
Une solution dépend vraiment du contexte. Voulez-vous le faire sur une seule ligne, ou dans le fichier entier, ou simplement pour une seule chaîne entre guillemets?
Lucas Oman
Pour un seul mot ou tous les mots d'une ligne. Par exemple, lors de la conversion de mots collés en littéraux chaîne.
Eugene Yarmash

Réponses:

253

surround.vim va être votre réponse la plus simple. Si vous êtes vraiment opposé à son utilisation, voici quelques exemples de ce que vous pouvez faire. Pas nécessairement le plus efficace, mais c'est pourquoi surround.vim a été écrit.

  • Citez un mot en utilisant des guillemets simples
    ciw'Ctrl+r"'
    • ciw - Supprimez le mot sur lequel se trouve le curseur et finissez en mode insertion.
    • ' - ajoutez la première citation.
    • Ctrl+r"- Insérez le contenu du "registre, alias la dernière copie / suppression.
    • ' - ajoutez le devis de clôture.

  • Annuler la citation d'un mot entre guillemets simples
    di'hPl2x
    • di' - Supprimer le mot entre guillemets simples.
    • hP - Déplacez le curseur vers la gauche d'un endroit (en haut de la citation d'ouverture) et placez le texte juste supprimé avant la citation.
    • l - Déplacez le curseur d'un endroit vers la droite (en haut de la citation d'ouverture).
    • 2x - Supprimez les deux guillemets.

  • Changer les guillemets simples en 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 qu'à des guillemets simples qui se trouvent dans la région sélectionnée visuellement.
    • /"/g - Remplacez-les tous par des guillemets doubles.
jamessan
la source
1
Cela fonctionne bien pour moi. Juste googlé que le collage en mode insertion est également possible avec Ctrl + op.
Eugene Yarmash
1
Utilisé en combinaison avec le mode d'enregistrement (q), fonctionne comme un charme pour les travaux rapides.
évêque le
Pourquoi ciwet pas seulement cw? Je trouve le premier déroutant et le second fonctionne très bien.
Big McLargeHuge
18
@Koveras ciwfonctionne indépendamment de l'endroit où se trouve votre curseur dans le mot. cwne fonctionne que si votre curseur est au début du mot. Tu vois :help iw.
jamessan
10
Détourner la première réponse pour donner une petite astuce: si vous avez plusieurs mots pour remplacer la citation simple entre guillemets, vous remarquerez peut-être que la première solution de @jamessan ne fonctionne pas avec la .commande. Pour le faire fonctionner, utilisez ciw' Ctrl+r Ctrl+p". Se .comportera alors comme vous le souhaitez pour le mot suivant: au lieu de se souvenir du contenu du registre, il se souviendra que vous voulez tout ce qui est dans le registre en ce moment (un peu difficile à expliquer, mais si vous essayez les deux, cela deviendra évident :-))
autra
182

Citez 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
installero
la source
8
Malheureusement, cela ne semble pas le permettre. (répéter).
Wil Moore III
2
Je préfère cela car je peux l'utiliser sur des terminaux / repls avec le mode vim car Ctrl + r est généralement déjà utilisé pour la recherche d'historique inversée.
krock
3
@wilmoore Enregistrez ce qui précède en tant que macro, puis relisez.
Christopher
30

Voici une cartographie qui pourrait 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 mappage avec \q" \q'ou \qd. Ils ajoutent des guillemets doubles autour du mot sous le curseur, des guillemets simples autour du mot sous le curseur, suppriment respectivement les guillemets autour du mot sous le curseur.

Geoff Reedy
la source
Idée géniale! J'ai fini par ajouter map <Leader>' gewi'<Esc>A'<Esc>à mon .vimrcfichier pour insérer des commentaires de guillemet simple de la position actuelle jusqu'à la fin de la ligne; ce qui m'a aidé lors de la conversion de certains scripts MSDOS en bash.
ILMostro_7
@Geoff, cela fonctionne très bien pour les guillemets simples. mais pour les guillemets doubles, il instaure "" "" "` devant le mot
RameshVel
@RameshVel Il est possible que vous ayez eu certaines de vos propres macros qui ont affecté le côté droit du mappage. J'ai mis à jour la commande de mappage vers nnoremap afin que les autres mappages ne soient pas développés. J'ai également amélioré les mappages. Les précédents ont eu des problèmes lorsque le curseur est sur le premier mot d'une ligne.
Geoff Reedy
Cela peut également être facilement adapté pour que le mode visuel entoure une sélection de guillemets, par exemple :vnoremap <leader>q c""<esc>P.
Dominik
27

En plus des autres commandes, cela mettra tous les mots d'une ligne entre guillemets (selon votre commentaire)

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

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

:s/\v(\S+)/"\1"/
Matteo Riva
la source
Mon texte copié comportait également des virgules, donc je viens de le changer:s/\v([a-Z]+)/"\1"/g
tsukimi
22

Les moyens macro!

  1. appuyez sur qet qpour enregistrer dans le registre q (nous utilisons "q" comme raccourci pour mémoriser les "guillemets").

  2. appuyez sur shift+ bdéplacez le curseur vers l'avant du mot actuel

  3. itype de presse '(une seule guillemets)

  4. appuyez sur escpuis appuyez sur epour passer à la fin du mot

  5. appuyez sur apuis appuyez à 'nouveau pour entourer le mot de guillemets.

  6. appuyez sur escpour passer en mode normal.

  7. appuyez enfin sur qpour l'enregistrer dans le qregistre.

Comment utiliser

  1. Déplacez le curseur sur le mot souhaité.
  2. Appuyez sur @qpour entourer un mot de guillemets.
  3. presse @@ si vous voulez le répéter dans un autre mot.

Vous pouvez modifier step 4avec ce que vous voulez {une ligne, un mot jusqu'à ce que vous trouviez un caractère, etc}.

Rendre la macro enregistrée persistante

  1. ouvrir .vimrc
  2. aller à la fin du fichier
  3. passer en mode d'insertion. tapez ceci pour le rendre persistant:
soit @ q = ' ctrl+ r ctrl+ rq'
  1. sauvegarder et quitter

  2. ouvrez vos fichiers, allez à quelques mots

  3. appuyez maintenant @q

si vous le faites correctement, des choses magiques devraient apparaître dans vos mots.

Vous pouvez effectuer ces étapes pour les autres macros que vous avez aimées.

Brain90
la source
3
Je dois dire que j'aime cette solution. Aucun appel et création surround.vim nécessaire et facile des macros. Aussi facilement utilisable pour tout ce dont vous avez besoin (pour moi, par exemple, citez le mot actuel jusqu'à la fin de la ligne, parfait pour ansible). Pour afficher la macro, procédez comme suit: "qp. Pour l'enregistrer, accédez à .vimrc et procédez comme suit: let @q = 'macro contents' (juste pour être complet)
th3penguinwhisperer
J'aime beaucoup ça. Vous pouvez également imbriquer ces macros. Vous pouvez donc enregistrer dans le registre j @q wet ensuite vous pouvez encapsuler les nmots suivants avec des guillemets en utilisant avec n@j.
caché-nom d'utilisateur
1
J'ai ajouté quelques étapes pour rendre la macro persistante.
Brain90
1
Pédant, mais, le mot et le MOT sont différents dans Vim. Shift + b = B, donc l'étape 2 devrait idéalement être remplacée par "... devant le MOT actuel". Si vous vouliez dire début de mot cependant, vous n'avez pas besoin d'utiliser Shift.
Ambareesh
Merci pour ce point. J'utilise délibérément shift + b pour gérer WORD. La macro doit s'exécuter en Word ou WORD [0]. En fait, l'étape 3 devrait également changer pour shift + e. [0] stackoverflow.com/a/14390568/341959
Brain90
18

Envelopper les guillemets simples (par exemple) ciw'<C-r>"'<esc>fonctionne, mais répéter ne fonctionnera pas. Essayer:

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

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

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

James Scriven
la source
2
Excellent conseil! Si quelqu'un veut en faire un mappage, la notation appropriée est ciw'<C-R><C-O>"'<Esc>.
glts
Que fait exactement <Cr> "?
CodeCrack
@CodeCrack C'est CTRL-R. CTRL-R insère le contenu du registre au niveau du curseur et reste en mode insertion.
Erwin Rooijakkers
Ceci est reproductible comme vous l'avez mentionné, mais lorsqu'il est stocké dans une macro, la répétition de la macro avec .réécrira le contenu du dernier appel réel.
Sbu
7

Pour les utilisateurs de VSCodeVim, vous pouvez faire

vwS"

  • Vous pouvez remplacer "par ce que vous souhaitez envelopper.
  • Vous pouvez remplacer wpar n'importe quel autre opérateur de sélection
Janac Meena
la source
2
Cela a également bien fonctionné pour moi sur MacVIM, mais j'ai dû utiliser viwS'ce qui enveloppe le mot entre guillemets simples. De loin le plus simple.
Matt Grannary
cela ne fonctionne que si vous êtes au début du mot. Si vous voulez le faire de n'importe où dans le mot, vous pouvez le faire:viwS"
geoyws
6

Je ne connais aucune commande vim intégrée pour cela, mais utiliser r"f'r"pour passer de 'à "et r'f"r'pour passer de" à "fonctionne si vous vous tenez sur le premier" ou ". La commande r'remplace tout caractère sous votre curseur par", et f"vous fait passer au suivant ".

Håvard S
la source
1
La solution "manuelle" la plus intuitive pour moi. Au lieu de la deuxième commande de remplacement ( 'ret "r), vous pouvez simplement taper .Et si vous souhaitez modifier plus de guillemets ;et ,vous amener à la suivante ou précédente car ils répètent la dernière f/F/t/Trecherche dans la même direction ou dans l'opposé, respectivement.
Endre Both
6

Ajout de devis

J'ai commencé à utiliser cette fonction rapide et sale dans mon .vimrc:

vnoremap q <esc>:call QuickWrap("'")<cr>
vnoremap Q <esc>:call QuickWrap('"')<cr>

function! QuickWrap(wrapper)
  let l:w = a:wrapper
  let l:inside_or_around = (&selection == 'exclusive') ? ('i') : ('a')
  normal `>
  execute "normal " . inside_or_around . escape(w, '\')
  normal `<
  execute "normal i" . escape(w, '\')
  normal `<
endfunction

Alors maintenant, je sélectionne visuellement tout ce que je veux (généralement via viw- sélectionner visuellement le mot intérieur ) entre guillemets et appuie sur Qpour les guillemets doubles, ou sur qpour les guillemets simples.

Supprimer des devis

vnoremap s <esc>:call StripWrap()<cr>

function! StripWrap()
  normal `>x`<x
endfunction

J'utilise vim-textobj-quotes pour que vim traite les citations comme des objets texte. Cela signifie que je peux faire vaq(sélectionner visuellement autour des guillemets . Cela trouve les guillemets les plus proches et les sélectionne visuellement. (Ceci est facultatif, vous pouvez simplement faire quelque chose comme f"vww). Ensuite, j'appuie spour supprimer les guillemets de la sélection.

Modification des devis

BAISER. Je supprimer les citations puis ajoutez des citations . Par exemple, pour remplacer des guillemets simples avec des guillemets doubles, j'effectuer les étapes suivantes : 1. Supprimer les guillemets simples: vaqs, 2. ajouter de nouvelles citations: vwQ.


James Lawson
la source
4

Si vous utilisez le plugin vim https://github.com/tpope/vim-surround (ou utilisez le plugin VSCode Vim, qui est livré avec vim-surround pré-installé), c'est assez pratique!

ajouter

ysiw' // surround in word `'`

laissez tomber

ds' // drop surround `'`

changement

cs'" // change surround from `'` to `"`

Cela fonctionne même pour les balises html!

cst<em> // change surround from current tag to `<em>`

consultez le readme sur github pour de meilleurs exemples

Ulad Kasach
la source
2

Voici quelques mappages simples qui peuvent être utilisés pour citer et retirer un mot:

" 'quote' a word
nnoremap qw :silent! normal mpea'<Esc>bi'<Esc>`pl
" double "quote" a word
nnoremap qd :silent! normal mpea"<Esc>bi"<Esc>`pl
" remove quotes from a word
nnoremap wq :silent! normal mpeld bhd `ph<CR>
falcucci
la source
1
Ce serait génial pour tout le monde si vous pouviez élaborer votre réponse: comment ajouter des mappages, comment les appeler, etc. Merci.
Carles Alcolea
1
Je dirais que pour citer, double guillemet et unquote vous devriez faireqw qd wq
nilon
pour une raison quelconque, le guillemet double renvoie un guillemet supplémentaire à la fin comme "word" ".
janicebaratheon
@ShuaiWang vous avez peut-être installé des paires automatiques ou une extension similaire? La suppression de ce bug corrigé pour moi.
Nephilim
2

VIM pour vscode le fait énormément. Il est basé sur un vim-surround si vous n'utilisez pas vscode.

Quelques exemples:

"test" avec le curseur entre guillemets tapez cs "'pour finir avec' test '

"test" avec le curseur entre guillemets de type ds "pour finir avec test

"test" avec le curseur entre guillemets tapez cs "t et entrez 123> pour finir avec <123> test

test avec curseur sur mot test type ysaw) pour finir avec (test)

Lev
la source
1

J'utilise nnoremap dans mon .vimrc

Pour citer un mot:

nnoremap sq :silent! normal mpea'<Esc>bi'<Esc>`pl

Pour supprimer les guillemets (fonctionne également avec les guillemets doubles):

nnoremap qs :silent! normal mpeld bhd `ph<CR>

Règle à retenir: 'sq' = guillemet simple.

Niko Riitala
la source
0

que dis-tu de ça?

 :%s/\'/"/g
ghostdog74
la source
2
Cette commande opère sur l'ensemble du fichier. J'ai juste besoin de changer des mots simples.
Eugene Yarmash
4
Sans %, cela ne fonctionnera que sur la ligne actuelle, sauf si vous avez sélectionné l'intégralité du fichier
Emily
0

J'ai écrit un script qui fait ça:

function! WrapSelect (front)
    "puts characters around the selected text.
    let l:front = a:front
    if (a:front == '[')
        let l:back = ']'
    elseif (a:front == '(')
        let l:back = ')'
    elseif (a:front == '{')
        let l:back = '}'
    elseif (a:front == '<')
        let l:back = '>'
    elseif (a:front =~ " ")
        let l:split = split(a:front)
        let l:back = l:split[1]
        let l:front = l:split[0]
    else
        let l:back = a:front
    endif
    "execute: concat all these strings. '.' means "concat without spaces"
    "norm means "run in normal mode and also be able to use \<C-x> characters"
    "gv means "get the previous visual selection back up"
    "c means "cut visual selection and go to insert mode"
    "\<C-R> means "insert the contents of a register. in this case, the
    "default register"
    execute 'norm! gvc' . l:front. "\<C-R>\""  . l:back
endfunction
vnoremap <C-l> :<C-u>call WrapSelect(input('Wrapping? Give both (space separated) or just the first one: '))<cr>

Pour l'utiliser, mettez simplement en surbrillance quelque chose, appuyez sur la commande l, puis tapez un caractère. Si c'est l'un des caractères que la fonction connaît, elle fournira le bon caractère de fin. Si ce n'est pas le cas, il utilisera le même caractère pour insérer des deux côtés.

Surround.vim peut faire plus que cela, mais c'était suffisant pour mes besoins.

jeremysprofile
la source
-1

Exemple de carte en mode visuel pour ajouter des guillemets simples autour d'un bloc de texte sélectionné:

:vnoremap qq <Esc>`>a'<Esc>`<i'<Esc>
mrded
la source