В (n)vim есть много внутренних буферов обмена, называемых регистрами,
которые можно активировать с помощью " и названия буфера,
например "+ или "0.
После этого следует команда, использующая выбранный регистр:
"+yчтобы скопировать текст в буфер+(системный)"+pчтобы вставить из него.
Сразу после этого выбор регистра сбрасывается на стандартный.
За стандартный регистр отвечает настройка clipboard, по умолчанию её значение clipboard=unnamed.
Регистры vim и буферы обмена в системе связаны следующим образом:
- Системный буфер
PRIMARYсодержит любой выделенный текст (не обязательно скопированный!) и вставляется на колесико мыши. - Системный буфер
CLIPBOARDсодержит скопированный наCtrl+Cтекст и вставляется наCtrl+V - Встроенный в vim регистр называется
", используется по умолчанию всегда (даже приclipboard-=unnamed) и синхронизируется с*(при стандартнойclipboard=unnamed). - Регистр
*akaunnamedпо возможности синхронизируется сPRIMARYбуфером в системе - Регистр
+akaunnamedplusпо возможности синхронизируется сCLIPBOARDбуфером в системе
Подробнее о всех регистрах см. :help registers, в vim есть и другие полезные регистры.
Для работы системного буфера с vim требуется специальная утилита. На Linux выбор зависит от используемого графического сервера:
- Для X11 это xclip или xsel
- Для Wayland это wl-clipboard
- Для других систем см.
:help clipboard-tool.
Чтобы узнать, какой у вас графический сервер, в терминале введите:
echo $XDG_SESSION_TYPEНужную программу надо просто установить с помощью пакетного менеджера.
Возможно потребуется перезагрузка, но все должно заработать и без неё.
Если что-то не работает, проверьте пункт Clipboard в выводе :checkhealth.
Если вам очень хочется использовать системный буфер по умолчанию, вы можете добавить в ваш конфиг
set clipboard+=unnamedplus` или
vim.opt.clipboard = vim.opt.clipboard:append("unnamedplus").Таким образом регистр " будет синхронизироваться и с unnamed, и с unnamedplus.
Можно также просто поставить clipboard=unnamedplus, чтобы не трогать регистр unnamed.
Я лично не рекомендую так делать т.к. в виме любой удаленный текст перемещается в стандартный буфер.
Таким образом, если вы копируете из условного браузера нужный текст, заходите в вим и удаляете хоть одну букву в файле,
то ваш текст в системном буфере перезаписывается этой буквой,
что как по мне совсем не круто.
и привязанным к нему PRIMARY буфером X11, который вставляется на колесико мыши,
а значит буфер обмена и так действует между разными инстанциями vim и может быть вставлен на то же колесико в системе.
(Подробнее о буферах Х11 см. :help clipboard-x11 и дальше по гайду.)
Вместо установки по умолчанию вы можете забиндить системный буфер на любое сочетание клавиш, например:
На Vimscript:
noremap <Leader>y "+y
noremap <Leader>p "+pИли на Lua:
vim.keymap.set({ "n", "v" }, "<Leader>y", '"+y')
vim.keymap.set({ "n", "v" }, "<Leader>p", '"+p')(см. :help mapleader, обычно это пробел, а по умолчанию \ )
(см. также :help map-modes про n и V)
Также можно забиндить y:let @+ = @"<CR>, чтобы на выбранное сочетание клавиш текст копировался сразу и в системный буфер, и в ".
Таким образом, если вы захотите осознанно скопировать текст в системный буфер,
вы можете использовать использовать назначенное сочетание клавиш в vim и Ctrl+V с Ctrl+C в остальной системе.
Когда же вы удаляете/копируете текст в vim например с dd или yy,
он копируется лишь в PRIMARY и не трогает ваш CLIPBOARD буфер,
и может быть вставлено колесиком мыши или обычным p в другой инстанции vim.
Если вам что-то не понятно, введите :help и то действие, которое вы не поняли.
Те страницы, которые не так легко найти, я и так постарался упомянуть.