| .. | ||
| plugins | ||
| snippets | ||
| colorschemes.lua | ||
| completion.lua | ||
| lsp.lua | ||
| lualine.lua | ||
| luasnip.lua | ||
| neogen.lua | ||
| oil.lua | ||
| README.md | ||
| telescope.lua | ||
| todo.lua | ||
| treesitter.lua | ||
| trouble.lua | ||
Справка по интересным моментам в коде
Функция получения версии python в lsp.lua
local function get_python_version()
local handle = io.popen("python --version 2>&1") -- Redirect stderr to stdout
if handle then
local result = handle:read("*a")
handle:close()
-- Check if the output contains a version number
local version = result:match("Python (%d+%.%d+%.%d+)")
if version then
return version
end
end
handle = io.popen("python3 --version 2>&1") -- Redirect stderr to stdout
if handle then
local result = handle:read("*a")
handle:close()
-- Check if the output contains a version number
local version = result:match("Python (%d+%.%d+%.%d+)")
if version then
return version
end
end
-- TODO: Add some exception handling if python not installed on user machine
return "Python 0.0.0"
end
Что тут есть примечательного:
- Получение данных, выполняя команду в shell оболочке системы с помощью
io.popen. Важно: Данная функция может работать не во всех ОС - Функция выполняет команду, указанную в аргументе, и возвращает файловый дескриптор, который можно использовать для чтения вывода команды (или записи в нее)
Разберем флоу подробнее:
Если про python --version - все понятно, то вот:
2>&1
Уже надо прояснить:
- В UNIX-подобных системах есть три стандартных потока -
stdin= 0;stdout= 1;strerr= 2; - По умолчанию
io.popenпередает только выводstdoutв handle, поэтому для обработки ошибок, надо дополнительно захватывать потокstderr 2>&1означает, что мы хотим перенаправить поток ошибок 2 в стандартный вывод 1;- Это нужно для того, чтобы захватить не только вывод команды, но и возможные ошибки (например если питон не установлен);
>&- оператор перенаправления потоков.
Дополнительно:
*a внутри read - конструкция формата чтения файловых объектов в Lua. Они
указывают - как именно стоит читать данные из файла или потока. Помимо a есть
еще:
*a- читать все содержимое*l- читать строку*n- читать число.