Subversive proporciona dos nuevos movimientos del operador para que sea muy fácil realizar sustituciones rápidas. No contiene asignaciones predeterminadas y no tendrá ningún efecto hasta que le agregue sus propios mapas.
Consulte también aquí si prefiere ver un vídeo explicativo de este complemento en lugar del texto siguiente.
Configuración de ejemplo:
" s for substitute
nmap s <plug> (SubversiveSubstitute)
nmap ss <plug> (SubversiveSubstituteLine)
nmap S <plug> (SubversiveSubstituteToEndOfLine)
Tenga en cuenta que en este caso estará ocultando las teclas de cambio de carácter s
por lo que tendrá que usar la forma más larga cl
Después de agregar estos mapas, puede ejecutar s<motion>
para sustituir el objeto de texto proporcionado por el movimiento con el contenido del registro predeterminado (o un registro explícito si se proporciona). Por ejemplo, podría ejecutar siw
para reemplazar la palabra actual debajo del cursor con el tirón actual, o sip
para reemplazar el párrafo, etc.
Otro operador interesante proporcionado por subversive permite especificar tanto el texto a reemplazar como el rango de líneas sobre el cual aplicar el cambio mediante el uso de múltiples movimientos consecutivos.
Configuración de ejemplo:
nmap <leader> s <plug> (SubversiveSubstituteRange)
xmap <leader> s <plug> (SubversiveSubstituteRange)
nmap <leader> ss <plug> (SubversiveSubstituteWordRange)
Después de agregar este mapa, si ejecuta <leader>s<motion1><motion2>
y luego ingresa algo de texto en un mensaje en la barra de estado, entonces el texto proporcionado por motion1
debe ser reemplazado por el texto que ingresamos en el mensaje para cada línea. proporcionado por motion2
. Alternativamente, también podemos seleccionar motion1
en modo visual y luego presionar <leader>s<motion2>
para obtener el mismo efecto.
Esto puede ser muy poderoso. Por ejemplo, podría ejecutar <leader>siwip
para reemplazar todas las instancias de la palabra actual debajo del cursor que existen dentro del párrafo debajo del cursor. O <leader>sl_
para reemplazar todas las instancias del carácter debajo del cursor en la línea actual.
El mapeo <leader>ss
se utiliza como atajo para reemplazar la palabra actual debajo del cursor. Esto le permite, por ejemplo, ejecutar <leader>ssip
para reemplazar la palabra debajo del cursor en el párrafo actual. Tenga en cuenta que esto coincide con palabras completas , por lo que es diferente de <leader>siwip
(que no requerirá que haya límites de palabras en cada coincidencia)
Veámoslo en acción:
En este gif, primero cambiamos el nombre del parámetro foo
local ejecutando <leader>ssom
y luego ingresando bar
en el mensaje (tenga en cuenta que om
es un movimiento personalizado que significa 'método c# externo' y no lo proporciona este complemento). También tenga en cuenta que debido a que usamos <leader>ss
, el texto _foos
no se ve afectado porque no coincide con la palabra completa. Es útil en este caso porque solo queremos cambiar el nombre del parámetro dentro de la función.
Después de eso, cambiamos al modo visual y seleccionamos la parte foo
_foos
luego ejecutamos <leader>sie
y una vez más ingresamos bar
en el mensaje. ie
nuevamente es un movimiento personalizado que representa entire buffer
(consulte la siguiente sección para obtener más detalles)
Después de eso, nos movemos a la parte Foo
de AddFoo
y ejecutamos <leader>seie
y una vez más ingresamos Bar
. Luego, finalmente, haga lo mismo con los FOOS
en mayúsculas.
Tenga en cuenta que si está utilizando neovim, puede habilitar la opción inccommand
para obtener una vista previa en tiempo real del reemplazo mientras lo escribe (equivalente a configurar g:subversivePromptWithActualCommand
en 1
).
Tenga en cuenta también que este movimiento es repetible. Si ejecuta <leader>siwip
en un párrafo, vaya a otro párrafo y luego presione .
entonces se aplicará la misma sustitución al nuevo párrafo debajo del cursor.
Tenga en cuenta que para aprovechar realmente estas asignaciones, es útil agregar objetos de texto personalizados además de los integrados, como el párrafo actual ( ip
), la oración actual ( is
) o la línea actual ( _
). Los objetos de texto personalizados, como el nivel de sangría actual, el método actual, la clase actual, el búfer completo, la página de desplazamiento actual, etc., pueden ser de gran ayuda aquí.
Por ejemplo, un par de movimientos realmente simples que son útiles para los subversivos son:
" ie = inner entire buffer
onoremap ie :exec "normal! ggVG" <cr>
" iv = current viewable text in the buffer
onoremap iv :exec "normal! HVL" <cr>
También hay otros complementos que proporcionan muchos objetos de texto personalizados que recomendaría echar un vistazo.
Para muchas sustituciones, puede confiar en la vista previa destacada para comprender qué se está reemplazando. Pero si está realizando un reemplazo mayor en todo el archivo, es posible que desee confirmar cada uno. Puedes hacer esto con los siguientes mapas:
nmap <leader> cs <plug> (SubversiveSubstituteRangeConfirm)
xmap <leader> cs <plug> (SubversiveSubstituteRangeConfirm)
nmap <leader> css <plug> (SubversiveSubstituteWordRangeConfirm)
Estos funcionan igual que los mapas <leader>s
anteriores, excepto que recorrerán cada reemplazo uno por uno.
Si proporciona un registro explícito para cualquiera de las mociones sustitutas anteriores, no se solicitará y en su lugar utilizará el contenido del registro proporcionado. Por ejemplo, "a<leader>siwip
reemplazará inmediatamente todas las instancias de la palabra actual debajo del cursor con el contenido del registro a
que existe dentro del párrafo actual.
Si esto no es suficiente, también puedes utilizar los siguientes enchufes:
nmap <leader> s <plug> (SubversiveSubstituteRangeNoPrompt)
xmap <leader> s <plug> (SubversiveSubstituteRangeNoPrompt)
nmap <leader> ss <plug> (SubversiveSubstituteWordRangeNoPrompt)
Que funcionará de manera idéntica a los complementos anteriores, excepto que en lugar de solicitarlo, utilizará el registro predeterminado.
Puede hacerlo pasando el registro del agujero negro a uno de los comandos sustitutos de rango superior. Por ejemplo: "_<leader>siwip
o "_<leader>csiwip
si desea confirmar cada eliminación.
Desafortunadamente, no puede simplemente ingresar un valor vacío en el mensaje porque no hay una manera de distinguir esta entrada de la cancelación mediante escape (a menos que establezca g:subversivePromptWithActualCommand
en 1
en cuyo caso funcionará bien)
g:subversivePromptWithCurrent
: cuando se establece en 1
, el mensaje incluirá el texto que se está reemplazando. Esto puede resultar útil si simplemente desea editarlo. Predeterminado: 0
g:subversiveCurrentTextRegister
: cuando se establece, el registro dado se completará con el texto que se está reemplazando. Esto puede ser útil como alternativa a g:subversivePromptWithCurrent
, de modo que pueda presionar <cr>r
en el mensaje (suponiendo que lo haya configurado en 'r'
) cuando desee editarlo y, de lo contrario, simplemente escriba directamente cuando desee hacerlo. un reemplazo completo.g:subversivePromptWithActualCommand
: cuando se establece en 1
, en lugar de solo solicitar el texto de reemplazo, solicitará el comando sustituto nativo de vim. Los usuarios veteranos de vim podrían preferir esto para poder ajustar ellos mismos los distintos indicadores de sustitución. Predeterminado: 0
g:subversivePreserveCursorPosition
: cuando se establece en 1
, el cursor no se moverá cuando se apliquen sustituciones. El valor predeterminado es 0
para coincidir con el comportamiento normal de vim. Si también instaló vim-abolish, entonces podría considerar agregar algo similar al siguiente mapeo:
nmap <leader> <leader> s <plug> (SubversiveSubvertRange)
xmap <leader> <leader> s <plug> (SubversiveSubvertRange)
nmap <leader> <leader> ss <plug> (SubversiveSubvertWordRange)
Esto se comportará igual que <leader>s
excepto que realizará una abolición 'subvertir' en lugar de usar el comando sustituto integrado de vim. Esto aplicará la sustitución y también preservará cualquier caso que tenga la palabra original. Por ejemplo:
En este caso, movemos el cursor sobre foo
y luego ejecutamos <leader><leader>seie
y luego ingresamos bar
, que reemplaza todas las instancias de foo
independientemente del caso.
Esta puede ser una forma muy conveniente de realizar cambios de nombre rápidos.
Como era de esperar, el mapeo <leader><leader>ss
funciona de manera similar excepto que solo coincide con palabras completas que incluyen límites de palabras.
Y una vez más, también hay complementos alternativos que usarán el registro predeterminado en lugar de un mensaje si lo prefiere:
nmap <leader> <leader> s <plug> (SubversiveSubvertRangeNoPrompt)
xmap <leader> <leader> s <plug> (SubversiveSubvertRangeNoPrompt)
nmap <leader> <leader> ss <plug> (SubversiveSubvertWordRangeNoPrompt)
Tenga en cuenta que si instala vim-yoink junto con vim-subversive, la función de intercambio de yoink posterior al pegado también funcionará automáticamente con sustituciones subversivas (de un solo movimiento). En otras palabras, asumiendo las asignaciones predeterminadas, puedes ejecutar siw
y luego presionar <cn>
/ <cp>
para intercambiar entre diferentes tirones del historial de yoink.
Subversive también proporciona un complemento para reemplazar el pegado en modo visual para proporcionar intercambio posterior al pegado allí también:
xmap s <plug> (SubversiveSubstitute)
xmap p <plug> (SubversiveSubstitute)
xmap P <plug> (SubversiveSubstitute)
Ahora, si presionas p
mientras estás en modo visual, puedes intercambiar entre tirones como cuando pegas en modo normal.