Comment puis-je rapidement citer/dé-citer des mots et changer de citation (par exemple de '
à "
) dans Vim? Je connais le plugin surround.vim , mais j’aimerais utiliser uniquement Vim.
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.
ciw'Ctrl+r"'
ciw
- Supprime le mot sur lequel se trouve le curseur et termine en mode insertion.'
- ajoute le premier devis.Ctrl+r"
- Insérez le contenu du registre "
, c'est-à-dire le dernier yank/delete.'
- ajoute la citation de clôture .di'hPl2x
di'
- Supprimer le mot entre guillemets simples.hP
- Déplacez le curseur d'une position vers la gauche (en haut du devis d'ouverture) et placez le texte qui vient d'être supprimé avant le devis.l
- Déplace le curseur d'une position vers la droite (en haut du guillemet d'ouverture).2x
- Supprimer les deux guillemets .va':s/\%V'\%V/"/g
va'
- Sélectionnez visuellement le mot cité et les guillemets.:s/
- Commencez un remplacement.\%V'\%V
- Ne correspond aux guillemets simples que dans la région sélectionnée visuellement./"/g
- Remplacez-les tous par des guillemets doubles.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
Voici une cartographie qui pourrait 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 les guillemets autour du mot sous le curseur.
En plus des autres commandes, tous les mots d’une ligne seront placés entre guillemets (selon votre commentaire).
:s/\(\S\+\)/"\1"/
ou si vous souhaitez réduire le nombre de barres obliques inverses, vous pouvez utiliser un modificateur \v
(très magique) au début du motif.
:s/\v(\S+)/"\1"/
Pour insérer des guillemets simples (par exemple), ciw'<C-r>"'<esc>
fonctionne, mais repeat 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 .
sur n’importe quel mot pour le mettre entre guillemets. Pour en savoir plus, voir :h[elp] i_ctrl-r
et plus d’informations sur les objets texte à :h text-objects
Source: http://vimcasts.org/episodes/pasting-from-insert-mode/
à la manière des macros
presse q et q pour enregistrer dans le registre q (nous utilisons "q" comme raccourci pour nous rappeler les "guillemets").
presse shift + b déplace le curseur devant le mot actuel
presse i type ' (une seule citation)
presse esc puis appuyez e passer à la fin de Word
presse a puis appuyez ' à nouveau pour entourer le mot avec des guillemets.
enfin appuyez sur q pour l’enregistrer dans q
register.
Comment l'utiliser:
Vous pouvez modifier step 4
avec tout ce que vous voulez {une ligne, un Word jusqu'à ce que vous trouviez un caractère, etc.}. Mettez-le dans vim variables
et .vimrc
pour répéter votre bonheur.
Je ne connais aucune commande vim intégrée pour cela, mais utiliser r"f'r"
pour changer de 'à "et r'f"r'
pour changer de" à "fonctionne si vous vous tenez sur le premier ou le". La commande r'
remplace le caractère sous votre curseur. avec ', et f"
vous fait passer au suivant ".
Ajout de citations
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élection visuelle dans Word ) entre guillemets et appuyez sur Q pour les guillemets doubles, ou appuyez sur q pour les guillemets simples.
Suppression des devis
vnoremap s <esc>:call StripWrap()<cr>
function! StripWrap()
normal `>x`<x
endfunction
J'utilise vim-textobj-quotes pour que vim traite les guillemets comme des objets texte. Cela signifie que je peux faire vaq
(sélectionner visuellement autour des guillemets . Ceci recherche les citations les plus proches et les sélectionne visuellement. (Ceci est facultatif, vous pouvez simplement faire quelque chose comme f"vww
). appuyez sur s
pour supprimer les guillemets de la sélection.
Modification des devis
BAISER. I supprime les guillemets puis ajoute des guillemets . Par exemple, pour remplacer les guillemets simples par des guillemets doubles, procédez comme suit: 1. supprimez les guillemets simples: vaqs
, 2. ajoutez de nouveaux guillemets: vwQ
.
Pour les utilisateurs de VSCodeVim, vous pouvez faire
vwS"
"
par tout ce qui vous intéresse.w
par n’importe quel autre opérateur de sélectionVoici quelques mappages simples qui peuvent être utilisés pour citer ou non 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>
VIM pour vscode est-ce génial? C'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 tapez ds "pour finir avec test
"test" avec le curseur entre guillemets, tapez cs "t et entrez 123> pour terminer avec <123> test
test avec curseur sur Word test type ysaw) pour finir avec (test)
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 sur les guillemets doubles):
nnoremap qs :silent! normal mpeld bhd `ph<CR>
Règle à retenir: 'sq' = guillemet simple.
J'ai écrit un script qui fait ceci:
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, il suffit de surligner quelque chose, d'appuyer sur le contrôle l, puis de saisir un caractère. Si la fonction est au courant de l'un des caractères, elle fournira le caractère de fin correct. Si ce n'est pas le cas, le même caractère sera inséré des deux côtés.
Surround.vim peut faire plus que cela, mais cela suffisait à mes besoins.
que dis-tu de ça?
:%s/\'/"/g