¿Cuál es el orden de los eventos WinEnter, BufEnter, BufRead, Syntax, FileType?


16

He pasado por la autocmd.txtayuda, pero la información sobre esto está dispersa y no siempre está presente (por ejemplo, con BufRead).

¿Podría alguien que entienda bien esto enumerar el orden de estos eventos, tal vez con las condiciones marcadas en paréntesis, como

WinEnter   
BufEnter (if this window is for a different buffer than the current)

y así sucesivamente, para referencia fácil?

Nota (copiada de mi propio comentario a continuación) : no estoy hablando de explicaciones individuales de ellos, que están bien, sino de cómo interactúan entre sí y en qué orden suceden. Por ejemplo, WinEnterdice "Vim ejecuta los comandos automáticos de BufEnter después de los comandos automáticos de WinEnter", TabEnterdice "Después de activar el WinEnter y antes de activar el evento BufEnter", todo está disperso así en muchos lugares. Y a veces no se menciona en absoluto (por ejemplo BufRead, no menciona si se ejecuta después de BufEnter o antes; tal vez un experto puede inferirlo de otra información allí, pero no puedo.
Por lo tanto, mi intención aquí es cree una referencia única y simple para el orden de estos eventos que los no expertos puedan buscar rápidamente,autocmd especificaciones del evento


Creo que la mayoría de las explicaciones están bien, ¿puedes dar una lista de las que no puedes entender?
nobe4

@ Nobe4 No estoy hablando de explicaciones individuales de ellos, que de hecho están bien, sino de cómo interactúan entre sí y en qué orden suceden. Por ejemplo, WinEnterdice "Vim ejecuta los comandos automáticos de BufEnter después de los comandos automáticos de WinEnter", TabEnterdice "Después de activar el WinEnter y antes de activar el evento BufEnter", todo está disperso así en muchos lugares. Y a veces no se menciona en absoluto (por ej. BufReadNo menciona si se ejecuta después de BufEnter o antes - tal vez un experto puede inferir que de alguna otra pieza de información, pero no puedo.
Sundar - Restablecer Mónica

Por lo tanto, mi intención aquí es crear una referencia única y simple para el orden de estos eventos que los no expertos puedan buscar rápidamente, para ser más precisos en nuestras autocmdespecificaciones de eventos.
sundar - Restablecer Monica

OK, no entendí la pregunta. Puede intentar registrar cada evento y ver el orden de aparición (puedo responder si lo desea)
nobe4

Su intención es realmente preguntar acerca de alguien que proporcione una referencia tan simple, no crear una (usted mismo);)
VanLaser

Respuestas:


11

Para completar la respuesta @sundar:

Puede registrar el orden de los eventos simplemente con una función de registro:

augroup EventLoggin
  autocmd!
  autocmd BufNewFile * call s:Log('BufNewFile')
  autocmd BufReadPre * call s:Log('BufReadPre')
  ...
  autocmd User * call s:Log('User')
augroup END

function! s:Log(eventName) abort
  silent execute '!echo '.a:eventName.' >> log'
endfunction

Vea el archivo completo aquí: https://gist.github.com/nobe4/aa8313fe98ca8821afad

Entonces puede tail -f logy obtiene una actividad de eventos de autocomando en tiempo real.


3
Hice un complemento simple para esto, mira aquí .
Karl Yngve Lervåg

66
Tenga en cuenta que @ KarlYngveLervåg ha movido su complemento a otra ruta . Gracias a Karl!
Luc Hermitte

¡Gracias por notar y comentar, Luc! (Nota: ¡No puedo actualizar mi comentario para arreglar el enlace muerto, lo siento!)
Karl Yngve Lervåg

10

Intenté buscar en Google esto con diferentes conjuntos de palabras clave, y obtuve oro en uno de esos intentos con este resultado: http://www.ibm.com/developerworks/library/l-vim-script-5/

Específicamente, esta parte es relevante para la pregunta actual:

Por ejemplo, si inicia Vim, edite un archivo llamado demo.txt, cambie al modo Insertar, escriba algún texto, guarde el archivo y luego salga, su sesión de Vim recibe una serie de eventos como los que se muestran en el Listado 1.

Listado 1. Secuencia de eventos en una simple sesión de edición de Vim

> vim

  1. BufWinEnter (crear una ventana predeterminada)
  2. BufEnter (crear un búfer predeterminado)
  3. VimEnter (inicie la sesión de Vim) : edite demo.txt
  4. BufNew (cree un nuevo búfer para contener demo.txt)
  5. BufAdd (agrega ese nuevo buffer a la lista de buffer de la sesión)
  6. BufLeave (sale del búfer predeterminado)
  7. BufWinLeave (sale de la ventana predeterminada)
  8. BufUnload (eliminar el búfer predeterminado de la lista de búfer)
  9. BufDelete (desasignar el búfer predeterminado)
  10. BufReadCmd (lea los contextos de demo.txt en el nuevo búfer)
  11. BufEnter (active el nuevo búfer)
  12. BufWinEnter (active la nueva ventana del búfer) i
  13. InsertEnter (cambiar al modo Insertar)

Todavía no es del todo completo (por ejemplo, no se menciona a BufReadaka BufReadPost, pero supongo que vendría después BufReadCmd), pero es un excelente comienzo.

Sin embargo, una información crucial que falta es cómo los eventos FileTypey Syntaxautocmd interactúan con esto (suponiendo que filetypeya syntaxestán activados , y se abre un nuevo archivo cuyo tipo de archivo y sintaxis son conocidos por Vim).


77
Esto solo es cierto cuando está editando un solo archivo. Contrariamente a la creencia popular, el orden de aplicación de autocmds en varios archivos no está bien definido. E incluso con un solo archivo, el orden ha cambiado varias veces con la versión de Vim. Los problemas que esto puede (y causa) causar complementos se han discutido hasta la muerte en vim_dev, y el diseño general no va a cambiar en el futuro predecible. En cuanto a obtener una comprensión integral , bueno, hay 139 ocurrencias apply_autocmdsen las fuentes de Vim 7.4.827. Buena suerte con eso.
Sato Katsura

@SatoKatsura Este es el tipo de opinión experta que estaba buscando, ¡gracias! ¿Hay alguna referencia que pueda sugerir para aprender más sobre esto (aparte de sumergirse en las fuentes de Vim)? Además, esto podría estar completamente fuera de su área de interés, pero ¿tiene alguna idea de si las cosas están mejor definidas en la tierra 'Neovim'?
sundar - Restablecer Monica

Me temo que no conozco ninguna referencia definitiva. autocmds en Vim son un desastre, no creo que sea realmente posible escribir una referencia definitiva, excepto por unos pocos casos simples. Supongo que todos se conforman con "generalmente funciona" y se encogen de hombros cuando no es así. En cuanto a neovim, personalmente tengo sentimientos encontrados sobre el proyecto. No he mirado el código recientemente; Supongo que puede obtener una respuesta sobre su rastreador de problemas.
Sato Katsura

También el término "evento" en sí mismo debería subvertir la idea de un orden demasiado fijo.
VanLaser
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.