refactor(generator): remove nested loop for event aliases (#32780)

After #32777 the aliases no longer need to come later, so the list of
autocommand names can be fully sorted.
This commit is contained in:
zeertzjq
2025-03-09 06:35:51 +08:00
committed by GitHub
parent 9271329635
commit e02ee7410a
3 changed files with 173 additions and 162 deletions

View File

@@ -3,9 +3,14 @@ local names_file = arg[2]
local auevents = require('nvim.auevents') local auevents = require('nvim.auevents')
local events = auevents.events local events = auevents.events
local aliases = auevents.aliases
local enum_tgt = io.open(fileio_enum_file, 'w') --- @type string[]
local names_tgt = io.open(names_file, 'w') local names = vim.tbl_keys(vim.tbl_extend('error', events, aliases))
table.sort(names)
local enum_tgt = assert(io.open(fileio_enum_file, 'w'))
local names_tgt = assert(io.open(names_file, 'w'))
enum_tgt:write([[ enum_tgt:write([[
// IWYU pragma: private, include "nvim/autocmd_defs.h" // IWYU pragma: private, include "nvim/autocmd_defs.h"
@@ -18,23 +23,25 @@ static const struct event_name {
int event; int event;
} event_names[] = {]]) } event_names[] = {]])
local aliases = 0 for i, name in ipairs(names) do
for i, event in ipairs(events) do enum_tgt:write(('\n EVENT_%s = %u,'):format(name:upper(), i - 1))
enum_tgt:write(('\n EVENT_%s = %u,'):format(event[1]:upper(), i + aliases - 1)) local pref_name = aliases[name] ~= nil and aliases[name] or name
local win_local = events[pref_name]
assert(win_local ~= nil)
-- Events with positive keys aren't allowed in 'eventignorewin'. -- Events with positive keys aren't allowed in 'eventignorewin'.
local event_int = ('%sEVENT_%s'):format(event[3] and '-' or '', event[1]:upper()) names_tgt:write(
names_tgt:write(('\n {%u, "%s", %s},'):format(#event[1], event[1], event_int)) ('\n [EVENT_%s] = {%u, "%s", %sEVENT_%s},'):format(
for _, alias in ipairs(event[2]) do name:upper(),
aliases = aliases + 1 #name,
names_tgt:write(('\n {%u, "%s", %s},'):format(#alias, alias, event_int)) name,
enum_tgt:write(('\n EVENT_%s = %u,'):format(alias:upper(), i + aliases - 1)) win_local and '-' or '',
end pref_name:upper()
if i == #events then -- Last item. )
enum_tgt:write(('\n NUM_EVENTS = %u,'):format(i + aliases)) )
end
end end
names_tgt:write('\n {0, NULL, (event_T)0},\n};\n') enum_tgt:write(('\n NUM_EVENTS = %u,'):format(#names))
names_tgt:write('\n [NUM_EVENTS] = {0, NULL, (event_T)0},\n};\n')
names_tgt:write('\nstatic AutoCmdVec autocmds[NUM_EVENTS] = { 0 };\n') names_tgt:write('\nstatic AutoCmdVec autocmds[NUM_EVENTS] = { 0 };\n')
names_tgt:close() names_tgt:close()

View File

@@ -113,19 +113,12 @@ w('\nsyn case ignore')
local vimau_start = 'syn keyword vimAutoEvent contained ' local vimau_start = 'syn keyword vimAutoEvent contained '
w('\n\n' .. vimau_start) w('\n\n' .. vimau_start)
for _, au in ipairs(auevents.events) do for au, _ in vim.spairs(vim.tbl_extend('error', auevents.events, auevents.aliases)) do
if not auevents.nvim_specific[au[1]] then if not auevents.nvim_specific[au] then
if lld.line_length > 850 then if lld.line_length > 850 then
w('\n' .. vimau_start) w('\n' .. vimau_start)
end end
w(' ' .. au[1]) w(' ' .. au)
for _, alias in ipairs(au[2]) do
if lld.line_length > 850 then
w('\n' .. vimau_start)
end
-- au[1] is aliased to alias
w(' ' .. alias)
end
end end
end end

View File

@@ -1,142 +1,153 @@
return { return {
--- @type [string, string[], boolean][] List of [eventname, aliases, window-local event] tuples. --- @type table<string,boolean>
--- Keys are events names.
--- Values are boolean indicating whether the event is window-local.
events = { events = {
{ 'BufAdd', { 'BufCreate' }, true }, -- after adding a buffer to the buffer list BufAdd = true, -- after adding a buffer to the buffer list
{ 'BufDelete', {}, true }, -- deleting a buffer from the buffer list BufDelete = true, -- deleting a buffer from the buffer list
{ 'BufEnter', {}, true }, -- after entering a buffer BufEnter = true, -- after entering a buffer
{ 'BufFilePost', {}, true }, -- after renaming a buffer BufFilePost = true, -- after renaming a buffer
{ 'BufFilePre', {}, true }, -- before renaming a buffer BufFilePre = true, -- before renaming a buffer
{ 'BufHidden', {}, true }, -- just after buffer becomes hidden BufHidden = true, -- just after buffer becomes hidden
{ 'BufLeave', {}, true }, -- before leaving a buffer BufLeave = true, -- before leaving a buffer
{ 'BufModifiedSet', {}, true }, -- after the 'modified' state of a buffer changes BufModifiedSet = true, -- after the 'modified' state of a buffer changes
{ 'BufNew', {}, true }, -- after creating any buffer BufNew = true, -- after creating any buffer
{ 'BufNewFile', {}, true }, -- when creating a buffer for a new file BufNewFile = true, -- when creating a buffer for a new file
{ 'BufReadCmd', {}, true }, -- read buffer using command BufReadCmd = true, -- read buffer using command
{ 'BufReadPost', { 'BufRead' }, true }, -- after reading a buffer BufReadPost = true, -- after reading a buffer
{ 'BufReadPre', {}, true }, -- before reading a buffer BufReadPre = true, -- before reading a buffer
{ 'BufUnload', {}, true }, -- just before unloading a buffer BufUnload = true, -- just before unloading a buffer
{ 'BufWinEnter', {}, true }, -- after showing a buffer in a window BufWinEnter = true, -- after showing a buffer in a window
{ 'BufWinLeave', {}, true }, -- just after buffer removed from window BufWinLeave = true, -- just after buffer removed from window
{ 'BufWipeout', {}, true }, -- just before really deleting a buffer BufWipeout = true, -- just before really deleting a buffer
{ 'BufWriteCmd', {}, true }, -- write buffer using command BufWriteCmd = true, -- write buffer using command
{ 'BufWritePost', {}, true }, -- after writing a buffer BufWritePost = true, -- after writing a buffer
{ 'BufWritePre', { 'BufWrite' }, true }, -- before writing a buffer BufWritePre = true, -- before writing a buffer
{ 'ChanInfo', {}, false }, -- info was received about channel ChanInfo = false, -- info was received about channel
{ 'ChanOpen', {}, false }, -- channel was opened ChanOpen = false, -- channel was opened
{ 'CmdUndefined', {}, false }, -- command undefined CmdUndefined = false, -- command undefined
{ 'CmdWinEnter', {}, false }, -- after entering the cmdline window CmdWinEnter = false, -- after entering the cmdline window
{ 'CmdWinLeave', {}, false }, -- before leaving the cmdline window CmdWinLeave = false, -- before leaving the cmdline window
{ 'CmdlineChanged', {}, false }, -- command line was modified CmdlineChanged = false, -- command line was modified
{ 'CmdlineEnter', {}, false }, -- after entering cmdline mode CmdlineEnter = false, -- after entering cmdline mode
{ 'CmdlineLeave', {}, false }, -- before leaving cmdline mode CmdlineLeave = false, -- before leaving cmdline mode
{ 'ColorScheme', {}, false }, -- after loading a colorscheme ColorScheme = false, -- after loading a colorscheme
{ 'ColorSchemePre', {}, false }, -- before loading a colorscheme ColorSchemePre = false, -- before loading a colorscheme
{ 'CompleteChanged', {}, false }, -- after popup menu changed CompleteChanged = false, -- after popup menu changed
{ 'CompleteDone', {}, false }, -- after finishing insert complete CompleteDone = false, -- after finishing insert complete
{ 'CompleteDonePre', {}, false }, -- idem, before clearing info CompleteDonePre = false, -- idem, before clearing info
{ 'CursorHold', {}, true }, -- cursor in same position for a while CursorHold = true, -- cursor in same position for a while
{ 'CursorHoldI', {}, true }, -- idem, in Insert mode CursorHoldI = true, -- idem, in Insert mode
{ 'CursorMoved', {}, true }, -- cursor was moved CursorMoved = true, -- cursor was moved
{ 'CursorMovedC', {}, true }, -- cursor was moved in Cmdline mode CursorMovedC = true, -- cursor was moved in Cmdline mode
{ 'CursorMovedI', {}, true }, -- cursor was moved in Insert mode CursorMovedI = true, -- cursor was moved in Insert mode
{ 'DiagnosticChanged', {}, false }, -- diagnostics in a buffer were modified DiagnosticChanged = false, -- diagnostics in a buffer were modified
{ 'DiffUpdated', {}, false }, -- diffs have been updated DiffUpdated = false, -- diffs have been updated
{ 'DirChanged', {}, false }, -- directory changed DirChanged = false, -- directory changed
{ 'DirChangedPre', {}, false }, -- directory is going to change DirChangedPre = false, -- directory is going to change
{ 'EncodingChanged', { 'FileEncoding' }, false }, -- after changing the 'encoding' option EncodingChanged = false, -- after changing the 'encoding' option
{ 'ExitPre', {}, false }, -- before exiting ExitPre = false, -- before exiting
{ 'FileAppendCmd', {}, true }, -- append to a file using command FileAppendCmd = true, -- append to a file using command
{ 'FileAppendPost', {}, true }, -- after appending to a file FileAppendPost = true, -- after appending to a file
{ 'FileAppendPre', {}, true }, -- before appending to a file FileAppendPre = true, -- before appending to a file
{ 'FileChangedRO', {}, true }, -- before first change to read-only file FileChangedRO = true, -- before first change to read-only file
{ 'FileChangedShell', {}, true }, -- after shell command that changed file FileChangedShell = true, -- after shell command that changed file
{ 'FileChangedShellPost', {}, true }, -- after (not) reloading changed file FileChangedShellPost = true, -- after (not) reloading changed file
{ 'FileReadCmd', {}, true }, -- read from a file using command FileReadCmd = true, -- read from a file using command
{ 'FileReadPost', {}, true }, -- after reading a file FileReadPost = true, -- after reading a file
{ 'FileReadPre', {}, true }, -- before reading a file FileReadPre = true, -- before reading a file
{ 'FileType', {}, true }, -- new file type detected (user defined) FileType = true, -- new file type detected (user defined)
{ 'FileWriteCmd', {}, true }, -- write to a file using command FileWriteCmd = true, -- write to a file using command
{ 'FileWritePost', {}, true }, -- after writing a file FileWritePost = true, -- after writing a file
{ 'FileWritePre', {}, true }, -- before writing a file FileWritePre = true, -- before writing a file
{ 'FilterReadPost', {}, true }, -- after reading from a filter FilterReadPost = true, -- after reading from a filter
{ 'FilterReadPre', {}, true }, -- before reading from a filter FilterReadPre = true, -- before reading from a filter
{ 'FilterWritePost', {}, true }, -- after writing to a filter FilterWritePost = true, -- after writing to a filter
{ 'FilterWritePre', {}, true }, -- before writing to a filter FilterWritePre = true, -- before writing to a filter
{ 'FocusGained', {}, false }, -- got the focus FocusGained = false, -- got the focus
{ 'FocusLost', {}, false }, -- lost the focus to another app FocusLost = false, -- lost the focus to another app
{ 'FuncUndefined', {}, false }, -- if calling a function which doesn't exist FuncUndefined = false, -- if calling a function which doesn't exist
{ 'GUIEnter', {}, false }, -- after starting the GUI GUIEnter = false, -- after starting the GUI
{ 'GUIFailed', {}, false }, -- after starting the GUI failed GUIFailed = false, -- after starting the GUI failed
{ 'InsertChange', {}, true }, -- when changing Insert/Replace mode InsertChange = true, -- when changing Insert/Replace mode
{ 'InsertCharPre', {}, true }, -- before inserting a char InsertCharPre = true, -- before inserting a char
{ 'InsertEnter', {}, true }, -- when entering Insert mode InsertEnter = true, -- when entering Insert mode
{ 'InsertLeave', {}, true }, -- just after leaving Insert mode InsertLeave = true, -- just after leaving Insert mode
{ 'InsertLeavePre', {}, true }, -- just before leaving Insert mode InsertLeavePre = true, -- just before leaving Insert mode
{ 'LspAttach', {}, false }, -- after an LSP client attaches to a buffer LspAttach = false, -- after an LSP client attaches to a buffer
{ 'LspDetach', {}, false }, -- after an LSP client detaches from a buffer LspDetach = false, -- after an LSP client detaches from a buffer
{ 'LspNotify', {}, false }, -- after an LSP notice has been sent to the server LspNotify = false, -- after an LSP notice has been sent to the server
{ 'LspProgress', {}, false }, -- after a LSP progress update LspProgress = false, -- after a LSP progress update
{ 'LspRequest', {}, false }, -- after an LSP request is started, canceled, or completed LspRequest = false, -- after an LSP request is started, canceled, or completed
{ 'LspTokenUpdate', {}, false }, -- after a visible LSP token is updated LspTokenUpdate = false, -- after a visible LSP token is updated
{ 'MenuPopup', {}, false }, -- just before popup menu is displayed MenuPopup = false, -- just before popup menu is displayed
{ 'ModeChanged', {}, false }, -- after changing the mode ModeChanged = false, -- after changing the mode
{ 'OptionSet', {}, false }, -- after setting any option OptionSet = false, -- after setting any option
{ 'QuickFixCmdPost', {}, false }, -- after :make, :grep etc. QuickFixCmdPost = false, -- after :make, :grep etc.
{ 'QuickFixCmdPre', {}, false }, -- before :make, :grep etc. QuickFixCmdPre = false, -- before :make, :grep etc.
{ 'QuitPre', {}, false }, -- before :quit QuitPre = false, -- before :quit
{ 'RecordingEnter', {}, true }, -- when starting to record a macro RecordingEnter = true, -- when starting to record a macro
{ 'RecordingLeave', {}, true }, -- just before a macro stops recording RecordingLeave = true, -- just before a macro stops recording
{ 'RemoteReply', {}, false }, -- upon string reception from a remote vim RemoteReply = false, -- upon string reception from a remote vim
{ 'SafeState', {}, false }, -- going to wait for a character SafeState = false, -- going to wait for a character
{ 'SearchWrapped', {}, true }, -- after the search wrapped around SearchWrapped = true, -- after the search wrapped around
{ 'SessionLoadPost', {}, false }, -- after loading a session file SessionLoadPost = false, -- after loading a session file
{ 'SessionWritePost', {}, false }, -- after writing a session file SessionWritePost = false, -- after writing a session file
{ 'ShellCmdPost', {}, false }, -- after ":!cmd" ShellCmdPost = false, -- after ":!cmd"
{ 'ShellFilterPost', {}, true }, -- after ":1,2!cmd", ":w !cmd", ":r !cmd". ShellFilterPost = true, -- after ":1,2!cmd", ":w !cmd", ":r !cmd".
{ 'Signal', {}, false }, -- after nvim process received a signal Signal = false, -- after nvim process received a signal
{ 'SourceCmd', {}, false }, -- sourcing a Vim script using command SourceCmd = false, -- sourcing a Vim script using command
{ 'SourcePost', {}, false }, -- after sourcing a Vim script SourcePost = false, -- after sourcing a Vim script
{ 'SourcePre', {}, false }, -- before sourcing a Vim script SourcePre = false, -- before sourcing a Vim script
{ 'SpellFileMissing', {}, false }, -- spell file missing SpellFileMissing = false, -- spell file missing
{ 'StdinReadPost', {}, false }, -- after reading from stdin StdinReadPost = false, -- after reading from stdin
{ 'StdinReadPre', {}, false }, -- before reading from stdin StdinReadPre = false, -- before reading from stdin
{ 'SwapExists', {}, false }, -- found existing swap file SwapExists = false, -- found existing swap file
{ 'Syntax', {}, false }, -- syntax selected Syntax = false, -- syntax selected
{ 'TabClosed', {}, false }, -- a tab has closed TabClosed = false, -- a tab has closed
{ 'TabEnter', {}, false }, -- after entering a tab page TabEnter = false, -- after entering a tab page
{ 'TabLeave', {}, false }, -- before leaving a tab page TabLeave = false, -- before leaving a tab page
{ 'TabNew', {}, false }, -- when creating a new tab TabNew = false, -- when creating a new tab
{ 'TabNewEntered', {}, false }, -- after entering a new tab TabNewEntered = false, -- after entering a new tab
{ 'TermChanged', {}, false }, -- after changing 'term' TermChanged = false, -- after changing 'term'
{ 'TermClose', {}, false }, -- after the process exits TermClose = false, -- after the process exits
{ 'TermEnter', {}, false }, -- after entering Terminal mode TermEnter = false, -- after entering Terminal mode
{ 'TermLeave', {}, false }, -- after leaving Terminal mode TermLeave = false, -- after leaving Terminal mode
{ 'TermOpen', {}, false }, -- after opening a terminal buffer TermOpen = false, -- after opening a terminal buffer
{ 'TermRequest', {}, false }, -- after an unhandled OSC sequence is emitted TermRequest = false, -- after an unhandled OSC sequence is emitted
{ 'TermResponse', {}, false }, -- after setting "v:termresponse" TermResponse = false, -- after setting "v:termresponse"
{ 'TextChanged', {}, true }, -- text was modified TextChanged = true, -- text was modified
{ 'TextChangedI', {}, true }, -- text was modified in Insert mode(no popup) TextChangedI = true, -- text was modified in Insert mode(no popup)
{ 'TextChangedP', {}, true }, -- text was modified in Insert mode(popup) TextChangedP = true, -- text was modified in Insert mode(popup)
{ 'TextChangedT', {}, true }, -- text was modified in Terminal mode TextChangedT = true, -- text was modified in Terminal mode
{ 'TextYankPost', {}, true }, -- after a yank or delete was done (y, d, c) TextYankPost = true, -- after a yank or delete was done (y, d, c)
{ 'UIEnter', {}, false }, -- after UI attaches UIEnter = false, -- after UI attaches
{ 'UILeave', {}, false }, -- after UI detaches UILeave = false, -- after UI detaches
{ 'User', {}, false }, -- user defined autocommand User = false, -- user defined autocommand
{ 'VimEnter', {}, false }, -- after starting Vim VimEnter = false, -- after starting Vim
{ 'VimLeave', {}, false }, -- before exiting Vim VimLeave = false, -- before exiting Vim
{ 'VimLeavePre', {}, false }, -- before exiting Vim and writing ShaDa file VimLeavePre = false, -- before exiting Vim and writing ShaDa file
{ 'VimResized', {}, false }, -- after Vim window was resized VimResized = false, -- after Vim window was resized
{ 'VimResume', {}, false }, -- after Nvim is resumed VimResume = false, -- after Nvim is resumed
{ 'VimSuspend', {}, false }, -- before Nvim is suspended VimSuspend = false, -- before Nvim is suspended
{ 'WinClosed', {}, true }, -- after closing a window WinClosed = true, -- after closing a window
{ 'WinEnter', {}, true }, -- after entering a window WinEnter = true, -- after entering a window
{ 'WinLeave', {}, true }, -- before leaving a window WinLeave = true, -- before leaving a window
{ 'WinNew', {}, false }, -- when entering a new window WinNew = false, -- when entering a new window
{ 'WinResized', {}, true }, -- after a window was resized WinResized = true, -- after a window was resized
{ 'WinScrolled', {}, true }, -- after a window was scrolled or resized WinScrolled = true, -- after a window was scrolled or resized
}, },
-- List of nvim-specific events or aliases for the purpose of generating --- @type table<string,string>
-- syntax file --- Keys are event aliases.
--- Values are the names in the `events` table above.
aliases = {
BufCreate = 'BufAdd',
BufRead = 'BufReadPost',
BufWrite = 'BufWritePre',
FileEncoding = 'EncodingChanged',
},
--- @type table<string,true>
--- List of Nvim-specific events or aliases for generating syntax file.
nvim_specific = { nvim_specific = {
BufModifiedSet = true, BufModifiedSet = true,
DiagnosticChanged = true, DiagnosticChanged = true,