Subversive propose deux nouveaux mouvements d'opérateur pour faciliter les substitutions rapides. Il ne contient aucun mappage par défaut et n'aura aucun effet tant que vous n'y ajouterez pas vos propres cartes.
Voyez également ici si vous préférez regarder une explication vidéo de ce plugin au lieu du texte ci-dessous.
Exemple de configuration :
" s for substitute
nmap s <plug> (SubversiveSubstitute)
nmap ss <plug> (SubversiveSubstituteLine)
nmap S <plug> (SubversiveSubstituteToEndOfLine)
Notez que dans ce cas, vous masquerez la touche de changement de caractère s
, vous devrez donc utiliser la forme plus longue cl
Après avoir ajouté ces cartes, vous pouvez ensuite exécuter s<motion>
pour remplacer l'objet texte fourni par le mouvement par le contenu du registre par défaut (ou un registre explicite s'il est fourni). Par exemple, vous pouvez exécuter siw
pour remplacer le mot actuel sous le curseur par le mot actuel, ou sip
pour remplacer le paragraphe, etc.
Un autre opérateur intéressant fourni par subversive permet de spécifier à la fois le texte à remplacer et la plage de lignes sur laquelle appliquer le changement en utilisant plusieurs mouvements consécutifs.
Exemple de configuration :
nmap <leader> s <plug> (SubversiveSubstituteRange)
xmap <leader> s <plug> (SubversiveSubstituteRange)
nmap <leader> ss <plug> (SubversiveSubstituteWordRange)
Après avoir ajouté cette carte, si vous exécutez <leader>s<motion1><motion2>
puis entrez du texte dans une invite dans la barre d'état, alors le texte donné par motion1
doit être remplacé par le texte que nous avons entré dans l'invite pour chaque ligne. fourni par motion2
. Alternativement, nous pouvons également sélectionner motion1
en mode visuel, puis appuyer sur <leader>s<motion2>
pour le même effet.
Cela peut être très puissant. Par exemple, vous pouvez exécuter <leader>siwip
pour remplacer toutes les instances du mot actuel sous le curseur qui existent dans le paragraphe sous le curseur. Ou <leader>sl_
pour remplacer toutes les instances du caractère sous le curseur sur la ligne courante.
Le mappage <leader>ss
est utilisé comme raccourci pour remplacer le mot actuel sous le curseur. Cela permet par exemple d'exécuter <leader>ssip
pour remplacer le mot sous le curseur dans le paragraphe courant. Notez que cela correspond à des mots complets et est donc différent de <leader>siwip
(qui ne nécessitera pas qu'il y ait des limites de mots sur chaque correspondance)
Voyons-le en action :
Dans ce gif, nous renommons d'abord le paramètre foo
local en exécutant <leader>ssom
puis en entrant bar
dans l'invite (notez que om
est un mouvement personnalisé qui signifie « méthode c# externe » et n'est pas fourni par ce plugin). Notez également que parce que nous utilisons <leader>ss
, le texte _foos
n'est pas affecté car il ne correspond pas au mot complet. C'est utile dans ce cas car nous voulons uniquement renommer le paramètre dans la fonction.
Après cela, nous passons en mode visuel et sélectionnons la partie foo
_foos
puis exécutons <leader>sie
et entrons à nouveau bar
dans l'invite. ie
-dire qu'il s'agit à nouveau d'un mouvement personnalisé qui représente l' entire buffer
(voir la section suivante pour plus de détails)
Après cela, nous passons à la partie Foo
de AddFoo
et exécutons <leader>seie
et entrons à nouveau dans Bar
. Puis enfin, faites de même pour le FOOS
entièrement capitalisé.
Notez que si vous utilisez neovim, vous pouvez activer l'option inccommand
pour obtenir un aperçu en temps réel du remplacement au fur et à mesure que vous le tapez (équivalent à définir g:subversivePromptWithActualCommand
sur 1
)
Notez également que ce mouvement est répétable. Si vous exécutez <leader>siwip
dans un paragraphe, passez à un autre paragraphe, puis appuyez sur .
alors la même substitution s'appliquera au nouveau paragraphe sous le curseur.
Notez que pour vraiment profiter de ces mappages, il est utile d'ajouter des objets texte personnalisés en plus de ceux intégrés tels que le paragraphe actuel ( ip
), la phrase actuelle ( is
) ou la ligne actuelle ( _
). Les objets de texte personnalisés tels que le niveau de retrait actuel, la méthode actuelle, la classe actuelle, le tampon entier, la page de défilement actuelle, etc. peuvent tous être d'une grande aide ici.
Par exemple, quelques mouvements très simples qui sont utiles pour le subversif sont :
" ie = inner entire buffer
onoremap ie :exec "normal! ggVG" <cr>
" iv = current viewable text in the buffer
onoremap iv :exec "normal! HVL" <cr>
Il existe également d'autres plugins qui fournissent de nombreux objets texte personnalisés que je recommanderais de consulter.
Pour de nombreuses substitutions, vous pouvez vous fier à l’aperçu des surbrillance pour comprendre ce qui est remplacé. Mais si vous effectuez un remplacement plus important sur l'ensemble du fichier, vous souhaiterez peut-être confirmer chacun d'entre eux. Vous pouvez le faire avec les cartes suivantes :
nmap <leader> cs <plug> (SubversiveSubstituteRangeConfirm)
xmap <leader> cs <plug> (SubversiveSubstituteRangeConfirm)
nmap <leader> css <plug> (SubversiveSubstituteWordRangeConfirm)
Celles-ci fonctionnent de la même manière que les cartes <leader>s
ci-dessus, sauf qu'elles passeront en revue chaque remplacement un par un.
Si vous fournissez un registre explicite à l'une des motions de substitution ci-dessus, il ne vous demandera pas et utilisera à la place le contenu du registre donné. Par exemple, "a<leader>siwip
remplacera immédiatement toutes les instances du mot actuel sous le curseur par le contenu du registre a
qui existe dans le paragraphe actuel.
Si cela ne suffit pas, vous pouvez également utiliser les plugs suivants :
nmap <leader> s <plug> (SubversiveSubstituteRangeNoPrompt)
xmap <leader> s <plug> (SubversiveSubstituteRangeNoPrompt)
nmap <leader> ss <plug> (SubversiveSubstituteWordRangeNoPrompt)
Ce qui fonctionnera de la même manière que les plugs précédents, sauf qu'au lieu d'inviter, il utilisera le registre par défaut.
Vous pouvez le faire en transmettant le registre du trou noir à l'une des commandes de substitution over range. Par exemple : "_<leader>siwip
ou "_<leader>csiwip
si vous souhaitez confirmer chaque suppression.
Malheureusement, vous ne pouvez pas simplement saisir une valeur vide dans l'invite car il n'existe aucun moyen de distinguer cette entrée de l'annulation via l'échappement (sauf si vous définissez g:subversivePromptWithActualCommand
sur 1
auquel cas cela fonctionnera correctement)
g:subversivePromptWithCurrent
- Lorsqu'il est défini sur 1
, l'invite inclura le texte qui est remplacé. Cela peut être utile si vous souhaitez simplement y apporter une modification. Par défaut : 0
g:subversiveCurrentTextRegister
- Lorsqu'il est défini, le registre donné sera rempli avec le texte qui est remplacé. Cela peut être utile comme alternative à g:subversivePromptWithCurrent
, afin que vous puissiez appuyer sur <cr>r
dans l'invite (en supposant que vous le définissiez sur 'r'
) lorsque vous souhaitez le modifier et sinon, tapez directement lorsque vous souhaitez le faire. un remplacement complet.g:subversivePromptWithActualCommand
- Lorsqu'il est défini sur 1
, au lieu de demander uniquement le texte de remplacement, il vous demandera la commande de remplacement native de vim. Les utilisateurs vétérans de Vim pourraient préférer cela afin de pouvoir ajuster eux-mêmes les différents indicateurs de substitution. Par défaut : 0
g:subversivePreserveCursorPosition
- Lorsqu'il est défini sur 1
, le curseur ne bougera pas lorsque des substitutions sont appliquées. La valeur par défaut est 0
pour correspondre au comportement normal de vim. Si vous avez également installé vim-abolish, vous pouvez également envisager d'ajouter quelque chose de similaire au mappage suivant :
nmap <leader> <leader> s <plug> (SubversiveSubvertRange)
xmap <leader> <leader> s <plug> (SubversiveSubvertRange)
nmap <leader> <leader> ss <plug> (SubversiveSubvertWordRange)
Cela se comportera de la même manière que <leader>s
sauf qu'il effectuera une suppression "subvertir" au lieu d'utiliser la commande de remplacement intégrée de vim. Cela appliquera la substitution et préservera également la casse du mot d'origine. Par exemple:
Dans ce cas, nous déplaçons le curseur au-dessus foo
puis exécutons <leader><leader>seie
puis entrons bar
, qui remplace toutes les instances de foo
quelle que soit la casse.
Cela peut être un moyen très pratique d’effectuer des renommages rapides.
Comme on peut s'y attendre, le mappage <leader><leader>ss
fonctionne de la même manière, sauf qu'il ne correspond qu'à des mots complets incluant des limites de mots.
Et encore une fois, il existe également des plugs alternatifs qui utiliseront le registre par défaut au lieu d'une invite si vous préférez cela :
nmap <leader> <leader> s <plug> (SubversiveSubvertRangeNoPrompt)
xmap <leader> <leader> s <plug> (SubversiveSubvertRangeNoPrompt)
nmap <leader> <leader> ss <plug> (SubversiveSubvertWordRangeNoPrompt)
Notez que si vous installez vim-yoink avec vim-subversive, la fonction d'échange de yoink après collage fonctionnera également automatiquement avec les substitutions subversives (un seul mouvement). En d'autres termes, en supposant les mappages par défaut, vous pouvez exécuter siw
puis appuyer sur <cn>
/ <cp>
pour basculer entre les différents tirs de l'historique yoink.
Subversive fournit également un plug-in pour remplacer le collage en mode visuel afin de permettre également l'échange post-collage :
xmap s <plug> (SubversiveSubstitute)
xmap p <plug> (SubversiveSubstitute)
xmap P <plug> (SubversiveSubstitute)
Maintenant, si vous appuyez sur p
en mode visuel, vous pouvez basculer entre les tirs comme lors du collage en mode normal.