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.


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.

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

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.


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"/

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.


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/


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

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 ".


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.



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


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>

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)


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.


0

que dis-tu de ça?

 :%s/\'/"/g

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.


-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>
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.