gutter and keys
This commit is contained in:
@@ -10,41 +10,22 @@
|
||||
--
|
||||
-- В каталоге --config должны лежать init.lua и подключаемые им модули.
|
||||
-- Первый позиционный аргумент открывается после выполнения этого файла
|
||||
-- через app:open(path) — как `vim main.go` или `nano main.go`.
|
||||
-- через app.editor:open(path) — как `vim main.go` или `nano main.go`.
|
||||
|
||||
print("[lua] init.lua выполнен")
|
||||
|
||||
-- Доступные методы объекта app (номера вкладок — с нуля):
|
||||
-- app:tabs() -- {{ index = 0, title = "main.rs", icon = "file" }, ...}
|
||||
-- app:active_tab() -- индекс активной вкладки
|
||||
-- app:set_active_tab(index) -- true, если вкладка существует
|
||||
-- app:next_tab() -- переключить на следующую, вернуть индекс
|
||||
-- app:previous_tab() -- переключить на предыдущую, вернуть индекс
|
||||
-- app:open_tab() -- открыть пустую вкладку, вернуть индекс
|
||||
-- app:open(path) -- открыть файл с диска, вернуть индекс вкладки;
|
||||
-- -- если файла нет — пустой буфер с таким именем
|
||||
-- app:open(path, {}) -- открыть и перевести фокус в редактор,
|
||||
-- -- курсор оставить на месте
|
||||
-- app:open(path, {m, n}) -- открыть, перевести фокус и поставить курсор
|
||||
-- -- на строку m и столбец n (с нуля)
|
||||
-- Объект app: окно, панели и глобальные привязки клавиш:
|
||||
-- app:list_dir(path) -- {{ id = "src/main.rs", name = "main.rs",
|
||||
-- -- is_dir = false }, ...}; пустой путь —
|
||||
-- -- текущий каталог, id — путь от него
|
||||
-- app:close_tab(index) -- true, если вкладка закрыта
|
||||
-- app:set_tab_icon(i, name) -- иконка вкладки из каталога Lucide
|
||||
-- -- (file, file-code, book-open, ...);
|
||||
-- -- false — нет вкладки или иконки
|
||||
-- app:clear_tab_icon(i) -- вернуть иконку по умолчанию (file)
|
||||
-- app:tab_icon(i) -- имя иконки вкладки или nil
|
||||
-- app:active_text() -- текст активной вкладки
|
||||
-- app:set_active_text(text) -- заменить текст активной вкладки
|
||||
-- app:set_language(i, "rust") -- включить подсветку (rust|go|js|json|python)
|
||||
-- -- для вкладки i; false — нет вкладки/языка
|
||||
-- app:language(i) -- язык подсветки вкладки или nil
|
||||
-- app:clear_language(i) -- выключить подсветку для вкладки
|
||||
-- app:save() -- сохранить активную вкладку в её файл
|
||||
-- app:map_key(keys, handler) -- обработчик клавиши/сочетания:
|
||||
-- app:map_key(modes, keys, handler)
|
||||
-- -- глобальный обработчик клавиши/сочетания:
|
||||
-- -- функция, имя команды или nil (удалить)
|
||||
-- -- modes — строка режимов:
|
||||
-- -- "" — все режимы
|
||||
-- -- "-" — только режим по умолчанию
|
||||
-- -- "-iv" — режим по умолчанию, i и v
|
||||
-- -- keys — сочетание:
|
||||
-- -- "a" нажатие A
|
||||
-- -- "1" нажатие 1
|
||||
-- -- "!a" отпускание A
|
||||
@@ -65,14 +46,60 @@ print("[lua] init.lua выполнен")
|
||||
-- -- completion_previous, completion_page_up,
|
||||
-- -- completion_page_down, completion_accept,
|
||||
-- -- completion_cancel, completion_dismiss
|
||||
-- app:set_mode(mode) -- режим глобальных привязок (один символ)
|
||||
-- app:mode() -- текущий режим глобальных привязок
|
||||
-- app:close() -- закрыть окно
|
||||
-- app:toggle_maximize()
|
||||
-- app:set_maximized(true/false)
|
||||
-- app:minimize()
|
||||
-- app:is_maximized()
|
||||
--
|
||||
-- Редактор app.editor (номера вкладок — с нуля):
|
||||
-- app.editor:tabs() -- {{ index = 0, title = "main.rs",
|
||||
-- -- icon = "file" }, ...}
|
||||
-- app.editor:active_tab() -- индекс активной вкладки
|
||||
-- app.editor:set_active_tab(index) -- true, если вкладка существует
|
||||
-- app.editor:next_tab() -- переключить на следующую, вернуть индекс
|
||||
-- app.editor:previous_tab() -- переключить на предыдущую, вернуть индекс
|
||||
-- app.editor:open_tab() -- открыть пустую вкладку, вернуть индекс
|
||||
-- app.editor:open(path) -- открыть файл с диска, вернуть индекс вкладки;
|
||||
-- -- если файла нет — пустой буфер с таким именем
|
||||
-- app.editor:open(path, {}) -- открыть и перевести фокус в редактор,
|
||||
-- -- курсор оставить на месте
|
||||
-- app.editor:open(path, {m, n}) -- открыть, перевести фокус и поставить
|
||||
-- -- курсор на строку m и столбец n (с нуля)
|
||||
-- app.editor:close_tab(index) -- true, если вкладка закрыта
|
||||
-- app.editor:set_tab_icon(i, name) -- иконка вкладки из каталога Lucide
|
||||
-- -- (file, file-code, book-open, ...);
|
||||
-- -- false — нет вкладки или иконки
|
||||
-- app.editor:clear_tab_icon(i) -- вернуть иконку по умолчанию (file)
|
||||
-- app.editor:tab_icon(i) -- имя иконки вкладки или nil
|
||||
-- app.editor:set_gutter_icon(line, name[, color])
|
||||
-- -- иконка на поле слева от редактора
|
||||
-- -- (активная вкладка, строка с нуля);
|
||||
-- -- color — #RGB/#RGBA/#RRGGBB/#RRGGBBAA;
|
||||
-- -- false — неизвестная иконка или цвет
|
||||
-- app.editor:gutter_icon(line) -- имя иконки gutter или nil
|
||||
-- app.editor:gutter_color(line) -- цвет иконки gutter или nil
|
||||
-- app.editor:clear_gutter_icon(line) -- убрать иконку со строки
|
||||
-- app.editor:clear_gutter() -- убрать все иконки активной вкладки
|
||||
-- app.editor:active_text() -- текст активной вкладки
|
||||
-- app.editor:set_active_text(text) -- заменить текст активной вкладки
|
||||
-- app.editor:set_language(i, "rust") -- включить подсветку
|
||||
-- -- (rust|go|js|json|python) для вкладки i;
|
||||
-- -- false — нет вкладки/языка
|
||||
-- app.editor:language(i) -- язык подсветки вкладки или nil
|
||||
-- app.editor:clear_language(i) -- выключить подсветку для вкладки
|
||||
-- app.editor:save() -- сохранить активную вкладку в её файл
|
||||
-- app.editor:map_key(modes, keys, handler)
|
||||
-- -- привязка, которая работает дополнительно
|
||||
-- -- к глобальной, когда фокус в редакторе;
|
||||
-- -- синтаксис modes/keys/handler как у app:map_key
|
||||
-- app.editor:set_mode(mode) -- режим привязок редактора
|
||||
-- app.editor:mode() -- текущий режим привязок редактора
|
||||
--
|
||||
-- LSP-серверы (запуск целиком настраивается этим сценарием):
|
||||
-- app:run_lsp({
|
||||
-- app.editor:run_lsp({
|
||||
-- name = "gopls", -- условное имя для stop/restart
|
||||
-- cmd = "gopls", -- путь к бинарнику или имя в PATH
|
||||
-- args = { "serve" }, -- аргументы процесса
|
||||
@@ -82,10 +109,10 @@ print("[lua] init.lua выполнен")
|
||||
-- root = ".", -- корень workspace (по умолчанию cwd)
|
||||
-- initialization_options = {}, -- initializationOptions сервера
|
||||
-- })
|
||||
-- app:lsp_servers() -- { "gopls", ... }
|
||||
-- app:stop_lsp("gopls") -- true, если сервер был запущен
|
||||
-- app:restart_lsp("gopls") -- перезапуск с прежними настройками
|
||||
-- app:on_lsp_diagnostics(delay_ms, fn)
|
||||
-- app.editor:lsp_servers() -- { "gopls", ... }
|
||||
-- app.editor:stop_lsp("gopls") -- true, если сервер был запущен
|
||||
-- app.editor:restart_lsp("gopls") -- перезапуск с прежними настройками
|
||||
-- app.editor:on_lsp_diagnostics(delay_ms, fn)
|
||||
-- -- fn(servers) вызывается один раз
|
||||
-- -- после затишья delay_ms; nil вместо
|
||||
-- -- функции удаляет обработчик.
|
||||
@@ -116,9 +143,9 @@ print("[lua] init.lua выполнен")
|
||||
-- список; горизонтальные стрелки закрывают его и двигают курсор.
|
||||
-- Документация выбранного элемента показывается второй всплывающей панелью
|
||||
-- справа от списка. Примеры запуска:
|
||||
-- app:run_lsp({ name = "gopls", cmd = "gopls", args = { "serve" },
|
||||
-- app.editor:run_lsp({ name = "gopls", cmd = "gopls", args = { "serve" },
|
||||
-- languages = { "go" }, watcher = "**/*.go" })
|
||||
-- app:run_lsp({ name = "rust-analyzer", cmd = "rust-analyzer",
|
||||
-- app.editor:run_lsp({ name = "rust-analyzer", cmd = "rust-analyzer",
|
||||
-- languages = { "rust" }, watcher = "**/*.rs" })
|
||||
--
|
||||
-- Панели окна (по умолчанию закрыты, размер меняется перетаскиванием):
|
||||
@@ -163,22 +190,28 @@ print("[lua] init.lua выполнен")
|
||||
-- tree:on_click(fn) -- fn(id) — клик по конечной ноде
|
||||
-- tree:selected() -- id выбранной строки или nil
|
||||
-- tree:focus(id) -- раскрыть родителей, выбрать и дать фокус
|
||||
-- tree:map_key(modes, keys, handler)
|
||||
-- -- привязка, которая работает дополнительно
|
||||
-- -- к глобальной, когда фокус на этом дереве
|
||||
-- tree:set_mode(mode) -- режим привязок блока (один символ)
|
||||
-- tree:mode() -- текущий режим привязок блока
|
||||
--
|
||||
-- Методы добавляются в src/api.rs: всё, что есть в impl AppApi, помеченном
|
||||
-- #[mlua::userdata_impl], автоматически доступно из Lua.
|
||||
-- Методы добавляются в src/api.rs: всё, что есть в impl AppApi или
|
||||
-- impl EditorApi, помеченном #[mlua::userdata_impl], автоматически доступно
|
||||
-- из Lua как app:method(...) или app.editor:method(...).
|
||||
--
|
||||
-- Другие Lua-файлы можно подключать из каталога сценариев:
|
||||
-- include("tools.lua") -- выполнить файл сразу
|
||||
-- require("tools") -- выполнить один раз (как обычный Lua-модуль)
|
||||
--
|
||||
-- Подсветка синтаксиса по умолчанию выключена. Включить её можно так:
|
||||
-- app:set_language(0, "rust")
|
||||
-- app.editor:set_language(0, "rust")
|
||||
|
||||
-- gopls запускается автоматически при старте редактора.
|
||||
-- Сервер обслуживает только документы с languageId "go" и получает изменения
|
||||
-- всех .go-файлов проекта (кроме vendor/) через файловый вотчер.
|
||||
local gopls_ok, gopls_err = pcall(function()
|
||||
app:run_lsp({
|
||||
app.editor:run_lsp({
|
||||
name = "gopls",
|
||||
cmd = "gopls",
|
||||
args = { "serve" },
|
||||
@@ -202,10 +235,10 @@ if not gopls_ok then
|
||||
end
|
||||
|
||||
-- Пример привязки: Ctrl+S сохраняет вкладку, отпускание Esc закрывает окно.
|
||||
-- app:map_key("<C-s>", function() app:save() end)
|
||||
-- app:map_key("<!Esc>", function() app:close() end)
|
||||
-- app:map_key("", "<C-s>", function() app.editor:save() end)
|
||||
-- app:map_key("", "<!Esc>", function() app:close() end)
|
||||
-- Убрать встроенную привязку можно так:
|
||||
-- app:map_key("<C-s>", nil)
|
||||
-- app:map_key("", "<C-s>", nil)
|
||||
-- app:map_completion_key("<C-n>", "completion_next")
|
||||
-- app:map_completion_key("<C-p>", "completion_previous")
|
||||
|
||||
@@ -239,7 +272,7 @@ end)
|
||||
|
||||
project_tree:on_click(function(id)
|
||||
-- Пустая таблица: фокус уходит в редактор, курсор остаётся на месте.
|
||||
app:open(id, {})
|
||||
app.editor:open(id, {})
|
||||
end)
|
||||
|
||||
app.left_panel:open()
|
||||
@@ -247,7 +280,7 @@ load_dir(project_tree, "")
|
||||
|
||||
-- Открытие/закрытие панели с деревом. При открытии возвращаем фокус на
|
||||
-- последнюю выбранную строку, чтобы можно было сразу продолжить навигацию.
|
||||
app:map_key("<C-b>", function()
|
||||
app:map_key("", "<C-b>", function()
|
||||
local opened = app.left_panel:toggle()
|
||||
if opened then
|
||||
local selected = project_tree:selected()
|
||||
@@ -257,10 +290,10 @@ app:map_key("<C-b>", function()
|
||||
end
|
||||
end)
|
||||
|
||||
app:map_key("<C-q>", function() app:close() end)
|
||||
app:map_key("", "<C-q>", function() app:close() end)
|
||||
|
||||
app:map_key("<C-e>", "toggle_left_panel")
|
||||
app:map_key("<C-t>", "toggle_bottom_panel")
|
||||
app:map_key("", "<C-e>", "toggle_left_panel")
|
||||
app:map_key("", "<C-t>", "toggle_bottom_panel")
|
||||
|
||||
-- Дерево диагностики в нижней панели.
|
||||
--
|
||||
@@ -290,7 +323,7 @@ local function diagnostic_rank(diagnostic)
|
||||
or 1
|
||||
end
|
||||
|
||||
app:on_lsp_diagnostics(100, function(servers)
|
||||
app.editor:on_lsp_diagnostics(100, function(servers)
|
||||
diagnostics_tree:clear()
|
||||
|
||||
-- Сначала собираем диагностику по файлам: одинаковые проблемы от разных
|
||||
@@ -388,10 +421,10 @@ end)
|
||||
diagnostics_tree:on_click(function(id)
|
||||
local path, line, character = id:match("^diag:(.*):(%d+):(%d+):%d+$")
|
||||
if path then
|
||||
app:open(path, { tonumber(line), tonumber(character) })
|
||||
app.editor:open(path, { tonumber(line), tonumber(character) })
|
||||
else
|
||||
-- Клик по файлу: фокус в редактор, курсор не переставляем.
|
||||
app:open(id, {})
|
||||
app.editor:open(id, {})
|
||||
end
|
||||
end)
|
||||
|
||||
@@ -403,3 +436,6 @@ app.toolbar:add_label("UTF-8", nil, "#efefe6", "encoding", "right")
|
||||
app.toolbar:add_button("Запустить", "play", nil, "run", "right", function()
|
||||
print("[toolbar] кнопка «Запустить» нажата")
|
||||
end)
|
||||
|
||||
app.editor:set_gutter_icon(2, "play", "#efefe6")
|
||||
app.editor:set_gutter_icon(90, "play")
|
||||
|
||||
Reference in New Issue
Block a user