Найти тему
Vim

NeoVim как IDE для C++ ( часть 4, форматирование, панель функций, русский язык, и пр.)

Оглавление


Форматирование текста


Часто у меня возникает нужда отформатировать текст. Стандартное форматирование оно может и хорошее, но хочется же в стиле ассемблера.
Я хочу сделать следующее:
Было:

до
до
после
после

Каждую строчку так поправлять, уманаешься, поэтому ставим плагин.
https://github.com/junegunn/vim-easy-align

демо:

-3

добавляем в наш файл строку

nvim ~/.config/nvim/lua/user/plugins/plugins.lua
{ 'junegunn/vim-easy-align', lazy = false }, -- формат текста

-4

Настраиваем наши горячие клавиши:

nvim ~/.config/nvim/lua/user/settings/keys_helper.lua

В конце файла дописываем. (вне блока which-key). Что то у меня не получилось настроить плагин так, что бы была видна подсказка для него. Поэтому повесим глобальные команды без лидера.

vim.api.nvim_set_keymap('x', 'ga', '<Plug>(EasyAlign)', {noremap = false})
vim.api.nvim_set_keymap('n', 'ga', '<Plug>(EasyAlign)', {noremap = false})

-5

Как использовать этот плагин для форматирования? Очень просто в Нормальном режиме нажимаем <ga> если хотим

Сделать форматирование по первому пробелу <пробел>
Сделать форматирование по последнему пробелу <-
пробел>
Сделать форматирование по второму пробелу <
2пробел>
Сделать форматирование по второму пробелу с конца <-
2пробел>
Сделать форматирование по всем пробелам нажимаем <
*пробел>.
Если хотим сделать форматирование по правому краю слова <
**пробел>.
Для форматирования по определенному символу. <
ctrl +x>и нажимаем наш символ например <|> Таким образом можно даже выравнивать таблицы.

Если хотим дополнительно обозначить что отформатировать по правому краю или по центру то после того как выбрали наш плагин <
ga> нажимаем <Enter> и выбираем нужный режим.

-6
-7

Если вдруг вам не понравилось форматирование его всегда можно отменить <u> и сделать повторное выделение <gv>

-8

Может вам кажется что это выглядит громоздко. Но это не так. Это не сложнее чем сделать копи / паст.

Справка:
:help EasyAlign

Переключение между буферами.

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

<,l> переключиться на буфер справа.
<,h> переключиться на буфер слева.
<,c> закрыть буфер

vim.api.nvim_set_keymap('n', ',h', '<cmd>bp<CR>',{})
vim.api.nvim_set_keymap('n', ',l', '<cmd>bn<CR>',{})
vim.api.nvim_set_keymap('n', ',c', '<cmd>bd<CR>',{})

Сохранение состояние документа

Давайте сделаем так, что бы при запуске документа все было так, как было при выходе из него. Т.е. Что бы NeoVim помнил где были наши "свертки" где стоял курсор и пр.

-9

nvim ~/.config/nvim/lua/user/settings/keys_helper.lua
vim.cmd ([[ autocmd BufWinLeave *.cpp,*h silent! mkview ]]) -- при закрытии файла сохранить 'вид'
vim.cmd ([[ autocmd BufWinEnter *.cpp,*h silent! loadview ]]) -- при открытии - восстановить сохранённый

-10

Важно: У меня тут сохранение сделано только для *.cpp и *h файлов. Вы можете сделать для тех для которых вам будет нужно.

Теперь, когда мы выполняем свёртку кода.
Выделите блок <
V> и нажимаем <zf> что бы создать и свернуть в блок.
Что бы свернуть блок внутри {} поставьте курсор на на одну из скобок и нажмите <
zf>
<
za> развернуть / свернуть
<
zd> удалить блок.

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

Русский язык

Мы же хотели настроить Nvim что бы можно было перемещаться по документу даже если включена русская раскладка.

nvim ~/.config/nvim/lua/user/settings/accordance_ru_en.lua

И добавляем следующее содержание:


RusLocale = {
ru_en =
{
vim.api.nvim_set_keymap('', 'й', 'q', {}),
vim.api.nvim_set_keymap('', 'ц', 'w', {}),
vim.api.nvim_set_keymap('', 'у', 'e', {}),
vim.api.nvim_set_keymap('', 'к', 'r', {}),
vim.api.nvim_set_keymap('', 'е', 't', {}),
vim.api.nvim_set_keymap('', 'н', 'y', {}),
vim.api.nvim_set_keymap('', 'г', 'u', {}),
vim.api.nvim_set_keymap('', 'ш', 'i', {}),
vim.api.nvim_set_keymap('', 'щ', 'o', {}),
vim.api.nvim_set_keymap('', 'з', 'p', {}),
vim.api.nvim_set_keymap('', 'х', '[', {}),
vim.api.nvim_set_keymap('', 'ъ', ']', {}),

vim.api.nvim_set_keymap('', 'ф', 'a', {}),
vim.api.nvim_set_keymap('', 'ы', 's', {}),
vim.api.nvim_set_keymap('', 'в', 'd', {}),
vim.api.nvim_set_keymap('', 'а', 'f', {}),
vim.api.nvim_set_keymap('', 'п', 'g', {}),
vim.api.nvim_set_keymap('', 'р', 'h', {}),
vim.api.nvim_set_keymap('', 'о', 'j', {}),
vim.api.nvim_set_keymap('', 'л', 'k', {}),
vim.api.nvim_set_keymap('', 'д', 'l', {}),
vim.api.nvim_set_keymap('', 'ж', ';', {}),
vim.api.nvim_set_keymap('', 'э', '\'', {}),

vim.api.nvim_set_keymap('', 'я', 'z', {}),
vim.api.nvim_set_keymap('', 'ч', 'x', {}),
vim.api.nvim_set_keymap('', 'с', 'c', {}),
vim.api.nvim_set_keymap('', 'м', 'v', {}),
vim.api.nvim_set_keymap('', 'и', 'b', {}),
vim.api.nvim_set_keymap('', 'т', 'n', {}),
vim.api.nvim_set_keymap('', 'ь', 'm', {}),
vim.api.nvim_set_keymap('', 'б', ',', {}),
vim.api.nvim_set_keymap('', 'ю', '/', {}),

vim.api.nvim_set_keymap('', 'Й', 'Q', {}),
vim.api.nvim_set_keymap('', 'Ц', 'W', {}),
vim.api.nvim_set_keymap('', 'У', 'E', {}),
vim.api.nvim_set_keymap('', 'К', 'R', {}),
vim.api.nvim_set_keymap('', 'Е', 'T', {}),
vim.api.nvim_set_keymap('', 'Н', 'Y', {}),
vim.api.nvim_set_keymap('', 'Г', 'U', {}),
vim.api.nvim_set_keymap('', 'Ш', 'I', {}),
vim.api.nvim_set_keymap('', 'Щ', 'O', {}),
vim.api.nvim_set_keymap('', 'З', 'P', {}),
vim.api.nvim_set_keymap('', 'Х', '[', {}),
vim.api.nvim_set_keymap('', 'Ъ', ']', {}),

vim.api.nvim_set_keymap('', 'Ф', 'A', {}),
vim.api.nvim_set_keymap('', 'Ы', 'S', {}),
vim.api.nvim_set_keymap('', 'В', 'D', {}),
vim.api.nvim_set_keymap('', 'А', 'F', {}),
vim.api.nvim_set_keymap('', 'П', 'G', {}),
vim.api.nvim_set_keymap('', 'Р', 'H', {}),
vim.api.nvim_set_keymap('', 'О', 'J', {}),
vim.api.nvim_set_keymap('', 'Л', 'K', {}),
vim.api.nvim_set_keymap('', 'Д', 'L', {}),
vim.api.nvim_set_keymap('', 'Ж', ':', {}),
vim.api.nvim_set_keymap('', 'Э', '\'', {}),

vim.api.nvim_set_keymap('', 'Я', 'Z', {}),
vim.api.nvim_set_keymap('', 'Ч', 'X', {}),
vim.api.nvim_set_keymap('', 'С', 'C', {}),
vim.api.nvim_set_keymap('', 'М', 'V', {}),
vim.api.nvim_set_keymap('', 'И', 'B', {}),
vim.api.nvim_set_keymap('', 'Т', 'N', {}),
vim.api.nvim_set_keymap('', 'Ь', 'M', {}),
vim.api.nvim_set_keymap('', 'Б', ',', {}),
vim.api.nvim_set_keymap('', 'Ю', '/', {}),
},
}

У нас настройки будут разрастаться поэтому создадим еще один промежуточный файл:

nvim ~/.config/nvim/lua/user/configs_init.lua

require ("user.settings.accordance_ru_en")

так же надо внести изменение в init.lua

nvim ~/.config/nvim/init.lua
require ("user.configs_init")

-11

Панель функций

GitHub - stevearc/aerial.nvim: Neovim plugin for a code outline window

ссылка https://github.com/stevearc/aerial.nvim

-12

Давайте теперь настроем навигацию по коду. (аналог панель элементов в VSstudio)

nvim ~/.config/nvim/lua/user/plugins/plugins.lua
{
'stevearc/aerial.nvim',
opts = {},
-- Optional dependencies
dependencies = {
"nvim-treesitter/nvim-treesitter",
"nvim-tree/nvim-web-devicons"
},
},

произведем его настройку

nvim ~/.config/nvim/lua/user/plugins/configs/aerial.lua
require("aerial").setup({
require("aerial").setup({
on_attach = function(bufnr)
local wk = require("which-key")
wk.register({
mode = "n",
["<leader>u"] = {
f = {
name = "панель функций",
p = {'<cmd>AerialPrev<CR>','предыдущая функция',{ buffer = bufnr }},
n = {'<cmd>AerialNext<CR>', 'следующая функция',{ buffer = bufnr }},
a = {'<cmd>AerialToggle!<CR>', '(ост) панель функций'},
f = {'<cmd>AerialToggle<CR>', '-> панель функций'},
}
}
})
end,
})

не забываем добавить

nvim ~/.config/nvim/lua/user/configs_init.lua
require ("user.plugins.configs.aerial")

Использование:
<leader>ufp - переместиться к предыдущей функции.

<leader>ufn - переместиться к следующей функции.

<leader>ufa - показать/ закрыть панель функций и остаться в окне с кодом

<leader>uff - показать/ закрыть панель функций и переключиться на нее.

<ctrl ww> перемещаться между панелями, либо <ctrl h> <ctrl l>

<ctrl j> / <ctrl k> перемещаться по функциям на панели и переместиться на данную функцию.

<h> / <l> свернуть / развернуть содержимое класса
? в панели покажет помощь.

предыдущая тема: NeoVim как IDE для C++ ( часть 3 Буфер обмена, переводчик)

далее NeoVim как IDE для C++ ( часть 5, поиск, отступы, подсветка с++)

Наука
7 млн интересуются