Como abrir muchos archivos en vim (y mas)
- 3 vim
- 6 tips-and-tricks
Introducción
Por si te lo preguntás, la imagen está pensada para representar al trickster, ya que planeo hacer muchas publicaciones sobre tips y trucos.
Este será un artículo corto explorando las diferentes formas de abrir múltiples archivos en vim a la vez, y las formas básicas de interactuar con ellos, como pestañas y ventanas.
Las opciones básicas son:
Directamente desde la página de ayuda de vim:
Resumen:
Un buffer es el texto en memoria de un archivo.
Una ventana es una vista de un buffer.
Una pestaña es una colección de ventanas.
En los siguientes ejemplos estaré usando los archivos markdown de 2024 de este blog para ilustrar cómo funciona, cómo moverse entre buffers, pestañas y ventanas. Tené en cuenta que en zsh **.md
se expandirá automáticamente a todos los archivos en esa carpeta con la ruta relativa completa. Por ejemplo, para un solo archivo: priv/posts/2024/02-24-multinode-setup.md
¿Cómo abrir múltiples archivos como buffers en vim?
> vim priv/posts/2024/**.md
Si escribimos :buffers
, entonces podemos ver la lista de buffers abiertos en nuestra instancia de vim. Usando :bnext
y :bprev
podés moverte entre buffers. Los símbolos muestran qué buffer está activo, cuál está oculto o inactivo:
:buffers
1 h "02-24-multinode-setup.md" line 1
2 h "02-25-upgrading-k3s-with-system-upgrade-controller.md" line 1
3 h "03-16-getting-started-with-wallaby-integration-tests.md" line 1
4 h "03-19-rss-is-not-dead-yet.md" line 1
5 #h "04-14-remote-iex-session.md" line 1
6 %a "04-16-migrating-from-cronjobs-to-quantum-core.md" line 1
7 h "04-16-running-cronjobs-in-kubernetes.md" line 1
8 h "04-16-vim-open-multiple-files.md" line 1
Press ENTER or type command to continue
¿Cómo abrir múltiples archivos como pestañas en vim?
De manera similar, si hacemos vim -p
, obtendremos todos los buffers abiertos como pestañas. Luego podés listar las pestañas con :tabs
, moverte entre ellas con :tabn
y retroceder con :tabp
. La principal diferencia aquí es cómo la ventana de vim trata un buffer en una sola pestaña frente a varias pestañas.
vim -p priv/posts/2024/**.md
Acá podés ver la lista de pestañas. Para vim, estas pestañas pueden contener múltiples contenidos, incluso ventanas divididas, algo que no puede suceder en una ventana de un solo buffer en una pestaña.
:tabs
Tab page 1
02-24-multinode-setup.md
Tab page 2
> 02-25-upgrading-k3s-with-system-upgrade-controller.md
Tab page 3
# 03-16-getting-started-with-wallaby-integration-tests.md
Tab page 4
03-19-rss-is-not-dead-yet.md
Tab page 5
04-14-remote-iex-session.md
Tab page 6
04-16-migrating-from-cronjobs-to-quantum-core.md
Tab page 7
04-16-running-cronjobs-in-kubernetes.md
Tab page 8
04-16-vim-open-multiple-files.md
Press ENTER or type command to continue
¿Cómo abrir múltiples archivos como ventanas en vim?
Supongo que la ventana es el concepto más complicado aquí, ya que una ventana puede mostrar un buffer, y varias ventanas pueden estar en una pestaña. Básicamente, una ventana es la forma en que podemos representar e interactuar interactivamente con un buffer.
Si quisiéramos abrir todos estos archivos como ventanas, tendríamos que hacer vim -o
para abrirlos en división horizontal o vim -O
para división vertical. Si me preguntás, esta es la característica que menos uso, pero puede ser útil en algunos escenarios.
Para moverte entre ventanas, necesitarás usar ctrl-w-<hjkl>
, dependiendo de la posición de la ventana a la que quieras saltar o moverte.
vim -o priv/posts/2024/**.md
vim -O priv/posts/2024/**.md
Bonus tip
Realizar una búsqueda y reemplazo en múltiples buffers. Vim es perfectamente capaz de hacer reemplazos avanzados. Aquí tenés un ejemplo de una de esas tareas. Cuando migraba a este blog, tenía mucho contenido en gists de github y quería convertirlos en fragmentos de código locales, así que usé el asistente de línea de comandos gist
e hice casi todos los reemplazos de manera automática con solo un comando:
:%s/{{< gist kainlite \(53f54d81934666457a46cb667f8cea58\) >}}/\=printf('```elixir\n%s\n```', substitute(system('gist -r ' . submatch(1)), '\n', '\\n', 'g'))/
Es un comando de búsqueda y reemplazo intimidante. Básicamente, lo que hace es buscar el patrón {{< gist kainlite \(capture_this_part\) >}}
para extraer el id del gist primero, luego \=
le indica a vim que queremos usar la expresión en el reemplazo. Con la ayuda de printf
, construimos nuestro fragmento de código usando la salida del comando gist -r gist_id
, y substitute
se usa para ejecutar el comando y usar la salida como parte de nuestro reemplazo.
Entonces, para el ejemplo, el siguiente gist:
{{< gist kainlite 53f54d81934666457a46cb667f8cea58 >}}
Se convertiría en el siguiente fragmento de código después de ejecutar el comando anterior (esto sería texto sin formato):
```elixir
❯ kind create cluster
Creating cluster "kind" ...
✓ Ensuring node image (kindest/node:v1.21.1) 🖼
✓ Preparing nodes 📦
✓ Writing configuration 📜
✓ Starting control-plane 🕹️
✓ Installing CNI 🔌
✓ Installing StorageClass 💾
Set kubectl context to "kind-kind"
You can now use your cluster with:
kubectl cluster-info --context kind-kind
Have a question, bug, or feature request? Let us know! https://kind.sigs.k8s.io/#community 🙂
```
Pero, ¿qué tiene que ver eso con los buffers y todo eso? Bueno, podés aplicar esa búsqueda y reemplazo a todos los buffers usando :bufdo
, por lo que nuestro comando se convertiría en:
:bufdo %s/{{< gist kainlite \(.*\) >}}/\=printf('```elixir\n%s\n```', substitute(system('gist -r ' . submatch(1)), '\n', '\\n', 'g'))/
Y eso aplicará el comando de búsqueda y reemplazo a todos los buffers abiertos. También notá el cambio en el grupo de captura para que usemos el id del gist correcto en lugar del ejemplo.
Entonces, ¿siempre fue una pestaña? ¡Sí! ¿Alguna pregunta? Dejá un comentario 👇
Errata
Si encontrás algún error o tenés alguna sugerencia, mandame un mensaje para que se pueda corregir.
También podés revisar el código fuente y los cambios en los sources aquí
No tienes cuenta? Regístrate aqui
Ya registrado? Iniciar sesión a tu cuenta ahora.
-
Comentarios
Online: 0
Por favor inicie sesión para poder escribir comentarios.