O Subversive oferece dois novos movimentos do operador para facilitar a realização de substituições rápidas. Ele não contém mapeamentos padrão e não terá efeito até que você adicione seus próprios mapas a ele.
Veja também aqui se você prefere assistir a um vídeo de explicação deste plugin em vez do texto abaixo.
Configuração de exemplo:
" s for substitute
nmap s <plug> (SubversiveSubstitute)
nmap ss <plug> (SubversiveSubstituteLine)
nmap S <plug> (SubversiveSubstituteToEndOfLine)
Observe que, neste caso, você estará sombreando as s
de mudança de caracteres, portanto terá que usar o formato mais longo cl
Depois de adicionar esses mapas, você pode executar s<motion>
para substituir o objeto de texto fornecido pelo motion pelo conteúdo do registro padrão (ou por um registro explícito, se fornecido). Por exemplo, você pode executar siw
para substituir a palavra atual sob o cursor pelo puxão atual, ou sip
para substituir o parágrafo, etc.
Outro operador interessante fornecido pelo subversive permite especificar o texto a ser substituído e o intervalo de linhas sobre o qual aplicar a alteração usando vários movimentos consecutivos.
Configuração de exemplo:
nmap <leader> s <plug> (SubversiveSubstituteRange)
xmap <leader> s <plug> (SubversiveSubstituteRange)
nmap <leader> ss <plug> (SubversiveSubstituteWordRange)
Depois de adicionar este mapa, se você executar <leader>s<motion1><motion2>
e inserir algum texto em um prompt na barra de status, o texto fornecido por motion1
deverá ser substituído pelo texto que inserimos no prompt para cada linha fornecido por motion2
. Alternativamente, também podemos selecionar motion1
no modo visual e então clicar em <leader>s<motion2>
para obter o mesmo efeito.
Isso pode ser muito poderoso. Por exemplo, você poderia executar <leader>siwip
para substituir todas as instâncias da palavra atual sob o cursor que existem no parágrafo sob o cursor. Ou <leader>sl_
para substituir todas as instâncias do caractere sob o cursor na linha atual.
O mapeamento <leader>ss
é usado como um atalho para substituir a palavra atual sob o cursor. Isso permite, por exemplo, executar <leader>ssip
para substituir a palavra sob o cursor no parágrafo atual. Observe que isso corresponde a palavras completas , portanto é diferente de <leader>siwip
(que não exigirá que haja limites de palavras em cada correspondência)
Vamos ver isso em ação:
Neste gif, primeiro renomeamos o parâmetro foo
local executando <leader>ssom
e depois inserindo bar
no prompt (observe que om
é um movimento personalizado que significa 'método c# externo' e não é fornecido por este plugin). Observe também que, como estamos usando <leader>ss
, o texto _foos
não é afetado porque não corresponde à palavra completa. É útil neste caso porque queremos apenas renomear o parâmetro dentro da função.
Depois disso, mudamos para o modo visual e selecionamos a parte foo
_foos
, em seguida, executamos <leader>sie
e mais uma vez inserimos bar
no prompt. ie
é novamente um movimento personalizado que significa entire buffer
(veja a próxima seção para detalhes)
Depois disso, passamos para a parte Foo
de AddFoo
e executamos <leader>seie
e mais uma vez entramos em Bar
. Finalmente, faça o mesmo para FOOS
totalmente maiúsculo.
Observe que se você estiver usando o neovim, poderá ativar a opção inccommand
para obter uma visualização em tempo real da substituição enquanto a digita (equivalente a definir g:subversivePromptWithActualCommand
como 1
)
Observe também que este movimento é repetível. Se você executar <leader>siwip
em um parágrafo, vá para um parágrafo diferente e pressione .
então a mesma substituição será aplicada ao novo parágrafo sob o cursor.
Observe que, para realmente aproveitar esses mapeamentos, é útil adicionar objetos de texto personalizados além dos integrados, como parágrafo atual ( ip
), frase atual ( is
) ou linha atual ( _
). Objetos de texto personalizados, como nível de recuo atual, método atual, classe atual, buffer inteiro, página de rolagem atual, etc., podem ajudar muito aqui.
Por exemplo, alguns movimentos realmente simples que são úteis para subversivos são:
" ie = inner entire buffer
onoremap ie :exec "normal! ggVG" <cr>
" iv = current viewable text in the buffer
onoremap iv :exec "normal! HVL" <cr>
Existem também outros plug-ins que fornecem muitos objetos de texto personalizados que eu recomendo dar uma olhada.
Para muitas substituições, você pode contar com a visualização do destaque para entender o que está sendo substituído. Mas se você estiver fazendo uma substituição maior em todo o arquivo, convém confirmar cada uma delas. Você pode fazer isso com os seguintes mapas:
nmap <leader> cs <plug> (SubversiveSubstituteRangeConfirm)
xmap <leader> cs <plug> (SubversiveSubstituteRangeConfirm)
nmap <leader> css <plug> (SubversiveSubstituteWordRangeConfirm)
Eles funcionam da mesma forma que os mapas <leader>s
acima, exceto que percorrerão cada substituição, uma por uma.
Se você fornecer um registro explícito para qualquer uma das moções substitutas acima, ela não será solicitada e, em vez disso, usará o conteúdo do registro fornecido. Por exemplo, "a<leader>siwip
substituirá imediatamente todas as instâncias da palavra atual sob o cursor pelo conteúdo do registro a
que existe no parágrafo atual.
Se isso não for suficiente, você também pode usar os seguintes plugues:
nmap <leader> s <plug> (SubversiveSubstituteRangeNoPrompt)
xmap <leader> s <plug> (SubversiveSubstituteRangeNoPrompt)
nmap <leader> ss <plug> (SubversiveSubstituteWordRangeNoPrompt)
Que funcionará de forma idêntica aos plugs anteriores, exceto que, em vez de solicitar, usará o registro padrão.
Você pode fazer isso passando o registro do buraco negro para um dos comandos substitutos acima do intervalo. Por exemplo: "_<leader>siwip
ou "_<leader>csiwip
se desejar confirmar cada exclusão.
Infelizmente, você não pode simplesmente inserir um valor vazio no prompt porque não há uma maneira de distinguir essa entrada do cancelamento via escape (a menos que você defina g:subversivePromptWithActualCommand
como 1
, caso em que funcionará bem)
g:subversivePromptWithCurrent
– Quando definido como 1
, o prompt incluirá o texto que está sendo substituído. Isso pode ser útil se você quiser apenas fazer uma edição. Padrão: 0
g:subversiveCurrentTextRegister
– Quando definido, o registro fornecido será preenchido com o texto que está sendo substituído. Isso pode ser útil como uma alternativa para g:subversivePromptWithCurrent
, para que você possa pressionar <cr>r
no prompt (supondo que você o tenha definido como 'r'
) quando quiser editá-lo e, caso contrário, apenas digite diretamente quando quiser fazer uma substituição completa.g:subversivePromptWithActualCommand
- Quando definido como 1
, em vez de apenas solicitar o texto de substituição, ele solicitará o comando substituto nativo do vim. Usuários veteranos do vim podem preferir isso para que possam ajustar eles próprios os vários sinalizadores de substituição. Padrão: 0
g:subversivePreserveCursorPosition
- Quando definido como 1
, o cursor não se moverá quando as substituições forem aplicadas. O padrão é 0
para corresponder ao comportamento normal do vim. Se você também instalou o vim-abolish, considere adicionar também algo semelhante ao seguinte mapeamento:
nmap <leader> <leader> s <plug> (SubversiveSubvertRange)
xmap <leader> <leader> s <plug> (SubversiveSubvertRange)
nmap <leader> <leader> ss <plug> (SubversiveSubvertWordRange)
Isso se comportará da mesma forma que <leader>s
, exceto que executará um abolish 'subvert' em vez de usar o comando substituto integrado do vim. Isso aplicará a substituição e também preservará qualquer caso da palavra original. Por exemplo:
Nesse caso, movemos o cursor sobre foo
e então executamos <leader><leader>seie
e então inserimos bar
, que substitui todas as instâncias de foo
independentemente do caso.
Essa pode ser uma maneira muito conveniente de realizar renomeações rápidas.
Como seria de esperar, o mapeamento <leader><leader>ss
funciona de forma semelhante, exceto que corresponde apenas a palavras completas que incluem limites de palavras.
E mais uma vez também existem plugs alternativos que usarão o registro padrão em vez de um prompt, se você preferir:
nmap <leader> <leader> s <plug> (SubversiveSubvertRangeNoPrompt)
xmap <leader> <leader> s <plug> (SubversiveSubvertRangeNoPrompt)
nmap <leader> <leader> ss <plug> (SubversiveSubvertWordRangeNoPrompt)
Observe que se você instalar o vim-yoink junto com o vim-subversive, o recurso de troca pós-colar do yoink também funcionará automaticamente com substituições subversivas (movimento único). Em outras palavras, assumindo os mapeamentos padrão, você pode executar siw
e pressionar <cn>
/ <cp>
para alternar entre diferentes puxões do histórico do yoink.
O Subversive também fornece um plug para substituir a pasta do modo visual para fornecer troca pós-cola também:
xmap s <plug> (SubversiveSubstitute)
xmap p <plug> (SubversiveSubstitute)
xmap P <plug> (SubversiveSubstitute)
Agora, se você pressionar p
no modo visual, poderá alternar entre os puxões, como acontece ao colar no modo normal.