Найти в Дзене
Vim

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

Оглавление

Буфер обмена

Копируем текст как обычно в стиле vim. (V .. jk) Пытаемся вставить текст куда либо... и ничего не происходит.
Может мышкой получиться? Выделяем текст мышкой... жмем правой кнопкой мыши по тексту и выбираем <copy> Но, копирования не происходит, но нам дают подсказку внизу NeoVim что нам надо сделать.

Итак давайте настроим интеграцию буфера обмена между программами.

sudo apt install xclip
sudo apt install wl-clipboard

теперь что бы скопировать что то из nvim ... выделяем текст как обычно <V> ....<jk> что бы вставить текст в текстовом редакторе нажимаем <ctrl + v> для того что бы вставить в bash или zsh то <ctrl +shift +v>

Копирование из текстового редактора или консоли обратно в NeoVim без особенностей. Копируем мышкой или клавиатурой <ctrl +c> . вставить в редакторе NeoVim <p>. Выделить текст и вставить колесиком мышки, так же работает.

Мелкие правки

Я очень часто перемещаюсь по строке с помощью поиска буквы. Например если я стою вначале строки и мне надо переместиться ко второму аргументу функции. То я обычно нажимаю < f >< , >< ; > т.е. перейти ко второй запятой. Но ребята из NvChad решили, что командную строку они вызывают чаще, поэтому сделали досадную подмену < ; > на < : >. Я это все таки исправлю, на то как было.

nvim ~/.config/nvim/lua/mappings.lua

комментируем строку

-- map("n", ";", ":", { desc = "CMD enter command mode" })

Давайте заодно добавим переход в "Нормальный режим" не только через <jk> но и через <kj>. Таким образом мы чуть облегчаем работу нашим пальцам. (не надо тянуться к кнопке <escape> что бы перейти в нормальный режим.

map("i", "jk", "<ESC>")
map("i", "kj", "<ESC>")

Краткая справка: map - команда для сопоставления клавиш.

Первый аргумент map ("i", "kj", "<esc>")

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

n в нормальном режиме ( перемещение по тексту, да, мы можем изменять его, но обычно мы делаем это блоками, хотя можем посимвольно это делать)

v - в режиме выделения,

x - тоже что и v но при выполнении команды выделение с текста не снимается

Второй аргумент map ("i", "kj", "<esc>")
тут мы выбираем какие клавиши мы нажмем что бы выполнилась наша команда.


Третий аргумент map ("i", "kj", "
<esc>")

То что будет выполнено. Тут может быть все что угодно. хоть "война и мир"
например:

map("n", "ds", "ci(")


не важно в каком месте
строки мы находимся, при нажатии на ds в нормальном режиме мы удалим все что находится в круглых скобках и перейдем в режим вставки внутри круглых скобок.
полная команда выглядит так:
vim.keymap.set("n", "ds","ci(")


Переводчик внутри NeoVim

Давайте чуть облегчим себе жизнь и установим переводчик.

GitHub - uga-rosa/translate.nvim: Use any external translate command/API in nvim.

Сылка: https://github.com/uga-rosa/translate.nvim

Демо:

-2

Создадим пару папок где будем хранить наши настройки.

mkdir -p ~/.config/nvim/lua/user/plugins/configs ~/.config/nvim/lua/user/settings
cd ~/.config/nvim/lua/user
-3

создаем в папке user/plugins файл plugins.lua

nvim ~/.config/nvim/lua/user/plugins/plugins.lua

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

return
{
{ "uga-rosa/translate.nvim", lazy = false, }
}
-4

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

nvim ~/.config/nvim/lua/plugins/init.lua

и в конце дописываем:

require ("user.plugins.plugins")
-5

Обрати внимание! что перед require стоит запятая после скобки.

теперь при входе в NeoVim будет установлен наш плагин.
Давайте проверим его в деле. Пишем в NeoVim

:h langmap

Выделяем нужный блок текста (клавиши <v hkjl> )
нажимаем двоеточие и вводим:

:Translate ru
-6

получаем результат

-7

Т.е. сейчас для перемещению по документу нам надо следить что бы была включена английская раскладка. Но мы можем исправить так что перемещение по тексту будет даже если включена русская раскладка. Давайте сделаем это.

Но для начала давайте такую полезную команду как перевод текста повесим на какую то полезную клавишу. А так как полезных клавиш мы создадим туча и что бы не забыть что какая делает, настроим заодно и подсказки.

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

добавляем следующий блок кода:

local wk = require("which-key")
wk.register({
{ -- Блок для обработки клавиш в режиме выделения
mode = "v",
["<leader>"] = {
u = { -- user пользовательские команды
name = "Мои команды",
p = {'<cmd>Translate ru<cr>','перевести строчку' }, -- переводчик
},
}
}, -- конец блока обработки клавиш в режиме выделения
}) -- end wk.register

Напоминаю что автоматическое форматирование кода: Поставите курсор в начало документа затем <=G>

-8

можно добавить перевести весь содержимое экрана

-9

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

z = { 'viw<cmd>Translate en -output=replace<cr><esc>','перевести слово' },

-output=replace мы можем выбрать как будет переводиться наш текст
floating - всплывающее окно, insert - вставка, replace - замена, register - поместить в регистр (т.е. можно скопировать в память)

Не забываем читать справку (теперь то Слава Богу мы можем спокойного его читать, на родном языке) :h Translate

Надеюсь не надо напоминать что перемещение по справке (встать на нужную тему и нажать < ctrl ] > вернуть предыдущий буфер < ctrl o>, попробуйте заодно и <ctrl i>

полный код будет такой:

local wk = require("which-key")
wk.register({
{ -- Блок для обработки клавиш в режиме выделения
mode = "v",
["<leader>"] = {
u = { -- user пользовательские команды
name = "Мои команды",
p = {'<cmd>Translate ru<cr>','перевести строчку' }, -- переводчик
},
}
}, -- конец блока обработки клавиш в режиме выдеелния
{
mode = "n",
["<leader>"] = {
u = { -- user пользовательские команды
name = "Мои команды",
p = {
name = "Переводчик",
a = { 'HVL<cmd>Translate ru<cr>','en -> ru [ экран ]' },
w = { 'viw<cmd>Translate ru<cr>','en -> ru [ слово ]' },
z = { 'viw<cmd>Translate en -output=replace<cr><esc>','заменить [ слово ] ru -> En' },
}, -- p переводчик
}, -- u
} --[<leader>]
}
}) -- end wk.register

напоминаю форматирование кода: перейти в нормальный режим (т.е. нажать на клавишу <escape> и нажать на клавиши : gg=G

-10

В последних версиях новый стиль выглядит так:

local wk = require("which-key")
wk.add({
{ "<leader>u", name = "Мои teams" , mode = "n" },
{ "<leader>up", name = "Переводчик" , mode = "n" },
{ "<leader>upa","HVL<cmd>Translate ru<cr>", name = "en->ru [ Экран ]", mode = "n" },
{ "<leader>upw","viw<cmd>Translate ru<cr>", name = "en->ru [ словo ]", mode = "n" },
{ "<leader>upz","viw<cmd>Translate en -output=replace<cr><esc>", name = "Заменить [ слово ] ru->en", mode = "n" },

{ "<leader>u", name = "Мои команды" , mode = "v" },
{ "<leader>up","<cmd>Translate ru<cr>", name = "en->ru [ строка ]", mode = "v" },
{ "<leader>uz","viw<cmd>Translate en -output=replace<cr><esc>", name = "Заменить [ слово ] ru->en", mode = "v" },
})



назад
NeoVim как IDE для C++ ( часть 2 базовая настройка NeoVim.)

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