Чи є спосіб скопіювати блок тексту в буфер обміну системи, щоб я міг вставити його в іншу програму?
cpip
, cpi{
.
Чи є спосіб скопіювати блок тексту в буфер обміну системи, щоб я міг вставити його в іншу програму?
cpip
, cpi{
.
Відповіді:
Для систем на базі X11 (тобто Linux та більшості інших UNIX- подібних систем) є два буфера обміну, які не залежать один від одного:
^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, ви можете отримати поведінку під час копіювання під час використання
:set guioptions+=a
.
Це ввімкнено за замовчуванням у системах X11 (копії в PRIMARY), але не в MS Windows & OSX (оскільки вибір будь-якого тексту замінить ваш буфер обміну).
+clipboard
?Для роботи цього Vim потрібен +clipboard
прапор функції; ви можете перевірити, чи має це Vim, використовуючи :echo has('clipboard')
зсередини Vim (якщо вихідний 0
, його немає , якщо 1
він є) або перевірити вихід
vim --version
на +clipboard
.
Більшість дистрибутивів Linux постачаються з "мінімальною" збіркою Vim за замовчуванням, якої немає +clipboard
, але зазвичай її можна встановити:
vim-gtk
або vim-gnome
.vim-X11
та запустити vimx
замість vim
( докладніша інформація ).gvim
(це ввімкне +clipboard
і нормально vim
).Можна також використовувати xclip
, xcopy
або xsel
копіювати текст в буфер обміну; див. наступні питання для вирішення:
Ви також можете використовувати буфер обміну на віддалених машинах, якщо ввімкнути пересилання 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
у Неовім.
"<Space>
щоб отримати "
. Тож у такому випадку вам доведеться натискати "<Space>+y
або "<Space>*y
копіювати.
"
можна вибрати багато названих реєстрів. "+
не є магією, це просто зареєструватися +
. Так, наприклад, якщо ви хочете скопіювати три речі одночасно і вставити кожен з них один за іншим, ви можете "1y
, "2y
і , "3y
а потім "1p
, "2p
і "3p
. Це справді потужне і не існує майже в будь-якому іншому редакторі. Ще одне цікаве використання - дивитися на збережені макроси. Наприклад, якщо ви записуєте за допомогою qq
, але розумієте, що вам потрібно це виправити, ви можете: у темп-рядку "qp
виправити це та "qd
.
Інші відповіді стосуються того, як скопіювати текст із буфера в буфер обміну системи. Ще одна поширена операція - це копіювання тексту з іншого реєстру до буфера обміну. Наприклад, якщо ви вже витягли якийсь текст у "
(регістр за замовчуванням), ви можете завантажити цей реєстр у буфер обміну.
Це можна зробити за допомогою :let
:
let @+=@"
- копіює регістр за замовчуванням у буфер обмінуlet @*=@"
- копіює регістр за замовчуванням у первинний вибір X11 ("буфер обміну миші")let @+=@a
- копія з реєстру a
в буфер обмінуЗауважте, що це працює для регістрів загалом: let @a=@b
копії реєструються b
для реєстрації a
.
З 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')
:version
програмою Vim, щоб побачити, чи + X11 відображається у списку включених функцій. Ви також можете перевірити, чи доступна функція "без імені", :if has('unnamedplus')⏎ echo 'yes'⏎ endif
якщо ви не в Linux, то вам слід використовувати без назви замість unnamedplus.
На побудовах, які його підтримують, названий регістр *
- це буфер обміну системи. Щоб скопіювати текст із Vim у системний буфер обміну, ви можете вибрати текст у візуальному режимі, а потім натиснути, "*yщоб скопіювати його до системного буфера обміну.
І навпаки, використовуйте "*pдля вставки тексту із буфера обміну системи у Vim.
Я рекомендую використовувати Gvim і додати це до свого .vimrc
:
source $VIMRUNTIME/mswin.vim
behave mswin
Це забезпечує підтримку для CtrlC, CtrlX, CtrlVяк блокнот в Windows.
Зауважте, що це також додасть деякі інші поширені ярлики Windows, наприклад, CtrlSдля :w
, CtrlAдля вибору всіх тощо.
Кожна інша відповідь охоплювала всі важливі речі про регістри. Я хотів би додати ще одну річ, яку я використовую.
У Vim є спосіб безпосередньо скопіювати візуально вибраний текст у буфер обміну. Просто покладіть це у свій файл vimrc :
set guioptions+=a
І, якщо ви візуально вибираєте якийсь текст, він буде скопійований у буфер обміну. Для отримання додаткової інформації про це,:help guioptions
До речі, це лише для gVim.
guioptions+=a
також згадується у відповіді Carpetsmoker.
Ви також можете використовувати глобальну команду, щоб помістити певний візерунок у буфер обміну. Це може бути корисно в ситуаціях, коли у вас інформація, розпорошена у файлі, і вручну вправлятися, схильна до помилок і стомлюючих.
Спочатку очистіть реєстр, який отримає інформацію
:let @a=""
Потім скопіюйте до нього всі рядки, що містять візерунок
:g/pattern/yank A
Нарешті переміщення (копіювання) інформації в буфер обміну системи
:let @+=@a
якщо ви спробуєте скопіювати кожен рядок, що містить "візерунок" безпосередньо до буфера обміну, він не працюватиме, оскільки буфер обміну не має можливості додавати новий вміст, тому ми використовуємо тут звичайний реєстр vim для зберігання всіх рядків, що містять візерунок відразу, а потім поклавши його в буфер обміну.
ЗАБЕЗПЕЧЕННЯ: Необхідно клацнути реєстр перед його використанням, а використання UPPERCASE версії реєстру дозволяє нам додавати вміст, інакше він також не працюватиме.
Якщо ви не можете зрозуміти, як влаштуватися +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
потім натисніть вгору, і команда повинна автоматично завершитися. Крім того, вам не доведеться використовувати візуальний режим. Ви можете встановити потрібний діапазон.