Skip to content

Instantly share code, notes, and snippets.

@ShinyZero0
Last active May 10, 2024 07:29
Show Gist options
  • Save ShinyZero0/87e8e755916e3ca56085140e248487a4 to your computer and use it in GitHub Desktop.
Save ShinyZero0/87e8e755916e3ca56085140e248487a4 to your computer and use it in GitHub Desktop.
Регистры и системный буфер обмена в vim

Использование регистров

В (n)vim есть много внутренних буферов обмена, называемых регистрами, которые можно активировать с помощью " и названия буфера, например "+ или "0. После этого следует команда, использующая выбранный регистр:

  • "+y чтобы скопировать текст в буфер + (системный)
  • "+p чтобы вставить из него.

Сразу после этого выбор регистра сбрасывается на стандартный.

Регистры по умолчанию и система

За стандартный регистр отвечает настройка clipboard, по умолчанию её значение clipboard=unnamed.
Регистры vim и буферы обмена в системе связаны следующим образом:

  • Системный буфер PRIMARY содержит любой выделенный текст (не обязательно скопированный!) и вставляется на колесико мыши.
  • Системный буфер CLIPBOARD содержит скопированный на Ctrl+C текст и вставляется на Ctrl+V
  • Встроенный в vim регистр называется ", используется по умолчанию всегда (даже при clipboard-=unnamed) и синхронизируется с * (при стандартной clipboard=unnamed).
  • Регистр * aka unnamed по возможности синхронизируется с PRIMARY буфером в системе
  • Регистр + aka unnamedplus по возможности синхронизируется с 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 и то действие, которое вы не поняли. Те страницы, которые не так легко найти, я и так постарался упомянуть.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment