¿Por qué debería usar augroup?


31

Entiendo cómo funcionan los comandos automáticos y cómo usarlos, pero estoy un poco seguro de para qué sirve augroup. Yo leo en:help augroup

                                                    *:aug* *:augroup*
:aug[roup] {name}               Define the autocmd group name for the
                                following ":autocmd" commands.  The name "end"
                                or "END" selects the default group.
                                To avoid confusion, the name should be
                                different from existing {event} names, as this
                                most likely will not do what you intended.

Esto realmente no explica por qué son útiles, o por qué quisiera hacer un nombre de grupo de autocomando simplemente definiendo un montón de autocomandos uno al lado del otro.

Por ejemplo, si los comandos automáticos fooy barestán relacionados, ¿por qué querría hacer

augroup spam
  au!
  au foo * foo
  au bar * bar
augroup END

cuando solo podía hacer

"Autocommands for spam
au foo * foo
au bar * bar

A menos que no esté entendiendo para qué son realmente los grupos. Entonces, ¿por qué son útiles?

Respuestas:


30

La razón principal para usar augroups es permitir un mayor control sobre los rangos de comandos automáticos, por ejemplo, para eliminar un montón de comandos automáticos de una sola vez. Un patrón común es usar el au!como la primera parte de un grupo. Esto elimina todos los comandos automáticos existentes en el grupo y permite que uno comience de nuevo. Si no usó un grupo, au!eliminaría todos / muchos comandos automáticos que no deseaba eliminar.

Eliminar comandos automáticos es bastante común, por ejemplo, en complementos, ya que esto permite obtener un complemento / ftplugin varias veces. Si no eliminó los comandos automáticos, cada vez que obtuvo el complemento / ftplugin agregaría una nueva copia del mismo comando automático. Esto también es cierto para su vimrcarchivo. Al usar un grupo en su archivo vimrc, se vuelve seguro volver a cargarlo.

Para más información, ver :h 40.3.


19

Los grupos de autocomando le dan la oportunidad de organizar sus autocomandos, que es una característica bastante útil en sí misma.

Digamos que estás escribiendo un complemento. Agrupar los comandos automáticos de su complemento bajo su propio espacio de nombres tiene sentido, aunque solo sea porque le permite habilitar / deshabilitar sus comandos automáticos a voluntad.

Tu vimrcno es fundamentalmente diferente de un plugin/foo.vimmodo, todo lo que obtienes con los grupos de autocomando es básicamente más control sobre tu configuración.

En la práctica…

Si no los asigna a un grupo, los comandos automáticos se "instalan" en el grupo global de forma predeterminada. La instalación de comandos automáticos relacionados en su propio grupo no solo aclara las cosas, sino que le permite evitar el temido efecto de "acumulación" con mucha facilidad y con un solo !:

augroup spam             versus    autocmd! Foo * foo
    autocmd!                       autocmd! Bar * bar
    autocmd Foo * foo
    autocmd Bar * bar
augroup END

A la izquierda, todo el grupo se desinstala de una vez, antes de que cada comando automático de ese grupo se instale correctamente. Ordenado.

A la derecha, Vim ejecutará malgastamente la misma rutina de "desinstalación / instalación" para cada comando automático. Sucio.

Pero no tienes que escribir todo ese bloque cada vez si no quieres. Los comandos automáticos se pueden asignar directamente a un grupo para que pueda definir un grupo en algún lugar:

augroup spam
    autocmd!
augroup END

y coloca tus comandos automáticos donde quieras, incluso en otro script:

autocmd spam Foo * foo
autocmd spam Bar * bar

Esto te daría:

  • espacio de nombres
  • prevención de apilamiento
  • orden
  • flexibilidad

15

Aparte de las otras respuestas, encuentro que el beneficio práctico más inmediato es que facilita la recarga de archivos vimscript.

Por ejemplo, pegue esto en su vimrc:

autocmd BufCreate * echom "New buffer!"

Salga, reinicie, cree un nuevo búfer. ves New buffer!, que puedes verificar con :messages.

Ahora vuelva a cargar su vimrc: :source $MYVIMRCy vuelva a crear un nuevo búfer.

¿Qué ves ahora?


Si hubiera usado esto en su lugar:

augroup inform_new_buffer
    autocmd!
    autocmd BufCreate * echom "New buffer!"
augroup end

Entonces hubiera estado bien. Hago un grupo de autocmd!comandos automáticos, el comando borra todos los comandos automáticos definidos en ese grupo . Eso es importante porque:

augroup inform_new_buffer
    autocmd BufCreate * echom "New buffer!"
augroup end

Simplemente lo agregaría al mismo augroup.


En otras palabras, es la misma razón por la que todos escribimos fun!y command!, en lugar de las versiones sin la !que no permiten la anulación.


Es muy útil resaltar el significado "semántico" de !:)
llinfeng
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.