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.
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.
Réponses:
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
- 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.
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.
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.ciw
et pas seulement cw
? Je trouve le premier déroutant et le second fonctionne très bien.
ciw
fonctionne indépendamment de l'endroit où se trouve votre curseur dans le mot. cw
ne fonctionne que si votre curseur est au début du mot. Tu vois :help iw
.
.
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 :-))
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
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.
map <Leader>' gewi'<Esc>A'<Esc>
à mon .vimrc
fichier 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.
:vnoremap <leader>q c""<esc>P
.
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 \v
modificateur (très magique) au début du motif
:s/\v(\S+)/"\1"/
:s/\v([a-Z]+)/"\1"/g
Les moyens macro!
appuyez sur qet qpour enregistrer dans le registre q (nous utilisons "q" comme raccourci pour mémoriser les "guillemets").
appuyez sur shift+ bdéplacez le curseur vers l'avant du mot actuel
itype de presse '(une seule guillemets)
appuyez sur escpuis appuyez sur epour passer à la fin du mot
appuyez sur apuis appuyez à 'nouveau pour entourer le mot de guillemets.
appuyez sur escpour passer en mode normal.
appuyez enfin sur qpour l'enregistrer dans le q
registre.
Comment utiliser
Vous pouvez modifier step 4
avec ce que vous voulez {une ligne, un mot jusqu'à ce que vous trouviez un caractère, etc}.
Rendre la macro enregistrée persistante
soit @ q = ' ctrl+ r ctrl+ rq'
sauvegarder et quitter
ouvrez vos fichiers, allez à quelques mots
@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.
@q w
et ensuite vous pouvez encapsuler les n
mots suivants avec des guillemets en utilisant avec n@j
.
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-r
et en savoir plus sur les objets texte sur:h text-objects
Source: http://vimcasts.org/episodes/pasting-from-insert-mode/
ciw'<C-R><C-O>"'<Esc>
.
.
réécrira le contenu du dernier appel réel.
Pour les utilisateurs de VSCodeVim, vous pouvez faire
vwS"
"
par ce que vous souhaitez envelopper.w
par n'importe quel autre opérateur de sélectionviwS'
ce qui enveloppe le mot entre guillemets simples. De loin le plus simple.
viwS"
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 ".
'r
et "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/T
recherche dans la même direction ou dans l'opposé, respectivement.
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 s
pour 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
.
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
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>
qw
qd
wq
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)
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.
que dis-tu de ça?
:%s/\'/"/g
%
, cela ne fonctionnera que sur la ligne actuelle, sauf si vous avez sélectionné l'intégralité du fichier
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.