В (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
и то действие, которое вы не поняли.
Те страницы, которые не так легко найти, я и так постарался упомянуть.