Привет, сегодня будет писать конфигурацию для терминального редактора Neovim на чистом Lua. Мы не будем использовать VimScript от слова совсем. Я расскажу в чем плюсы создания таких конфигураций, как соблюдать KISS (Keep It Stupid Simple) все время дополняя такие конфигурации, а также расскажу про полезные плагины для веб-разработки и не только.

В чем плюсы?

Конфигурации на VimScript не самые понятные для новых пользователей Vim. Они часто перегружены лишней информацией, команды в них используются совсем непростые, а для того чтобы минимально настроить тот же пробел вместо таба приходится бороздить документацию сверху до низу, из-за того что у вас будут ошибки в синтаксисе???? (а они непременно будут????).

Данную проблему решали по-разному. Сейчас например вообще вышел новый язык для конфигурации Vim, который называется Vim9script. Но, он тоже не решит проблему????

Проблему решил Neovim. Это тот же Vim, который переписывается командой энтузиастов и сообществом для того чтобы сделать Vim доступнее для людей. Именно в Neovim впервые речь зашла о том, чтобы использовать не VimL (VimScript), а Lua. И ребята это сделали, у редактора есть полноценная поддержка Lua.

Установка

Установить Neovim можно на все три платформы (Windows, Linux, MacOS). Делается это все достаточно просто.

Windows ????

Заходим в PowerShell и качаем Chocolatey:

Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))

Качаем сам Neovim:

choco install neovim --pre

Linux ????

Заходим в терминал и в зависимости от вашего дистрибутива качаем пакет с Neovim

# Debian, Ubuntu, Elementary, Mint
sudo apt install neovim python3-neovim

# Fedora, RH
sudo dnf install neovim python-neovim

# Arch
sudo pacman -Sy neovim python-pynvim

MacOS ????

Качаем homebrew на наш мак:

/bin/bash -c \
"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

Качаем сам Neovim с необходимыми пакетами

xcode-select --install
brew install --HEAD tree-sitter
brew install --HEAD luajit
brew install --HEAD neovim

Конфигурация

Мы будем конфигурировать редактор постепенно, вы смело можете пропускать разделы, если вы уже сталкивались с написанием конфигураций для Neovim/Vim. Новичкам же рекомендую читать все последовательно для лучшего понимания материала????

Структура директорий

Для начала нам нужно понять что такое корневой конфигурационный файл (init.lua).

init.lua - это файл, который Neovim будет загружать впервую очередь по умолчанию. Именно с его создания стоит начинать конфигурацию редактора.

За мой опыт в 3 года использования данного редактора я видел много конфигураций. Есть два лагеря:

  • Те, кто пишут в init.lua только импортирование других файлов;

  • Те, кто пишут в init.lua базовые настройки и импортирование других файлов.

Я считаю второй подход не слишком чистым в плане кода. Вы сваливаете в один файл и базовые настройки, и горячие клавиши, и плагины, оставляя лишь несколько импортов. Чего уж таить, раньше и я так делал????

Однако мы будем поступать первым способом. Он гарантирует нам то, что со временем наша конфигурация не станет похожа на сад с сорняками, где исправив одно хочется обрубить половину конфигурации????

Структура будет следующей:

.
└── lua
   ├── base
   ├── keys
   └── plugins

Все конфигурации написанные на Lua должны храниться в специальной директории под названием lua, это стартовая точка откуда Neovim будет импортировать пользовательские конфигурации.

Базовая настройка

После того как мы создали базовые директории - нам необходимо прописать общие правила для Neovim.

Поиск

Давайте создадим файл под названием search.lua и запишем туда все необходимые настройки для поиска:

--[[ Переменные ]]--
-- Переменная для настройки опций Neovim
-- Все время использовать vim.opt - не удобно, поэтому сделаем алиас
local opt = vim.opt

-- Глобальные переменные
-- То же самое делаем и с vim.global
local g = vim.g

--[[ Поиск ]]--
-- Игнорировать регистр при поиске
-- Если теперь введем "IGNORE", то он найдет и "ignore"
opt.ignorecase = true

-- Не игнорировать регистр, если есть символы в верхнем регистре
-- Если напишем "Ignore", то он будет искать только "Ignore"
opt.smartcase = true

-- Подсвечивать найденные текстовые объекты
opt.showmatch = true

Neovim предоставляет нам API, который мы можем использовать с помощью Lua. Если мы введем в редакторе команду :h <команда>, то вверху помимо полного названия команды увидим пространство имен в котором находится команда.

В основном все команды находятся в vim.opt, так что сейчас поэтому поводу заморачиваться не стоит, но все же если есть такая потребность, то вся документация под рукой????

Тут мы видим сокращения для vim.opt и vim.g. Проще говоря с помощью local в Lua мы просто объявляем переменную и как значение присваиваем ссылку на объект vim.opt и vim.g соответственно.

Табы

Создадим ещё один файлик под названием tabs.lua в директории base/. В него запишем следующее:

--[[ Настройка табов ]]--
-- Установка количества пробельных символов, когда сдвигаем с помощью "<", ">"
-- По сути не смотря на expandtab в терминале все равно отображаются пробельные символы, поэтому установим их количество на одно нажатие этих кнопок
opt.shiftwidth = 2

-- 1 таб == 2 пробела c новой строки
-- При нажатии <CR> будут вставлять табы. Табы рисуются как пробелы. Именно поэтому мы должны установить что каждый таб в новой строке - 2 пробела
opt.tabstop = 2

-- Подстраивать новые строки под предыдущий отступ
opt.smartindent = true

Тут мы просто задаем опции для таба в редакторе. Обратите внимание, что я не написал части с сокращениями для vim.opt и vim.g, тут её нужно будет тоже указать.

Дополнительные настройки

Для всех остальных настроек я создаю файл под названием other.lua в той же директории base/. Тут запишем следующее:

--[[ Настройка панелей ]]--
-- Вертикальные сплиты становятся справа
-- По умолчанию панели в Neovim ставятся в зависимости от расположения текущей панели. Данная настройка поможет нам держать панели в порядке
opt.splitright = true

-- Горизонтальные сплиты становятся снизу
opt.splitbelow = true

--[[ Дополнительные настройки ]]--
-- Используем системный буфер обмена
opt.clipboard = 'unnamedplus'

-- Отключаем дополнение файлов в конце
opt.fixeol = false

-- Автодополнение (встроенное в Neovim)
opt.completeopt = 'menuone,noselect'

-- Не автокомментировать новые линии при переходе на новую строку
vim.cmd [[autocmd BufEnter * set fo-=c fo-=r fo-=o]]

Тут все по прежнему, кроме последней команды. Обратите внимание на строку с vim.cmd[[]]. vim.cmd это специальная команда которая позволяет выполнять команды VimScript из Lua файла. Двойные скобки говорят о том, что мы передадим строку. Вообще можно было записать это и так:

vim.cmd("autocmd BufEnter * set fo-=c fo-=r fo-=o")

Однако, синтаксис с двумя скобками кажется мне более легким для чтения и лакончиным. Тут дело выбора за вами????

Включаем файлы в init.lua

Сейчас мы создали три файла: search.lua, tabs.lua, other.lua, все они располагаются в директории base/, однако пока ещё настройки в них не будут работать. Для того чтобы все заработало нам необходимо импортировать все три файла в init.lua, так как Neovim будет подключать все конфигурации именно из этого корневого файла. Делается подключение достаточно легко:

require('base/search')
require('base/tabs')
require('base/other')

Обратите внимание, что мы не указываем полный путь, мы указываем путь начиная с директории lua. Также мы не указываем расширения файлов, Lua понимает, что по умолчанию мы будем подключать Lua файлы, так что часть с расширениями нужно упускать.

Сейчас структура нашей конфигурации выглядит вот так:

.
└── lua
   ├── base
   │  ├── other.lua
   │  ├── search.lua
   │  └── tabs.lua
   ├── keys
   └── plugins

Горячие клавиши

Самое время настроить кастомные горячие клавиши! Обычно я создаю два файла для горячих клавиш:

  • main.lua - Горячие клавиши для дефолтных действий в редакторе

  • plugins.lua - Горячие клавиши для плагинов

Сейчас мы будем заниматься созданием только первого файла????

Давайте для начала создадим специальный файл и назовем его alias.lua, в него мы запишем сокращения для команд присваивания клавиш, выглядеть он будет вот так:

-- Алиас для быстрого доступа к методу установки горячих клавиш
local map = vim.api.nvim_set_keymap 

--[[
Метод для установки горячих клавиш (normal)
key - {string} Строка с горячей клавишей
command - {string} Команда
]]--
function nm(key, command) 
	map('n', key, command, {noremap = true})
end

--[[
Метод для установки горячих клавиш (input)
key - {string} Строка с горячей клавишей
command - {string} Команда
]]--
function im(key, command)
	map('i', key, command, {noremap = true})
end

--[[
Метод для установки горячих клавиш (visual)
key - {string} Строка с горячей клавишей
command - {string} Команда
]]--
function vm(key, command)
	map('v', key, command, {noremap = true})
end

--[[
Метод для установки горячих клавиш (terminal)
key - {string} Строка с горячей клавишей
command - {string} Команда
]]--
function tm(key, command)
	map('t', key, command, {noremap = true})
end

За установку горячих клавиш отвечает функция vim.api.nvim_set_keymap, однако мы её сократили до map с помощью создания переменной с ссылкой на данную функцию. Если бы мы этого не сделали, то та же функция nm выглядела бы вот так:

--[[
Метод для установки горячих клавиш (normal)
key - {string} Строка с горячей клавишей
command - {string} Команда
]]--
function nm(key, command) 
	vim.api.nvim_set_keymap('n', key, command, {noremap = true})
end

Думаю, никто не скажет, что это выглядит компактно???? Именно поэтому мы и используем сокращения.

Функция vim.api.nvim_set_keymap принимает 4 аргумента:

  • Режим в котором будет использоваться данная горячая клавиша

  • Сама комбинация клавиш

  • Команда которая должна выполняться при нажатии горячей клавиши

  • Дополнительные аргументы (по типу noremap, который заменяет уже существующую комбинацию клавиш, если она есть)

Всего тут создано четыре функции:

  1. nm - создает горячую клавишу в нормальном режиме

  2. im - создает горячую клавишу в режиме ввода

  3. vm - создает горячую клавишу в визуальном режиме

  4. tm - создает горячую клавишу в терминальном режиме

Если вы не знаете что за режимы у редактора, то советую вам пройти основной туториал, который можно запустить введя в терминале: vimtutor

Базовые горячие клавиши

После того как мы создали алиасы (сокращения) для наших команд по установке горячих клавиш — мы можем приступать к созданию самих горячих клавиш.

Создав файл main.lua мы можем написать следующее:

require('keys/alias')

-- Назначает дополнительной клавишей для отключения режима Ctrl + K
im('<C-k>', '<escape>')

Таким образом мы теперь легко сможем создавать новые горячие клавиши.

На данный момент наша структура директорий выглядит следующим образом:

.
└── lua
   ├── base
   │  ├── other.lua
   │  ├── search.lua
   │  └── tabs.lua
   ├── keys
   │  ├── alias.lua
   │  ├── main.lua
   │  └── plugins.lua
   └── plugins

Плагины

Наступило время для самого сладкого - плагинов????

Плагины в Neovim это уже написанные скрипты/функционал, которые расширяют возможности редактора, делая его ещё круче!????

Для того чтобы у нас была возможность устанавливать плагины - нам нужно установить Packer. Это такой менеджер плагинов для Neovim. Как только мы его установим - мы сразу же можем переходить к настройке и установке плагинов.

Установка плагинов

Давайте создадим файл packer_install.lua в директории plugins/. Именно в данном файле мы будем перечислять все плагины, которые мы будем скачивать. После скачивания Packer у нас должна появиться команда PackerSync, сейчас мы будем пользоваться ей регулярно????

-- Добавляем Packer как пакет в Neovim
vim.cmd [[packadd packer.nvim]]

-- Используем данный коллбэк как список для плагинов
return require('packer').startup(function()

	-- Добавляем Packer в список, чтобы он обновлял сам себя
	use 'wbthomason/packer.nvim'

	-- LSP сервер
	use 'neovim/nvim-lspconfig'
	
	-- Иконки для автодополнения
	use {
		'onsails/lspkind-nvim',
		config = function()
			require('plugins/lspkind')
		end
	}

	-- Инсталлер для серверов LSP
	use {
		'williamboman/nvim-lsp-installer',
		config = function()
			require('plugins/lsp-installer')
		end
	}

	-- Удобное меню для обозрения проблем LSP
	use {
		"folke/trouble.nvim",
		requires = "kyazdani42/nvim-web-devicons",
		config = function()
			require("trouble").setup {}
		end,
	}
end)

Вот так будет выглядеть список плагинов. Естественно тут он неполный, я уменьшил его для того чтобы вам было удобно читать. Полный список плагинов и для чего я их использую будет внизу статьи.

Обратите внимание, что весь список плагинов я пишу внутри коллбэка для Packer, а каждый новый плагин начинается с ключевого слова use, после чего идут фигурные скобки с описание плагина. use это специальный метод из Packer, который берет как аргумент объект. Мы опять же могли написать это следующим образом, однако не стали, чтобы не портить читабельность и лаконичность:

-- Статуслайн
	use({
		'nvim-lualine/lualine.nvim',
		requires = { 'kyazdani42/nvim-web-devicons', opt = true },
		config = function()
			require('plugins/lualine')
		end
	})

Объекты внутри которых могут находиться переменные и методы называются в Lua таблицами. Более подробно о таблицах можно почитать вот тут.

Заметьте что во многих таблицах переменных (или поля таблицы) повторяются:

  • Имя в кавычках

  • Зависимые плагины requires

  • Конфигурация плагина config, которая прописывается через вложенную функцию

Мы конечно же можем писать конфигурацию для плагина прямо внутри config, однако я не рекомендую так делать. У вас просто разрастется файл packer_install.lua.

Давайте рассмотрим конфигурацию для плагина автодополнения. В packer_install.lua я добавил его в самый низ:

-- Добавляем Packer как пакет в Neovim
vim.cmd [[packadd packer.nvim]]

-- Используем данный коллбэк как список для плагинов
return require('packer').startup(function()

	-- Добавляем Packer в список, чтобы он обновлял сам себя
	use 'wbthomason/packer.nvim'

	-- LSP сервер
	use 'neovim/nvim-lspconfig'
	
	-- Иконки для автодополнения
	use {
		'onsails/lspkind-nvim',
		config = function()
			require('plugins/lspkind')
		end
	}

	-- Инсталлер для серверов LSP
	use {
		'williamboman/nvim-lsp-installer',
		config = function()
			require('plugins/lsp-installer')
		end
	}

	-- Удобное меню для обозрения проблем LSP
	use {
		"folke/trouble.nvim",
		requires = "kyazdani42/nvim-web-devicons",
		config = function()
			require("trouble").setup {}
		end,
	}
	
	-- Автодополнение
	use {
		'hrsh7th/nvim-cmp',
		requires = {
			'L3MON4D3/LuaSnip',
			'saadparwaiz1/cmp_luasnip',
			'hrsh7th/cmp-nvim-lsp',
			'hrsh7th/cmp-path',
			'hrsh7th/cmp-emoji',
			'hrsh7th/cmp-nvim-lsp-signature-help',
			'hrsh7th/cmp-nvim-lua'
		},
		config = function()
			require('plugins/cmp')
		end
	}
end)

Заметьте, что у данного плагина много зависимостей, а также конфигурация находится в отдельном файле, который располагается в ~/.config/nvim/lua/plugins/cmp.lua, если мы перейдем в этот файл — мы увидим следующее:

local cmp = require('cmp')
local lspkind = require('lspkind')
cmp.setup{
	snippet = {

		-- REQUIRED - you must specify a snippet engine
		expand = function(args)
			require'luasnip'.lsp_expand(args.body) -- Luasnip expand
		end,
	},

	-- Клавиши, которые будут взаимодействовать в nvim-cmp
	mapping = {

		-- Вызов меню автодополнения
		['<C-Space>'] = cmp.mapping(cmp.mapping.complete(), { 'i', 'c' }),
		['<CR>'] = cmp.config.disable,                      -- Я не люблю, когда вещи автодополняются на <Enter>
		['<C-y>'] = cmp.mapping.confirm({ select = true }), -- А вот на <C-y> вполне ок

		-- Используем <C-e> для того чтобы прервать автодополнение
		['<C-e>'] = cmp.mapping({
			i = cmp.mapping.abort(), -- Прерываем автодополнение
			c = cmp.mapping.close(), -- Закрываем автодополнение
		}),
		['<C-p>'] = cmp.mapping(cmp.mapping.select_prev_item(), { 'i', 'c' }),
		['<C-n>'] = cmp.mapping(cmp.mapping.select_next_item(), { 'i', 'c' }),
	},

	sources = cmp.config.sources({
		{ name = 'nvim_lsp' },                -- LSP ????
		{ name = 'nvim_lsp_signature_help' }, -- Помощь при введении параметров в методах ????
		{ name = 'luasnip' },                 -- Luasnip ????
		{ name = 'buffer' },                  -- Буфферы ????
		{ name = 'path' },                    -- Пути ????
		{ name = "emoji" },                   -- Эмодзи ????
	}, {
	}),
	formatting = {
		format = lspkind.cmp_format({
			mode = 'symbol', -- show only symbol annotations
			maxwidth = 50,   -- prevent the popup from showing more than provided characters (e.g 50 will not show more than 50 characters)
		})
	}
}

Вот тут уже легко запутаться, неправда ли? Однако, в данный момент вам не нужно понимать всего написанного, так как вы не читали документацию для данного плагина.

Нужно понять несколько основных принципов:

  1. Конфигурацию мы всегда стараемся отделить от списка плагинов.

  2. Для каждой конфигурации мы создаем свой отдельный файлик. В данном случае это файл lua/plugins/cmp.lua

Давайте ещё раз посмотрим на то, как описан плагин в списке для плагинов:

-- Автодополнение
	use {
		'hrsh7th/nvim-cmp',
		requires = {
			'L3MON4D3/LuaSnip',
			'saadparwaiz1/cmp_luasnip',
			'hrsh7th/cmp-nvim-lsp',
			'hrsh7th/cmp-path',
			'hrsh7th/cmp-emoji',
			'hrsh7th/cmp-nvim-lsp-signature-help',
			'hrsh7th/cmp-nvim-lua'
		},
		config = function()

			-- ДАННАЯ ЧАСТЬ ОЧЕНЬ ВАЖНА
			require('plugins/cmp')
		end
	}

Я отметил строку кода, на которую нужно смотреть для удобства. Если мы не импортируем нашу конфигурацию, которая была в листинге до этого, то конфигурация не будет работать. Импортирование работает точно так же, как и импортирование в init.lua, мы просто через require() указываем путь до файла.

Как настраивать плагины

Для примера давайте возьмем плагин lualine, допустим что вы уже указали его в списке (не бойтесь, в половине репозиториев уже указано как нужно указать плагин в списке) и теперь принялись его конфигурировать.

В большинстве случаев у вас уже будет пример конфигурации на README в Github, однако мы должны заметить пару моментов, на которых часто бывают ошибки. Рассмотрим конфигурацию:

require('lualine').setup {
	options = {
		icons_enabled = true,
		theme = 'auto',
		component_separators = { left = '', right = ''},
		section_separators = { left = '', right = ''},
		disabled_filetypes = {},
		always_divide_middle = true,
		globalstatus = false,
	},
	sections = {
		lualine_c = {'filename', 'lsp_progress'},
		lualine_y = {'progress'},
		lualine_z = {'location'}
	},
}

Как мы видим тут мы сначала импортируем плагин и уже потом вызываем метод setup, который зашит в данном плагине. Сами опции плагина уже описаны в Github, так что нам остается только указать их и настроить под себя.

Также не стоит забывать, что в файлах конфигурации строго не рекомендуется осуществлять настройки не связанные с плагином.

Давайте рассмотрим нашу структуру директорий уже сейчас:

.
└── lua
   ├── base
   │  ├── other.lua
   │  ├── search.lua
   │  └── tabs.lua
   ├── keys
   │  ├── alias.lua
   │  ├── main.lua
   │  └── plugins.lua
   └── plugins
	  ├── <ваши файлы для конфигурации плагинов>
      └── packer_install.lua

Вот список всех плагинов, которые я использую:

Плагин

Описание

nvim-lspconfig

Плагин для того чтобы в Neovim была поддержка LSP, он позволяет включать автодополнение, проверку синтаксиса и ещё много прочего

fidget.nvim

Плагин для того чтобы показывать процесс загрузки LSP

trouble.nvim

Позволяет удобно показывать все ошибки и предупреждения, которые нашел LSP

nvim-cmp

Позволяет включить автодополнение в Neovim

lspkind-nvim

Добавляет иконки для пунктов автодополнения

symbols-outline.nvim

Добавляет меню с объектами из LSP для быстрого переключения между функциями, методами и классами

nvim-lsp-installer

Позволяет устанавливать LSP-сервера быстро и без боли

gitsigns.nvim

Интеграция Git в Neovim

gruvbox-material

Тема для Neovim

nord-vim

Ещё одна тема в Neovim

lualine.nvim

Добавляет статуслайн внизу

neo-tree.nvim

Добавляет проводник для Neovim

kommentary

Удобное комментирование кода в Neovim

nvim-treesitter

Подсветка синтаксиса в Neovim

nvim-autopairs

Автодополнение всяких скобок, кавычек и так далее

telescope.nvim

Быстрый и удобный поиск

bufferline.nvim

Статуслайн с буферами вверху

vim-test

Тестирование прямо из Neovim (Mocha, Jest, JUnit)

Горячие клавиши для плагинов

Напоследок нужно ещё рассказать про горячие клавиши для плагинов. У меня этот файлик выглядит вот так:

require('keys/plugins')


vim.g.mapleader = ' '                                             -- Используем Space, как клавишу для альтернативных хотекеев

-- LSP (все горячие клавиши начинаются с g), кроме ховера
nm('K', '<cmd>lua vim.lsp.buf.hover()<CR>' )                      -- Ховер для объекта
nm('gf', '<cmd>lua vim.lsp.buf.formatting()<CR>')                 -- Форматировать документ
nm('ga', '<cmd>lua vim.lsp.buf.code_action()<CR>')                -- Действия с кодом
nm('gR', '<cmd>lua vim.lsp.buf.rename()<CR>')                     -- Переименовать объект

-- Отркыть NvimTree
nm('<leader>v', '<cmd>NeoTreeRevealToggle<CR>')

-- Telescope
nm('gd', '<cmd>Telescope lsp_definitions<CR>')                       -- Объявления в LSP
nm('<leader>p', '<cmd>Telescope oldfiles<CR>')                       -- Просмотр недавних файлов
nm('<leader>o', '<cmd>Telescope git_files<CR>')                      -- Поиск файлов
nm('<leader>b', '<cmd>Telescope git_branches<CR>')                   -- Ветки в Git
nm('<leader>f', '<cmd>Telescope live_grep<CR>')                      -- Поиск строки
nm('<leader>q', '<cmd>Telescope buffers<CR>')                        -- Буфферы

-- Git
nm('<leader>gp', '<cmd>Gitsigns preview_hunk<CR>')
nm('<leader>gb', '<cmd>Gitsigns blame_line<CR>')

-- SymbolsOutline
nm('<leader>s', '<cmd>SymbolsOutline<CR>')                        -- Структура для файла

-- BufferLine
nm('ç', '<cmd>bd<CR>')                                            -- Закрыть буффер
nm('≤', '<cmd>BufferLineCyclePrev<CR>')                           -- Перейти в предыдущий буффер
nm('≥', '<cmd>BufferLineCycleNext<CR>')                           -- Перейти в следующий буффер
nm('˘', '<cmd>BufferLineMoveNext<CR>')                            -- Закрыть буффер слева
nm('¯', '<cmd>BufferLineMovePrev<CR>')                            -- Закрыть буффер справа

-- Formatter
nm('<leader>l', '<cmd>Format<CR>')


-- Trouble
nm('<leader>x', '<cmd>TroubleToggle<CR>')                         -- Открыть меню с проблемами LSP
nm('gr', '<cmd>Trouble lsp_references<CR>')                       -- Референсы в LSP

Как можно увидеть тут из необычного только первая строка. В Neovim есть специальная кнопка для альтернативных сочетаний клавиш, у меня это <Space>. Везде где написано <leader> достаточно просто в голове держать, что это Space.

Полную конфигурацию можно увидеть в вот этом репозитории

На этом на сегодня все, если вам было интересно читать данную статью, то можете заглянуть и в паблик в телеграм, там много всего интересного про разработку. Хорошего дня!

Комментарии (15)


  1. cypok
    17.08.2022 12:31
    +2

    а для того чтобы минимально настроить тот же пробел вместо таба приходится бороздить документацию сверху до низу

    И ровно также в вашем конфиге опции expandtab, shiftwidth, tabstop, autoindent smartindent. Ах да, еще set не надо писать.

    Я не против Neovim, но аргументация должна быть правдивой, а не притянутой за уши.


  1. heisil
    17.08.2022 14:33
    +1

    Современный конфиг на lua выглядит еще страшнее и непонятнее конфига на vimscript. Чисто субъективное мнение.


  1. leorikz
    17.08.2022 14:50

    спасибо за статью, сподвигся пощупать подобные формат конфигурации.

    с первого раза. плюс изготавливаемый в примере конфиг отличается от "Вашего" на гитхабе .. в целом я почему-то в репо ожидал готовый пример из статейки, но думаю направление понятно. спасибо


    1. crackidocky Автор
      17.08.2022 17:55

      Изготавливаемый в примере конфигурация и конфигурация в GH отличается лишь несколькими названиями файлов и директорий)

      В целом и там и тут все хорошо задокументировано (каждая строка буквально????)

      Если что непонятно - не стесняйтесь задавать вопросы. Можно тут в треде, можно в телеге)


      1. leorikz
        17.08.2022 22:08

        в винде не схватывается:

        local opt = vim.opt

        если переделывать в

        vim.opt.shiftwidth = 4

        нормас прогружается. в общем поразбираюсь, если что напишу в тлг скорее,

        спасибо за участие


  1. punzik
    17.08.2022 16:42
    +2

    Чего только не придумают, лишь бы не использовать Emacs :)


  1. 0xd34df00d
    17.08.2022 16:53
    +3

    У конфига на lua есть проблема с тем, что он заведомо несовместим с vim. Написать же на вимскрипте конфиг, который будет работать и с неовимом, и с вимом, довольно легко, да и полезно, например, если не на всех машинах, на которых надо работать, есть вим.


    1. leorikz
      17.08.2022 17:36

      спасибо за уточнение, не знал

      но нужен ли "свой" конфиг на какой-то рандомной бричке где есть vim

      главное про :q! помнить :-)


    1. ShefEr
      18.08.2022 00:08

      Проблемы с совместимость конфига от nvim с vim могут возникнуть не только из-за конфига на lua, но из-за того что плагины могут быть тоже написаны на lua, и из-за отсутсвия поддержки lsp в vim, уже слишком велико расхождение экосистемы.


      1. 0xd34df00d
        18.08.2022 01:23
        +1

        Поэтому для lsp я использую coc даже в nvim, например.


  1. VMarkelov
    18.08.2022 00:54

    Спасибо, что поделились как можно всё оформить красиво. От себя добавлю, что для некоторых вещей использовал другой путь:

    1. Обычно я ставлю программы из scoop, а не из chocolatey. Да, в scoop выбор беднее приложений, но для меня была критична возможность выбора своей папки установки всех приложений. В chocolatey эта возможность есть только в платной версии, когда бесплатная всё валит, кажется в Appdata на системном диске. В scoop это настраивается и в бесплатной версии из коробки.

    2. Вместо `vim pkgadd` я использовал другой путь. Не знаю какой лучше. Я его скопировал откуда и он сработал :) Поэтому я его и оставил. В начало plugins.lua я вставил такое:

    -- Automatically install packer
    local install_path = fn.stdpath('data')..'/site/pack/packer/start/packer.nvim'
    if fn.empty(fn.glob(install_path)) > 0 then
      PACKER_BOOTSTRAP = fn.system({'git', 'clone', '--depth', '1', 'https://github.com/wbthomason/packer.nvim', install_path})
      print("Installing packer close and reopen Neovim...")
    end


  1. TonyKentnarEarth
    18.08.2022 14:01

    Хорошая статья для начинающих переезд с vimScript на lua

    За мой опыт в 3 года использования данного редактора я видел много конфигураций. Есть два лагеря:

    Те, кто пишут в init.lua только импортирование других файлов;
    Те, кто пишут в init.lua базовые настройки и импортирование других файлов.

    Сам для себя заметил, что после нескольких итераций "рефакторинга конфигов по «Directory-Driven Design»", вернулся к тому, что вся конфигурация в 1м файле - как ни крути, а искать по 1му буферу проще, даже с телескопом (к слову, вот так это выглядит).


  1. fry404
    19.08.2022 03:51

    В самом начале потерпел фиаско

    Обнаружена ошибка при обработке /home/fry404/.config/nvim/init.lua: E5113: Error while calling lua chunk: /home/fry404/.config/nvim/lua/base/other.lua:4: attempt to index global 'opt ' (a nil value) stack traceback: /home/fry404/.config/nvim/lua/base/other.lua:4: in main chunk


    1. leorikz
      19.08.2022 12:17

      это как раз то что local не локалит, пока не победил.


    1. leorikz
      19.08.2022 15:27

      Помогает в каждый из файлов добавлять (tabs.lua, other.lua)

      local opt = vim.opt