Як можна скопіювати текст у буфер обміну системи з Vim?


281

Чи є спосіб скопіювати блок тексту в буфер обміну системи, щоб я міг вставити його в іншу програму?


12
Про це вже запитували і відповіли на ТАК. Тут ви можете знайти більше та іншу інформацію.
bsmith89

1
Я використовував цей плагін на macvim christoomey / vim-system-copy і дуже люблю його. Це працює дуже добре з рухами cpip, cpi{.
Філіпе

2
Що вам справді потрібно, це EasyClip . Це зробить саме це та багато іншого ...
Скотт Вейд,

Відповіді:


320

Для систем на базі X11 (тобто Linux та більшості інших UNIX- подібних систем) є два буфера обміну, які не залежать один від одного:

  • ПЕРШИЙ - Це копія при виборі і може бути вставлена ​​за допомогою середньої кнопки миші.
  • CLIPBOARD - це скопійовано (як правило) ^Cта вставлено ^V(це як MS Windows).

Системи OS X та Windows мають лише один буфер обміну.

Для систем X11 також існує ряд інструментів, які синхронізують ці буфер обміну для вас; тому якщо вони здаються однаковими, можливо, один із них працює.

Vim має два спеціальні регістри, що відповідають цим буферам обміну:

  • *використовує PRIMARY; Мнемоніка: S дьоготь S Обраний (для копіювання-on - s обранця)
  • +використовує CLIPBOARD; мнемонічний: CTRL PLUS C (для загальної зв'язки клавіш)

У Windows & OS X немає різниці між +і *, оскільки ці системи мають лише один буфер обміну, і обидва регістри посилаються на одне і те ж (не важливо, яким ви користуєтесь).

Ви можете використовувати ці регістри як будь-який реєстр. Наприклад, використовуючи буфер обміну PRIMARY *з командами yта p:

  • "*yy
  • "*p

Ви можете використати це як більш зручні клавіші:

noremap <Leader>y "*y
noremap <Leader>p "*p
noremap <Leader>Y "+y
noremap <Leader>P "+p

Якщо ви хочете "автоматично" взаємодіяти з буфером обміну системи, а не постійно посилатися на неї вручну, ви можете встановити clipboardзмінну:

  • Встановіть його для unnamedвикористання *(PRIMARY, on select)
  • Встановіть його для unnamedplusвикористання +(CLIPBOARD, ^C)

Тепер просто за допомогою yyперейдемо до буфера обміну системи, а не до безвізного реєстру Vim, і pвставимо буфер обміну системи.

Ви також можете призначити ці регістри так само, як і будь-який реєстр за допомогою let:

  • :let @+=42
  • :let @*=42

У clipboardналаштуваннях є ще кілька варіантів (наприклад, виключити фільтри); але це основи. Дивіться :help 'clipboard'повну історію ;-)

gVim

Якщо ви використовуєте gVim, ви можете отримати поведінку під час копіювання під час використання :set guioptions+=a.
Це ввімкнено за замовчуванням у системах X11 (копії в PRIMARY), але не в MS Windows & OSX (оскільки вибір будь-якого тексту замінить ваш буфер обміну).

Ні +clipboard?

Для роботи цього Vim потрібен +clipboardпрапор функції; ви можете перевірити, чи має це Vim, використовуючи :echo has('clipboard')зсередини Vim (якщо вихідний 0, його немає , якщо 1він є) або перевірити вихід vim --versionна +clipboard.

Більшість дистрибутивів Linux постачаються з "мінімальною" збіркою Vim за замовчуванням, якої немає +clipboard, але зазвичай її можна встановити:

  • Debian & Ubuntu: Встановити vim-gtkабо vim-gnome.
  • Fedora: встановити vim-X11та запустити vimxзамість vim( докладніша інформація ).
  • Arch Linux: встановіть gvim(це ввімкне +clipboardі нормально vim).

Можна також використовувати xclip, xcopyабо xselкопіювати текст в буфер обміну; див. наступні питання для вирішення:

SSH

Ви також можете використовувати буфер обміну на віддалених машинах, якщо ввімкнути пересилання X11 через SSH. Це особливо корисно з вищевказаною порадою, оскільки потім ви можете використовувати xclipдля доступу до буфера обміну робочого столу. Функція Vim на машині, на яку ви працюєте, все ще потребуватиме цю +clipboardфункцію.

Це вимагає ForwardX11Trustedналаштування, і це слід робити лише з надійними серверами , оскільки це дає серверу майже повний контроль над вашим сеансом X11:

$ ssh -XY myhost

Щоб зробити ці налаштування стійкими (тому не потрібно їх додавати -XYкожен раз), ви можете зробити щось подібне у вашому ~/.ssh/config:

# Do **NOT** set this globally; it gives the server complete control over
# your X11 session.
Host myhost
    ForwardX11 yes
    ForwardX11Trusted yes

Неовім

Neovim оновив підтримку буфера обміну. Вбудований інтерфейс був вилучений і замінений системою , які вимагають зовнішніх утиліт , таких як xclip, xselабо pbcopy/ pbpaste.

Він повинен автоматично підбирати ці утиліти та користуватися ними. На OS X pbcopy і pbpasteповинні бути доступні за замовчуванням, на Linux ви , ймовірно , хочете встановити xclip, так як це найбільш широко доступні (фактично існує дві версії xselз несумісними прапорами . Це дійсно нерозумно).

Також дивись :help clipboardу Неовім.


6
ssh -Y означає -X, тому -X можна опустити.
hildred

Для деяких міжнародних клавіатур вам може знадобитися натиснути, "<Space>щоб отримати ". Тож у такому випадку вам доведеться натискати "<Space>+yабо "<Space>*yкопіювати.
Артур F

1
Дуже цікавим побічним ефектом вивчення цього (кілька років тому) для мене стало усвідомлення того, що "можна вибрати багато названих реєстрів. "+не є магією, це просто зареєструватися +. Так, наприклад, якщо ви хочете скопіювати три речі одночасно і вставити кожен з них один за іншим, ви можете "1y, "2yі , "3yа потім "1p, "2pі "3p. Це справді потужне і не існує майже в будь-якому іншому редакторі. Ще одне цікаве використання - дивитися на збережені макроси. Наприклад, якщо ви записуєте за допомогою qq, але розумієте, що вам потрібно це виправити, ви можете: у темп-рядку "qpвиправити це та "qd.
Шахбаз

1
Лише зауваження: OS X має два окремих буфера обміну. Один доступ до нього здійснюється за допомогою Cmd-C і Cmd-V, а другий за допомогою клавіатурних зв'язків emacs Ctrl-K і Ctrl-Y.
BallpointBen

3
@shahbaz - мабуть, краще використовувати регістри букв для такої мети, оскільки нумеровані змінюються щоразу, коли текст видаляється.
зол

18

Інші відповіді стосуються того, як скопіювати текст із буфера в буфер обміну системи. Ще одна поширена операція - це копіювання тексту з іншого реєстру до буфера обміну. Наприклад, якщо ви вже витягли якийсь текст у "(регістр за замовчуванням), ви можете завантажити цей реєстр у буфер обміну.

Це можна зробити за допомогою :let:

  • let @+=@" - копіює регістр за замовчуванням у буфер обміну
  • let @*=@" - копіює регістр за замовчуванням у первинний вибір X11 ("буфер обміну миші")
  • let @+=@a- копія з реєстру aв буфер обміну
  • тощо.

Зауважте, що це працює для регістрів загалом: let @a=@bкопії реєструються bдля реєстрації a.


17

З http://vim.wikia.com/wiki/Accessing_the_system_clipboard

set clipboard=unnamedplus

Це змінює регістр Vim за замовчуванням на +регістр, який пов'язаний із буфером обміну системи. Від :h clipboard-unnamedplus:

                                        clipboard-unnamedplus
unnamedplus     A variant of the "unnamed" flag which uses the
                clipboard register '+' (quoteplus) instead of
                register '*' for all yank, delete, change and put
                operations which would normally go to the unnamed
                register.  When "unnamed" is also included to the
                option, yank operations (but not delete, change or
                put) will additionally copy the text into register
                '*'.
                Only available with the +X11 feature.
                Availability can be checked with: 
                        if has('unnamedplus')

Чому це не працює для мене, коли yank & paste між екземплярами vim (кожен в окремому терміналі термінатора)?
thinwybk

Якщо ви працюєте в Linux, а Vim був складений за допомогою функції + X11, і у вас встановлений буфер обміну = неназваний плюс, ви повинні мати змогу витягнути рядок в одному екземплярі vim та вставити його в інший екземпляр vim. Ви також повинні мати змогу вставити його в будь-яку іншу програму за допомогою CTRL + V або SHIFT + INSERT. Ви можете скористатися :versionпрограмою Vim, щоб побачити, чи + X11 відображається у списку включених функцій. Ви також можете перевірити, чи доступна функція "без імені", :if has('unnamedplus')⏎ echo 'yes'⏎ endif якщо ви не в Linux, то вам слід використовувати без назви замість unnamedplus.
Quincy Bowers

10

На побудовах, які його підтримують, названий регістр *- це буфер обміну системи. Щоб скопіювати текст із Vim у системний буфер обміну, ви можете вибрати текст у візуальному режимі, а потім натиснути, "*yщоб скопіювати його до системного буфера обміну.

І навпаки, використовуйте "*pдля вставки тексту із буфера обміну системи у Vim.


5

Я рекомендую використовувати Gvim і додати це до свого .vimrc:

source $VIMRUNTIME/mswin.vim
behave mswin

Це забезпечує підтримку для CtrlC, CtrlX, CtrlVяк блокнот в Windows.

Зауважте, що це також додасть деякі інші поширені ярлики Windows, наприклад, CtrlSдля :w, CtrlAдля вибору всіх тощо.


0

Якщо ваш vim не підтримує, +clipboardви можете використовувати плагін fakeclip для Linux, Mac, Windows, tmux, екрана, ...


0

Кожна інша відповідь охоплювала всі важливі речі про регістри. Я хотів би додати ще одну річ, яку я використовую.

У Vim є спосіб безпосередньо скопіювати візуально вибраний текст у буфер обміну. Просто покладіть це у свій файл vimrc :

set guioptions+=a

І, якщо ви візуально вибираєте якийсь текст, він буде скопійований у буфер обміну. Для отримання додаткової інформації про це,:help guioptions

До речі, це лише для gVim.


2
guioptions+=aтакож згадується у відповіді Carpetsmoker.
муру

@muru Так, вибач. Я цього раніше не бачив. Я щойно це побачив.
Durga Swaroop

0

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

Спочатку очистіть реєстр, який отримає інформацію

:let @a=""

Потім скопіюйте до нього всі рядки, що містять візерунок

:g/pattern/yank A

Нарешті переміщення (копіювання) інформації в буфер обміну системи

:let @+=@a

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

ЗАБЕЗПЕЧЕННЯ: Необхідно клацнути реєстр перед його використанням, а використання UPPERCASE версії реєстру дозволяє нам додавати вміст, інакше він також не працюватиме.


0

Якщо ви не можете зрозуміти, як влаштуватися +clipboardна роботу, чого я чомусь не міг, то можете це зробити.

Припускаючи, що ви хочете скопіювати лише частину файлу, я роблю shift+ vперейти у візуальний режим і лише виділити рядки, які я хочу скопіювати. Тоді я роблю це.

# Linux Wayland
:'<,'>w !wl-copy

# Linux Xorg
:'<,'>w !xclip -selection clipboard

Пояснення

  • '<,'> - означає, що ви використовували візуальний режим для вибору діапазону (цей тип не вводиться)
  • w !{cmd}- запишіть діапазон до stdin cmd, див. більше на:help w_c
  • wl-copyі xclipце програми, до яких можна передавати текст, і вони додадуть його до буфера обміну системи

Крім того, як тільки це є у вашій історії, вам більше не доведеться набирати все. Просто виберіть у візуальному режимі, введіть wпотім натисніть вгору, і команда повинна автоматично завершитися. Крім того, вам не доведеться використовувати візуальний режим. Ви можете встановити потрібний діапазон.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.