DEV Community

Heiker
Heiker

Posted on Edited on Originally published at vonheikemen.github.io

CÃģmo sobrevivir sin cursores mÚltiples en vim

Sí, los cursores mÚltiples son mÃĄgicos. Son convenientes, fÃĄcil de usar y estÃĄn presente en muchos editores modernos. Para bien o para mal, vim no los tiene. Pero estÃĄ bien, podemos ser felices sin ellos. Bueno... yo puedo y voy decirles cÃģmo.

Vamos a repasar las situaciones donde podríamos usar cursores mÚltiples y veremos quÃĐ alternativas tenemos en vim.

Reemplazar palabra debajo del cursor

En vim debemos comenzar el proceso buscando la palabra debajo del cursor, para esto presionamos *. Luego presionamos cgn para reemplazar la prÃģxima ocurrencia. Si queremos repetir la acciÃģn presionamos ., sí, el punto. Si no queremos reemplazar la ocurrencia actual podemos ignorarla y pasar a la siguiente presionando n.

Podemos hacer este proceso mÃĄs rÃĄpido si creamos un atajo de teclado que agrupe los primeros dos pasos.

nnoremap <leader>j *``cgn
ðŸ”Ĩ āļ‚āđˆāļēāļ§āļ”āđˆāļ§āļ™: vonheikemen/como sobrevivir sin cursores multiples en vim mh - āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļĢāđ‰āļ­āļ™ ðŸ”Ĩ āļ‚āđˆāļēāļ§āļ”āđˆāļ§āļ™: vonheikemen/como sobrevivir sin cursores multiples en vim mh - āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļĢāđ‰āļ­āļ™

Con este atajo podremos utilizar la tecla líder + j para reemplazar la palabra actual, luego podremos navegar entre cada ocurrencia de la palabra y usar . para reemplazar el texto.

Ver en asciinema.

Cambiar una variable

Puede ser que la palabra que quieren reemplazar es una variable en su cÃģdigo, en este caso sería ideal que el editor sÃģlo reemplace las referencias que son vÃĄlidas. Aquí la soluciÃģn puede ser un poco mÃĄs complicada. Como saben vim no es un IDE, este tipo de funcionalidad no estÃĄ habilitada por defecto. Pero no es imposible, existen plugins que nos permiten usar servidores LSP. Resulta que renombrar variables es una de esas funcionalidades que podemos obtener con un servidor LSP.

Personalmente uso Neovim y no vim como tal. En mi caso sÃģlo necesito algo como esto.

lua require('lspconfig').ts_ls.setup({})

nnoremap <F2> <cmd>lua vim.lsp.buf.rename()<cr>
ðŸ”Ĩ āļ‚āđˆāļēāļ§āļ”āđˆāļ§āļ™: vonheikemen/como sobrevivir sin cursores multiples en vim mh - āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļĢāđ‰āļ­āļ™ ðŸ”Ĩ āļ‚āđˆāļēāļ§āļ”āđˆāļ§āļ™: vonheikemen/como sobrevivir sin cursores multiples en vim mh - āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļĢāđ‰āļ­āļ™

Aquí uso nvim-lspconfig para configurar tsserver. Y creo el atajo <F2> para renombrar variables.

Ver en asciinema.

Si ustedes usan vim pueden probar estos plugins:

Reemplazar selecciÃģn

Tal vez el texto que queremos reemplazar no es una palabra, tal vez es una oraciÃģn o un atributo de html. En este caso no tenemos una funcionalidad nativa que nos ayude pero podemos implementar nuestra propia soluciÃģn.

Lo primero que haremos serÃĄ colocar la selecciÃģn actual en el "registro de bÚsqueda" de vim.

let @/=escape(@", '/')
ðŸ”Ĩ āļ‚āđˆāļēāļ§āļ”āđˆāļ§āļ™: vonheikemen/como sobrevivir sin cursores multiples en vim mh - āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļĢāđ‰āļ­āļ™ ðŸ”Ĩ āļ‚āđˆāļēāļ§āļ”āđˆāļ§āļ™: vonheikemen/como sobrevivir sin cursores multiples en vim mh - āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļĢāđ‰āļ­āļ™

Aquí tomamos el registro " que contiene la selecciÃģn mÃĄs reciente, nos aseguramos de escapar el caracter / para que no ocurra un conflicto en nuestra bÚsqueda, finalmente asignamos el resultado al registro /.

Luego debemos borrar toda la selecciÃģn e ir al modo de inserciÃģn. Esto lo logramos con esta secuencia.

"_cgn
ðŸ”Ĩ āļ‚āđˆāļēāļ§āļ”āđˆāļ§āļ™: vonheikemen/como sobrevivir sin cursores multiples en vim mh - āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļĢāđ‰āļ­āļ™ ðŸ”Ĩ āļ‚āđˆāļēāļ§āļ”āđˆāļ§āļ™: vonheikemen/como sobrevivir sin cursores multiples en vim mh - āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļĢāđ‰āļ­āļ™

Con "_ le decimos a vim que queremos usar el registro _ para nuestra siguiente operaciÃģn. cgn es para reemplazar la primera ocurrencia de una bÚsqueda.

Si juntamos estas piezas en un atajo tendremos esto.

xnoremap <leader>j y<cmd>let @/=escape(@", '/')<cr>"_cgn
ðŸ”Ĩ āļ‚āđˆāļēāļ§āļ”āđˆāļ§āļ™: vonheikemen/como sobrevivir sin cursores multiples en vim mh - āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļĢāđ‰āļ­āļ™ ðŸ”Ĩ āļ‚āđˆāļēāļ§āļ”āđˆāļ§āļ™: vonheikemen/como sobrevivir sin cursores multiples en vim mh - āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļĢāđ‰āļ­āļ™

Pero esta soluciÃģn sÃģlo funciona con bÚsquedas de una línea. Si por alguna razÃģn quieren reemplazar una selecciÃģn de mÚltiples líneas deben hacer esto.

xnoremap <leader>j y<cmd>substitute(escape(@", '/'), '\n', '\\n', 'g')<cr>"_cgn
ðŸ”Ĩ āļ‚āđˆāļēāļ§āļ”āđˆāļ§āļ™: vonheikemen/como sobrevivir sin cursores multiples en vim mh - āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļĢāđ‰āļ­āļ™ ðŸ”Ĩ āļ‚āđˆāļēāļ§āļ”āđˆāļ§āļ™: vonheikemen/como sobrevivir sin cursores multiples en vim mh - āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļĢāđ‰āļ­āļ™

Aquí usamos la funciÃģn substitute para reemplazar el salto de línea con \n, así tÃĐcnicamente nuestra bÚsqueda siempre serÃĄ de una línea.

ÂŋCÃģmo usamos esto? De la misma forma que usamos el atajo <leader>j en la secciÃģn "reemplazar palabra debajo del cursor". La diferencia es que en este caso primero debemos ir a modo visual para seleccionar el texto. Luego podremos repetir la acciÃģn usando . o podemos movernos a la siguiente ocurrencia usando n.

AÃąadir texto al inicio de una lista

Digamos que tenemos una lista de palabras y queremos convertirla en una lista ordenada en markdown.

Queremos transformar esto.

volar
html
cssls
ðŸ”Ĩ āļ‚āđˆāļēāļ§āļ”āđˆāļ§āļ™: vonheikemen/como sobrevivir sin cursores multiples en vim mh - āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļĢāđ‰āļ­āļ™ ðŸ”Ĩ āļ‚āđˆāļēāļ§āļ”āđˆāļ§āļ™: vonheikemen/como sobrevivir sin cursores multiples en vim mh - āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļĢāđ‰āļ­āļ™

En esto.

1. volar
1. html
1. cssls
ðŸ”Ĩ āļ‚āđˆāļēāļ§āļ”āđˆāļ§āļ™: vonheikemen/como sobrevivir sin cursores multiples en vim mh - āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļĢāđ‰āļ­āļ™ ðŸ”Ĩ āļ‚āđˆāļēāļ§āļ”āđˆāļ§āļ™: vonheikemen/como sobrevivir sin cursores multiples en vim mh - āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļĢāđ‰āļ­āļ™

En vim tenemos un modo llamado "visual block", cuando estamos en este modo tenemos la posibilidad de agregar texto a cada línea de la selecciÃģn si vamos a modo de inserciÃģn usando I o A. Luego de insertar el texto en la primera línea vim procede a repetir esta acciÃģn en el resto de las líneas seleccionadas.

Vamos a revisar paso a paso lo que debemos hacer.

Ver en asciinema.

  1. Vamos al primer caracter de la primera línea.
  2. Presionamos Ctrl + v para ir al modo "visual block".
  3. Seleccionamos las líneas que queremos cambiar.
  4. Presionamos I para colocar el cursor al inicio de la selecciÃģn.
  5. Agregamos el texto que queremos.
  6. Presionamos Esc.

AÃąadir texto al final de una lista

Sí. TambiÃĐn podemos modificar el final de la línea. El proceso es casi idÃĐntico, con la diferencia de aquí debemos expandir la selecciÃģn hacia el final de la línea.

Digamos que tenemos nuestra lista ordenada pero ahora queremos agregar el texto (is supported) al final de cada línea.

Ver en asciinema.

  1. Vamos al primer caracter de la primera línea.
  2. Presionamos Ctrl + v para ir al modo "visual block".
  3. Seleccionamos las líneas que queremos cambiar.
  4. Expandimos la selecciÃģn hacia el final de la línea presionando $.
  5. Presionamos A para colocar el cursor al final de la primera línea.
  6. Agregamos el texto que queremos.
  7. Presionamos Esc.

Repetir un movimientos

El modo visual block puede ser Útil en muchas situaciones pero es limitado. SÃģlo puede agregar texto en un lugar. ÂŋQuÃĐ hacemos cuando queremos hacer modificaciones complejas? La respuesta: macros. Un macro es una cadena de texto que describe una secuencia de teclas. Podemos "grabar" un macro y repetirlo tantas veces sea necesario.

ÂŋCÃģmo usamos un macro? Primero debemos elegir un registro. Algo así como una etiqueta para nuestro macro. Presionamos q seguido de la letra de nuestro registro. Luego ejecutamos las modificaciones que queremos. Finalmente presionamos q para terminar de grabar el macro. Para repetir el macro debemos presionar @ seguido de la letra que elegimos en el primer paso.

Vamos con un ejemplo.

Tenemos esta lista.

volar
html
cssls
eslint
ðŸ”Ĩ āļ‚āđˆāļēāļ§āļ”āđˆāļ§āļ™: vonheikemen/como sobrevivir sin cursores multiples en vim mh - āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļĢāđ‰āļ­āļ™ ðŸ”Ĩ āļ‚āđˆāļēāļ§āļ”āđˆāļ§āļ™: vonheikemen/como sobrevivir sin cursores multiples en vim mh - āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļĢāđ‰āļ­āļ™

Y queremos convertirlo en una lista ordenada de enlaces.

1. [volar](http://localhost/how-to-configure-volar-lsp)
1. [html](http://localhost/how-to-configure-html-lsp)
1. [cssls](http://localhost/how-to-configure-cssls-lsp)
1. [eslint](http://localhost/how-to-configure-eslint-lsp)
ðŸ”Ĩ āļ‚āđˆāļēāļ§āļ”āđˆāļ§āļ™: vonheikemen/como sobrevivir sin cursores multiples en vim mh - āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļĢāđ‰āļ­āļ™ ðŸ”Ĩ āļ‚āđˆāļēāļ§āļ”āđˆāļ§āļ™: vonheikemen/como sobrevivir sin cursores multiples en vim mh - āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļĢāđ‰āļ­āļ™

Noten que aquí necesitamos aÃąadir texto al inicio y final de cada línea. TambiÃĐn tenemos que copiar el nombre de cada item y colocarlo en el enlace.

Lo que haremos serÃĄ convertir el primer item y repetir el proceso usando un macro. Estos son los pasos.

  1. Grabamos el macro en el registro i. Presionamos qi.
  2. Modificamos el primer item.
  3. Finalizamos la grabaciÃģn del macro presionando q nuevamente.
  4. Repetimos el macro tres veces presionando 3@i.

Ver en asciinema.

Cuando aplicamos un macro de esta manera, con repeticiones automÃĄticas, debemos tener en cuenta la posiciÃģn del cursor. En este caso particular el primer atajo que utilicÃĐ al comenzar a grabar el macro fue 0 y terminÃĐ presionando j. Con esto me aseguro de que en cada repeticiÃģn el cursor estÃĐ en el primer caracter de la línea, y justo antes de terminar el macro muevo el cursor a la línea que estÃĄ debajo.

Aplicar un macro en líneas específicas

Otra forma interesante de aplicar un macro es con el comando g. Este comando ejecuta una bÚsqueda y nos da la oportunidad de ejecutar otro comando en las líneas donde hay una ocurrencia. En nuestro caso lo que queremos hacer despuÃĐs de la bÚsqueda es ejecutar un macro, para eso usamos el comando normal @i (donde i puede ser cualquier registro).

Digamos que queremos buscar todas las líneas con la palabra vim y ejecutar un macro. Podemos hacer algo así.

:g/vim/normal @i
ðŸ”Ĩ āļ‚āđˆāļēāļ§āļ”āđˆāļ§āļ™: vonheikemen/como sobrevivir sin cursores multiples en vim mh - āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļĢāđ‰āļ­āļ™ ðŸ”Ĩ āļ‚āđˆāļēāļ§āļ”āđˆāļ§āļ™: vonheikemen/como sobrevivir sin cursores multiples en vim mh - āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļĢāđ‰āļ­āļ™

Si quieren asegurarse de que su bÚsqueda tiene los resultados esperados pueden omitir la secciÃģn que va despuÃĐs de la bÚsqueda.

:g/vim/
ðŸ”Ĩ āļ‚āđˆāļēāļ§āļ”āđˆāļ§āļ™: vonheikemen/como sobrevivir sin cursores multiples en vim mh - āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļĢāđ‰āļ­āļ™ ðŸ”Ĩ āļ‚āđˆāļēāļ§āļ”āđˆāļ§āļ™: vonheikemen/como sobrevivir sin cursores multiples en vim mh - āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļĢāđ‰āļ­āļ™

Si todo estÃĄ bien agregamos normal @i.

Aplicar un macro en una selecciÃģn

No estamos obligados a usar el comando g, podemos utilizar el comando normal @i sobre una selecciÃģn ejecutando este comando.

'<,'>normal @i
ðŸ”Ĩ āļ‚āđˆāļēāļ§āļ”āđˆāļ§āļ™: vonheikemen/como sobrevivir sin cursores multiples en vim mh - āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļĢāđ‰āļ­āļ™ ðŸ”Ĩ āļ‚āđˆāļēāļ§āļ”āđˆāļ§āļ™: vonheikemen/como sobrevivir sin cursores multiples en vim mh - āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļĢāđ‰āļ­āļ™

Nota: No se preocupen por recordar la sintaxis '<,'>, vim lo agregarÃĄ automÃĄticamente cuando pasamos de modo visual a modo de comando.

Esto ejecutarÃĄ el macro en i sobre cada línea de la selecciÃģn. Deben tener en cuenta que cada macro comenzarÃĄ con el cursor al principio de la línea.

Buscar patrÃģn y ejecutar un macro

Esta es una alternativa al comando g. Porque tal vez no se sienten cÃģmodos usando expresiones regulares. Los entiendo. La mayoría de las veces lo que quiero hacer es seleccionar un pedazo de texto y aplicar un macro sobre algunas ocurrencias. Ya vimos cÃģmo buscar una selecciÃģn, podemos aplicar este conocimiento para manipular la posiciÃģn del cursor.

ÂŋRecuerdan esto?

y<cmd>let @/=substitute(escape(@", '/'), '\n', '\\n', 'g')<cr>
ðŸ”Ĩ āļ‚āđˆāļēāļ§āļ”āđˆāļ§āļ™: vonheikemen/como sobrevivir sin cursores multiples en vim mh - āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļĢāđ‰āļ­āļ™ ðŸ”Ĩ āļ‚āđˆāļēāļ§āļ”āđˆāļ§āļ™: vonheikemen/como sobrevivir sin cursores multiples en vim mh - āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļĢāđ‰āļ­āļ™

Esta es la secuencia que usamos para colocar la selecciÃģn actual en el registro de bÚsqueda. Todo lo que tenemos que hacer es iniciar la grabaciÃģn del macro despuÃĐs de esta funciÃģn. Así.

gvqi
ðŸ”Ĩ āļ‚āđˆāļēāļ§āļ”āđˆāļ§āļ™: vonheikemen/como sobrevivir sin cursores multiples en vim mh - āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļĢāđ‰āļ­āļ™ ðŸ”Ĩ āļ‚āđˆāļēāļ§āļ”āđˆāļ§āļ™: vonheikemen/como sobrevivir sin cursores multiples en vim mh - āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļĢāđ‰āļ­āļ™

Con gv vim vuelve a resaltar la selecciÃģn anterior, porque recuerden que perdemos la selecciÃģn luego de presionar y. DespuÃĐs con qi comienza la grabaciÃģn del macro en el registro i.

Si juntamos todo esto en un atajo obtenemos:

xnoremap <leader>i y<cmd>let @/=substitute(escape(@", '/'), '\n', '\\n', 'g')<cr>gvqi
ðŸ”Ĩ āļ‚āđˆāļēāļ§āļ”āđˆāļ§āļ™: vonheikemen/como sobrevivir sin cursores multiples en vim mh - āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļĢāđ‰āļ­āļ™ ðŸ”Ĩ āļ‚āđˆāļēāļ§āļ”āđˆāļ§āļ™: vonheikemen/como sobrevivir sin cursores multiples en vim mh - āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļĢāđ‰āļ­āļ™

La historia no termina aquí, ahora tenemos que aplicar el macro en las ocurrencias de nuestra selecciÃģn. Usaremos gn para seleccionar la siguiente ocurrencia y ejecutar el macro.

nnoremap <F8> gn@i
ðŸ”Ĩ āļ‚āđˆāļēāļ§āļ”āđˆāļ§āļ™: vonheikemen/como sobrevivir sin cursores multiples en vim mh - āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļĢāđ‰āļ­āļ™ ðŸ”Ĩ āļ‚āđˆāļēāļ§āļ”āđˆāļ§āļ™: vonheikemen/como sobrevivir sin cursores multiples en vim mh - āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļĢāđ‰āļ­āļ™

Vamos con un ejemplo de la vida real.

Hace unos meses estaba probando packer.nvim, un manejador de plugins. En mi configuraciÃģn tenía este cÃģdigo.

require('packer').startup(function(use)
  use({
    'nvim-lualine/lualine.nvim',
    config = function() require('plugins.lualine') end,
  })
  use({
    'akinsho/bufferline.nvim',
    config = function() require('plugins.bufferline') end,
  })
  use({
    'lukas-reineke/indent-blankline.nvim',
    config = function() require('plugins.indent-blankline') end,
  })
end)
ðŸ”Ĩ āļ‚āđˆāļēāļ§āļ”āđˆāļ§āļ™: vonheikemen/como sobrevivir sin cursores multiples en vim mh - āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļĢāđ‰āļ­āļ™ ðŸ”Ĩ āļ‚āđˆāļēāļ§āļ”āđˆāļ§āļ™: vonheikemen/como sobrevivir sin cursores multiples en vim mh - āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļĢāđ‰āļ­āļ™

Me molestaba tener que repetir function() require... por cada plugin. BusquÃĐ por internet y encontrÃĐ la manera de reducir el cÃģdigo repetido. Escribí esta funciÃģn.

local function load(name)
  return string.format([[pcall(require, 'plugins.%s')]], name)
end
ðŸ”Ĩ āļ‚āđˆāļēāļ§āļ”āđˆāļ§āļ™: vonheikemen/como sobrevivir sin cursores multiples en vim mh - āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļĢāđ‰āļ­āļ™ ðŸ”Ĩ āļ‚āđˆāļēāļ§āļ”āđˆāļ§āļ™: vonheikemen/como sobrevivir sin cursores multiples en vim mh - āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļĢāđ‰āļ­āļ™

Con esta funciÃģn puedo reducir el cÃģdigo necesario para utilizar config. Puedo hacer esto.

config = load('lualine')
ðŸ”Ĩ āļ‚āđˆāļēāļ§āļ”āđˆāļ§āļ™: vonheikemen/como sobrevivir sin cursores multiples en vim mh - āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļĢāđ‰āļ­āļ™ ðŸ”Ĩ āļ‚āđˆāļēāļ§āļ”āđˆāļ§āļ™: vonheikemen/como sobrevivir sin cursores multiples en vim mh - āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļĢāđ‰āļ­āļ™

Lo que queda es reemplazar la propiedad config de cada plugin.

Ver en asciinema.

  1. Seleccionamos el patrÃģn que vamos a buscar. En este caso config =.
  2. Comenzamos a grabar el macro usando el atajo <leader>i.
  3. Hacemos las operaciones necesarias.
  4. Terminamos de grabar el macro presionando q.
  5. Presionamos n para ir al siguiente punto.
  6. Repetimos el macro con el atajo <F8>.

BÚsqueda y reemplazo

Porque muchas veces no necesitamos herramientas complicadas.

En vim podemos usar el comando substitute. Esta es la sintaxis.

%s/<patrÃģn>/<reemplazo>/g
ðŸ”Ĩ āļ‚āđˆāļēāļ§āļ”āđˆāļ§āļ™: vonheikemen/como sobrevivir sin cursores multiples en vim mh - āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļĢāđ‰āļ­āļ™ ðŸ”Ĩ āļ‚āđˆāļēāļ§āļ”āđˆāļ§āļ™: vonheikemen/como sobrevivir sin cursores multiples en vim mh - āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļĢāđ‰āļ­āļ™

Aquí % es el "rango" de la bÚsqueda, si usamos % quiere decir que queremos buscar en todo el archivo. s es el comando, no tenemos que escribir el nombre completo substitute. <patrÃģn> es la expresiÃģn regular que queremos buscar. <reemplazo> es el texto queremos usar. g es un "flag" que le indica a vim que debe buscar en toda la línea. Noten que cada una de estas secciones estÃĄ separada por /, pero podemos usar otros caracteres.

Vamos con un ejemplo. Digamos que queremos cambiar la palabra config por setup. No necesitamos conocer nada de expresiones regulares, sÃģlo colocamos las palabras en el lugar correcto.

%s/config/setup/g
ðŸ”Ĩ āļ‚āđˆāļēāļ§āļ”āđˆāļ§āļ™: vonheikemen/como sobrevivir sin cursores multiples en vim mh - āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļĢāđ‰āļ­āļ™ ðŸ”Ĩ āļ‚āđˆāļēāļ§āļ”āđˆāļ§āļ™: vonheikemen/como sobrevivir sin cursores multiples en vim mh - āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļĢāđ‰āļ­āļ™

El Kirby tuerto

Okey. Si hay algo que les recomiendo aprender de expresiones regulares en vim son los "grupos". Incluso un pequeÃąo truco puede traer muchos beneficios.

ÂŋQuÃĐ es eso del kirby tuerto? Es la forma de recordar esta sintaxis.

\(.*\)
ðŸ”Ĩ āļ‚āđˆāļēāļ§āļ”āđˆāļ§āļ™: vonheikemen/como sobrevivir sin cursores multiples en vim mh - āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļĢāđ‰āļ­āļ™ ðŸ”Ĩ āļ‚āđˆāļēāļ§āļ”āđˆāļ§āļ™: vonheikemen/como sobrevivir sin cursores multiples en vim mh - āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļĢāđ‰āļ­āļ™

Este truco lo aprendí de ThePrimeagen.

Con este patrÃģn podemos capturar un pedazo de texto y crear un "grupo". Una vez que tenemos un grupo podremos utilizar el texto en nuestro texto de reemplazo.

Consideren este comando.

%s/`\(.*\)`/[\1](#how-to-configure-\1-lsp)
ðŸ”Ĩ āļ‚āđˆāļēāļ§āļ”āđˆāļ§āļ™: vonheikemen/como sobrevivir sin cursores multiples en vim mh - āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļĢāđ‰āļ­āļ™ ðŸ”Ĩ āļ‚āđˆāļēāļ§āļ”āđˆāļ§āļ™: vonheikemen/como sobrevivir sin cursores multiples en vim mh - āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļĢāđ‰āļ­āļ™

Aquí capturamos todo el texto que se encuentre entre comillas. Luego utilizamos el texto del grupo con el patrÃģn \1 en el texto de reemplazo. Aquí tienen un demo.

Ver en asciinema.

En este demo se puede observar en tiempo real el efecto del comando mientras escribo. Tengo entendido que esto es Único de neovim (puedo estar equivocado). Pero sí, con este efecto en tiempo real el comando substitute puede ser una buena alternativa (en algunos casos) a los cursores mÚltiples.

Si les preocupa no poder recordar la sintaxis del Kirby tuerto consideren crear un atajo.

cnoremap <F2> \(.*\)
ðŸ”Ĩ āļ‚āđˆāļēāļ§āļ”āđˆāļ§āļ™: vonheikemen/como sobrevivir sin cursores multiples en vim mh - āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļĢāđ‰āļ­āļ™ ðŸ”Ĩ āļ‚āđˆāļēāļ§āļ”āđˆāļ§āļ™: vonheikemen/como sobrevivir sin cursores multiples en vim mh - āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļĢāđ‰āļ­āļ™

De esta manera sÃģlo tienen que presionar <F2> para crear el grupo.

ConclusiÃģn

Ya estÃĄn listos. Pueden salir al mundo y ser productivos con vim. No puedo garantizar que serÃĄn felices pero sobrevivirÃĄn. EstÃĄ bien si todavía consideran que los cursores mÚltiples es la mejor herramienta. No importa, pueden vivir sin ellos mientras estÃĄn en vim.


Gracias por su tiempo. Si este artículo les pareciÃģ Útil y quieren apoyar mis esfuerzos para crear mÃĄs contenido pueden dejar una propina en ko-fi.com/vonheikemen.

buy me a coffee

Top comments (0)