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


769

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

Чи можу я зробити пасту vim з буфера обміну в систему?



7
Копіювати "+ y Paste" + p Працює так само, як yank та paste, за винятком того, що ви вказали реєстр раніше.
Banjocat

2
Щоб використовувати наступні команди, переконайтеся, що ви зробили, sudo apt-get install vim-gnome що додасть цю функціональність вбудованому vim із використання буфера обміну системи.
Harnirvair Singh

2
@Harnirvair Для багатьох наборів читачів тут, vim-gnomeмабуть, надмірна кількість або просто недоступна в їх ОС / дистрибутиві, тоді як я підозрюю, що, vim-gtkпереважно, vim-gtk3існує більша ймовірність існування та витягування менших залежностей, при цьому все ще забезпечуючи інтеграцію буфера обміну (принаймні для тих, хто ще на X11; Я не впевнений, як це все взаємодіє з Wayland).
підкреслити_29

3
За замовчуванням у Fedora - немає доступу до буфера обміну (вам потрібен gvim), superuser.com/questions/194747/…
icc97

Відповіді:


880

"*І "+регістри для буфера обміну системи ( :help registers). Залежно від вашої системи вони можуть робити різні речі. Наприклад, у системах, які не використовують X11, як OSX або Windows, "*регістр використовується для читання та запису в буфер обміну системи. У системах X11 можна використовувати обидва регістри. Ознайомтеся :help x11-selectionз детальнішою інформацією, але в основному "*це аналог PRIMARY вибору X11 (який, як правило, копіює речі, які ви вибираєте мишею, і вставляє за допомогою середньої кнопки миші) і "+є аналогом вибору CL11BOARD X11 (який належить до буфера обміну).

Якщо все, що перейшло вам над головою, спробуйте скопіювати "*yyабо "+yyскопіювати рядок у буфер обміну вашої системи. Якщо припустити, що у вас є відповідні варіанти компіляції, той чи інший повинен працювати. Ви можете переробити це на щось більш зручне для вас. Наприклад, ви можете помістити vnoremap <C-c> "*yв ~ / .vimrc так, що ви зможете візуально вибрати і натиснути Ctrl+, cщоб підтягнути до буфера обміну вашої системи.

Майте на увазі, що копіювання / вставлення з буфера обміну системи не працюватиме, якщо :echo has('clipboard')повернеться 0. У цьому випадку vim не компілюється з +clipboardфункцією, і вам доведеться встановити іншу версію або перекомпілювати її. Деякі дистрибутиви Linux надають мінімальну установку vim за замовчуванням, але, як правило, якщо встановити пакет vim-gtkчи vim-gtk3пакет, ви можете отримати додаткові функції.

Ви також можете ознайомитися з 'clipboard'варіантом, описаним на :help cb. У цьому випадку ви можете :set clipboard=unnamedабо :set clipboard=unnamedplusзробити всі операції по янь / видаленню автоматично копіювати в буфер обміну системи. Це може спричинити незручності в деяких випадках, коли ви зберігаєте щось інше в буфері обміну, оскільки це скасує це.

Для вставки можна скористатися "+pабо "*p(знову ж таки, залежно від вашої системи та / або потрібного вибору), або ви можете зіставити їх на щось інше. Я набираю їх явно, але часто опиняюсь у режимі вставки. Якщо ви перебуваєте в режимі вставки, ви все одно можете вставити їх з належним відступом, використовуючи <C-r><C-p>*або <C-r><C-p>+. Див :help i_CTRL-R_CTRL-P.

Також варто згадати pasteваріант vim ( :help paste). Це перетворює vim у спеціальний "режим вставки", який вимикає кілька інших параметрів, що дозволяє вам легко вставити в vim за допомогою емулятора термінала або знайомого клавіша для мультиплексора. Просто введіть, :set pasteщоб увімкнути його, вставте ваш вміст і введіть його, :set nopasteщоб вимкнути його. Крім того, ви можете використовувати pastetoggleопцію, щоб встановити код клавіші, який перемикає режим ( :help pastetoggle). Я рекомендую використовувати регістри замість цих варіантів, але якщо вони все ще занадто страшно, це може бути зручним рішенням, коли ви вдосконалюєте свої vim відбивні.

Дивіться :help clipboardдетальну інформацію.


103
Це дуже інформативно, але чи можете ви підсумувати, які натискання клавіш потрібно зробити, щоб вставити з буфера обміну системи ... наприклад, з чим це робиться "*p? Чи натискаю клавішу Shift- ', потім Shift-8, потім p тощо?
Т. Брайан Джонс

10
Так, введіть ці три символи послідовно. У багатьох командах vim використовується те, що відомо як "режим очікування оператора", коли натискається одна клавіша, а потім vim чекає на отримання більше клавіш. Візьмемо ddдля прикладу. Перший dпереходить в режим очікування оператора, потім другий dзакінчує команду і видаляє рядок. Якщо ви введете текст dG, це Gзмушує його видаляти в кінці файлу, а не просто видаляти рядок. Регістри використовують цю саму головну, щоб дозволяти різним командам використовувати їх.
Коннер

4
На жаль! Якби я бачила лише цю посаду раніше сьогодні! Це все, що я хотів знати про копіювання та вставлення із системного буфера обміну. "<Cr> <Cp> * або <Cr> <Cp> +" - це чисте золото.
Кіт Пінсон

54
Акцент: вам потрібно встановити vim-gtkпакет (принаймні під Debian), щоб отримати vim, який компілюється +xterm_clipboard. Мені знадобилося 40 мільйонів, щоб дізнатися це, і лише кілька секунд sudo apt-get install vim-gtk.
Домінікас Мостаскіс

3
@DominykasMostauskis vim-gnomeтакож працює і +xterm_clipboardввімкнув.
Шев

155

Ви можете скопіювати у vim ярлик для терміна для gnome-terminal. Зробіть файл у режимі вставки та використовуйте

Ctrl+ Shift+ v.

Заздалегідь пам’ятайте про це

 :set paste 

щоб уникнути возитися з відступом.


19
цей бардак з відступом , якщо є багаторядкові як пітон цикл
Moj

11
Використовуйте тумблер для вставки для режиму вставки. Наприклад, встановіть pastetoggle = <F2> Потім у режимі вставки натисніть <F2> та вставте свій пітон-код.
Ян Вайц

Так скопіювати з Ctrl + Shift + C і вставте в флористику г файлу
Ніль

1
якщо вкладки / пробіли, eols тощо відображаються у вигляді видимого символу (через опцію listchars), то ці замінні символи будуть скопійовані замість прихованих.
користувач907860

2
Це має бути обрана відповідь, враховуючи її стислу відповідь
Айдін

41

Linux

У моїй системі Linux +і *реєструє карту до вибору X11, який можна вставити за допомогою середньої кнопки миші. Коли :set clipboard=unnamedі :set clipboard=unnamedplusвикористовується, регістри відображаються у буфер обміну, і їх можна вставити за допомогою CTRL-V.

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

Дивись також

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


1
Тільки *карти для X11 первинного регістра (який , як правило , вставленого з допомогою миші). +карти в регістр буфера обміну X11 зазвичай вставляються ярликами.
ZyX

@ZyX Не в моїй системі, але ваш пробіг, безумовно, може відрізнятися. Найкраще налаштувати поведінку, яку ви хочете чітко, якщо ви хочете послідовно користуватися платформами та версіями програмного забезпечення.
Тодд А. Джейкобс

Я вважаю, це означає, що у вас є менеджер буфера обміну, як кліппер / гліппер, вони здатні синхронізувати два буфери. Це не змінює той факт , що ВІМ використовує *для первинних і +для буфера обміну регістрів Х11, ви можете побачити це в VIM джерела: ці значення не там і не змінюються, а clip_starй clip_plusзавжди використовується *і +регістри відповідно.
ZyX

41

На мій погляд, ця конфігурація працює для копіювання та вставлення

" copy and paste
vmap <C-c> "+yi
vmap <C-x> "+c
vmap <C-v> c<ESC>"+p
imap <C-v> <ESC>"+pa

у що ти вставив?
StarWind0

Цей IMHO є кращим рішенням, що встановлювати дошку для безіменних - не возитися з буфером обміну операційними системами з кожними діями x / dd / y тощо. І на Mac може бути кращою ідеєю змінити модифікатор C (ctrl) на D для відображення комбінацій cmd + c / x / v.
міндекс

34

Це будуть рядки, які вам потрібні для вашого vimrc для цієї мети:

set clipboard+=unnamed  " use the clipboards of vim and win
set paste               " Paste from a windows or from vim
set go+=a               " Visual selection automatically copied to the clipboard

2
Мені подобається ваше рішення. Мені б хотілося кращого пояснення.
zhon

відмінна. використання регістрів завжди змушує мене вагатися і мусити думати. Це набагато краще
JonnyRaa

У моїй версії vim є буфер обміну + ця опція не працює для мене. Я використовую Byobu (який використовує Tmux під кришкою).
GGhe

Мені довелося додати встановлений буфер обміну + = unnamedplus для Fedora
hakunin

29

Я вважаю, що це питання заслуговує на більш об’єктивну та графічну відповідь:

Вхід у режим вставки

  • ESC
  • : встановити пасту
  • натиснути i
  • SHIFT+ Insert(із текстом, скопійованим у буфер обміну)


Вихід із режиму вставки

  • ESC
  • : встановити nopaste
  • натиснути i

Ви вставили текст і зможете знову ввести текст.


1
Я змусив це працювати, але :set nopasteнічого не робить. Що це робити? Навіщо мені це потрібно?
Марко Авліяш

1
Ну, власне, це і є. Під час виконання :set nopasteви говорите редактору, що більше не хочете вставляти його. І коли ви натиснете i, ви повертаєтесь до режиму редагування :).
ivanleoncz

2
Якщо чесно з тобою, Марко, я не знаю.
ivanleoncz

1
SHIFT + Insert зробив це для мене, дякую!
Меліса Лоос

1
Це спрацювало як шарм для мене. Кожен раз, коли я повертаюся до vim, мені завжди доводиться виглядати щось подібне.
Беньямінадк

17

буфер обміну

Існує спеціальний реєстр для зберігання цього вибору, це "* регістр. Тут нічого не вводиться, якщо інформація про те, який текст вибрано збирається змінити (наприклад, лівим клацанням миші кудись) або коли інша програма хоче вставити вибраний текст. Потім текст поміщається в регістр "*". Наприклад, вирізати рядок і зробити його поточним виділенням / поставити його на CLIPBOARD:

    "*dd

Аналогічно, коли ви хочете вставити виділення з іншої програми, наприклад, натиснувши середню кнопку миші, виділення спочатку поміщається в "* реєстр, а потім" кладеться ", як і будь-який інший реєстр. Наприклад, щоб поставити вибір (вміст CLIPBOARD):

    "*p

реєструє E354

> There are nine types of registers:                      
> 1. The unnamed register ""
> 2. 10 numbered registers "0 to "9
> 3. The small delete register "-
> 4. 26 named registers "a to "z or "A to "Z
> 5. four read-only registers ":, "., "% and "#
> 6. the expression register "=
> 7. The selection and drop registers "*, "+ and "~ 
> 8. The black hole register "_
> 9. Last search pattern register "/

Вставити з буфера обміну

1. Clipboard: Copy
2. Vim insertmode, middle mouse key

Перевірте підтримку X11-буфера обміну в терміналі

Коли вам подобається запускати Vim в терміналі, вам потрібно шукати версію Vim, яка була складена з підтримкою буфера обміну. Перевірте підтримку X11-буфера обміну, на консолі введіть:

% vim --version

Якщо ви бачите "+ xterm_clipboard", ви добре піти.

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

Сервер X підтримує три вибори, які називаються:

ПЕРШИЧНА, СЕКУНДАРНА та КЛІПБОРДА

PRIMARY вибір звичайно використовується для копіювання та вставлення за допомогою середньої кнопки миші. Вибір SECONDARY та CLIPBOARD рідше використовуються прикладними програмами.

http://linux.die.net/man/1/xsel


12

Я спробував пропозиції вище, і жодна з них не працювала в моєму середовищі. (Клон Windows PuTTY над ssh)

Деякі додаткові googling з'явилися: /unix/110684/copy-paste-into-sshd-vim-from-local-windows-clipboard

Один із коментарів запропонував використовувати SHIFT+INSERTцей трюк для вставки з буфера обміну мого робочого столу у буфер Vim. Ctrl-Cвже працював над тим, щоб скопіювати у Vim буфер обміну робочого столу.


2
Я працюю над інструментом vim всередині cmder [windows 8.1]. коли ви переходите до налаштувань cmder> клавіш та макросів> вставляти, там я отримав команду shift + insert для вставки рядків і ctrl + v для вставки одного рядка.
Зубайр Алам

1
для мене простий клацання правою кнопкою миші працює як шарм !! Просто клацніть правою кнопкою миші!
Fr0zenFyr

2
Оскільки ви використовуєте термінал, а ssh vim не може дістатися до буфера обміну вашої рідної системи через SSL. SHIFT+INSERTпрацює, тому що це варіант вставки для вашого терміналу (або у вашому випадку PuTTY); однак відступ, ймовірно, буде неправильним. Перегляньте останній абзац моєї відповіді про pasteваріант виправити це.
Коннер

1
@jinksPadlock. дякую .. так .. Я можу скопіювати / вставити за допомогою миші .. намагався зрозуміти, як це зробити за допомогою «лише клавіатури». Копіювання з Windows у VIM можливо лише на клавіатурі за допомогою Putty, але не у зворотному напрямку. У баш для вікон .. це неможливо зробити ні в одному напрямку банкоматів. Складено список ресурсів для точкових людей в потрібних напрямках , а також для нас .. якщо у вас є що - небудь add..maybe Ви можете додати їх тут: stackoverflow.com/questions/45271895 / ...
alpha_989

1
@ alpha_989 пізніше-краще-ніж ніколи;) Я не можу додати до jinksPadlock ', оскільки на даний момент у мене немає ОС Windows під пальцями. SHIFT+INSпрацює від хоста Linux до ssh vim, а також третього клацання миші.
tuk0z

10

Не було + буфера обміну, тому я придумав таке альтернативне рішення за допомогою xsel:

Додайте до свого ~ / .vimrc:

vnoremap <C-C> :w !xsel -b<CR><CR>


1
Дякую за цю чудову ідею! Я закінчив користуватися:vnoremap <C-C> :w !xclip -i -sel c<CR><CR>
andy

6

Швидка примітка для людей, встановлення яких vim не підтримує регістри * і +. Не потрібно завантажувати нову установку vim, яку потрібно вставити з буфера обміну. Ось альтернативний метод:

1) Встановити парцеліт (менеджер буфера обміну із низьким ступенем пам’яті);

2) У свій .vimrc файл додайте наступне:

command Clip r !parcellite -c

3) Перезапустіть vim.

Тепер, коли ви вводите: Clip як колишню команду, вміст буфера обміну буде вставлено в курсор. Ви також можете зіставити нову команду на функціональну клавішу, щоб мати можливість це робити одним натисканням клавіші.


4

Це працює для мене: Ctrl+ Shift+V


3
У відповіді @ neel це вже було зазначено. Це має бути лише коментар, а краще голосування, якщо ви хочете сказати, що це працювало і для вас.
ericbn

3

Найпростішим рішенням, яке також працює між різними машинами Linux, sshє:

  1. Перевірте , чи правильно чи VIM підтримує X-11 буфер обміну: vim --version | grep clipboard. Якщо він звітує назад -clipboardі -xterm_clipboardвам слід встановити або vim-gtkабо vim-gnome(gvim на arch linux)

  2. Додайте до свого рядка такі рядки .vimrc:

set clipboard=unnamedplus
set paste
  1. Якщо ви входите на іншу машину через ssh, скористайтеся опцією -Y: ssh -Y machine

Тепер копіювання та вклеювання повинні працювати точно так, як очікувалося на одній і на різних машинах, використовуючи лише yдля перетягування та pвставки. Примініть зміни .vimrcна всіх машинах, де ви хочете використовувати цю функцію.


Я думаю, X сервер повинен бути доступний і на сервері, щоб це працювало. Ага! він може бути встановлений vim-gtk. Я думаю, xvfb буде альтернативним варіантом для запуску X-сервера.
Ajeeb.KP

3

Я зіткнувся з цим питанням у середині 2017 року Macbook Pro, який працює vimв iTerm2якості мого основного середовища розробки.

Як підказали інші відповіді, я побіг vim --versionі помітив, що він повертається -clipboard, а це означає, що версія, vimщо постачається з моєю машиною, не була складена з опцією буфера обміну.

homebrewПакет vimз'явиться компілювати з clipboardопцією, так що виправлення для мене було:

  1. Біжи brew install vim
  2. Додати set clipboard+=unnamedдо мого ~/.vimrcфайлу
  3. Закрийте і знову відкрийте iTerm2

3

Копіювати в буфер обміну ОС

Виберіть текст у візуальному режимі та натисніть "*y

Вставити з буфера обміну ОС

Натисніть "*p


2

З відповіді Коннера, який був великим, але C-R C-p + і C-R C-p *в режимі вставки трохи незручно. Дітто "*pі "+pз командного режиму.

гуру VIM запропонував наступне, щоб C-vвизначити, що C-r C-p +робить.

Ви можете мати :inoremap <C-v> <C-o>"+pлише режим вставки

якби ви дійсно хотіли перекрити блокчейн візуальний режим (не рекомендується ним, оскільки візуальний режим хороший), ви могли б map <C-v> "+p


2

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

встановити vim:

brew install vim --with-lua --with-override-system-vim

встановити gui verion vim:

brew install macvim --with-lua --with-override-system-vim

перезапустіть термінал, щоб набути чинності.


додайте наступний рядок до ~/.vimrc
set clipboard=unnamed

тепер ви можете скопіювати рядок у vim з yyі вставити його на загальну систему.


2

Якщо ви використовуєте мишу, спочатку зробіть

 :set paste 

Потім right click mouseі вміст у буфер буде вставлено


1

Зверху над налаштуваннями :set clipboard=unnamedслід скористатись mvim -vякими можна отримати, brew install macvimякщо ви використовуєте vim на Terminal.app на Mac OS X 10.9. Типовий vim не підтримує опцію буфера обміну.


1

Також варто згадати, що на OSX за допомогою Vim ви можете вибрати текст за допомогою миші, Cmd-C для копіювання в буфер обміну системи OSX, а скопійований текст буде доступний у буфері обміну поза Vim.

Іншими словами, OSX ставиться до цього, як до звичайного вікна, і ось тут дуже корисна кнопка Apple «Command» Apple.

Б-30


1
Це також стосується будь-якого напівпристойного емулятора терміналу в будь-якій іншій ОС. Apple не має жодної переваги тут.
підкреслюй_d

1

На основі відповіді @ lis2 я використовую більш просту конфігурацію, яка не примусить режиму "Вставити" наприкінці:

" Copy and paste
if has('clipboard') && !has('gui_running')
  vnoremap <C-c> "+y
  vnoremap <C-x> "+d
  vnoremap <C-v> "+p
  inoremap <C-v> <C-r><C-o>+
endif

Майте на увазі, що всі ці переосмислення відображень Vim за замовчуванням:

  • v_CTRL-C: зупинити візуальний режим
  • v_CTRL-X: відняти [відлік] від числа
  • v_CTRL-V: блочно Візуальний режим
  • i_CTRL-V: вставити наступний нецифровий буквально, на який також позначено i_CTRL-Q

В якості альтернативи, можна використовувати клавіші натхненні в «ривком», «Видалити» і «пут» ВІМ дієслова: <C-y>, <C-d>і <C-p>відповідно. Вони замінять лише одне відображення за замовчуванням:

  • i_CTRL-P: ключове слово назад для завершення

1

Інші рішення хороші, якщо ви хочете змінити свій vimrc тощо. Однак я хотів простий спосіб копіювання з vim на мою системну клавіатуру. Це те, що я придумав.

  • Виберіть текст, який потрібно скопіювати, у візуальному режимі v
  • Натисніть :(вона автоматично розшириться, щоб показати :'<,'>)
  • Введіть y * або y + (залежно від вашої системи), щоб забрати вибраний текст у буфер обміну системи


1

Оскільки vim 8 клацніть правою кнопкою миші, за замовчуванням увімкніть візуальний режим. Це запобігає "нормальній" копії та вставці (назвіть її "дефектом за дизайном" https://github.com/vim/vim/isissue/1326 ). Виправте це, зробивши:

echo "set mouse-=a" >> ~/.vimrc .

Вихід та перезапуск vim.


1

З Vim 8+ на Linux або Mac тепер ви можете просто використовувати вбудовану пасту ОС ( ctrl+shift+Vдля Linux, cmd+Vдля Mac). Не натискайте iдля режиму вставки.

Він буде вставляти вміст буфера обміну вашої ОС, зберігаючи пробіли та вкладки, не додаючи автозавад. Це еквівалентно старому :set paste, i, ctrl+shift+V, esc, :set nopasteметод.

Вам навіть більше не потрібні встановлені функції +clipboardабо +xterm_clipboardvim. Ця функція називається "скобованою пастою". Детальніше див. У розділі Вимкнення автоматичного відступу під час вставки тексту у формат vim


0

Коли я використовую свій Debian vim, який не інтегрований з Gnome (vim --version | grep clip # не підтримує буфер обміну), я можу скопіювати його до буфера обміну після утримування клавіші Shift та вибору тексту за допомогою миші, як і будь-який інша програма прокльонів. Як я зрозумів з коментаря @Conner, саме термінал (у моєму випадку gnome-термінал) вимикає повідомлення про події миші, коли відчує мою кнопку Shift. Я думаю, що програми на основі прокльонів можуть отримувати події миші після відправлення певної послідовності Escape до терміналу.


1
Для цього використовується ваш термінал, а не vim.
Коннер

0

Якщо ви перебуваєте у вікні і хочете вставити вміст системного буфера обміну, pвведіть цю команду.

:set clipboard = unnamed

Це вирішило мою проблему.


0

Є два простих способи зробити це. Зробіть свій файл у режимі вставки та 1) натисніть середню кнопку (колесо прокрутки) в миші, або 2) Ctrl + Shift + V


0

Для деяких міжнародних клавіатур вам може знадобитися натиснути "+, Spaceщоб отримати ".

Тож у такому випадку вам доведеться натискати "Space+yабо "Space*yкопіювати.

І "Space+pабо " Space*pнаклеїти.


0

Я використав відповідь NM Pennypacker і встановив vim через homebrew на початку 2011 року MacBook Pro:

brew install vim

Тепер я також можу використовувати "* регістр, щоб скопіювати та вставити текст у vim. Мені навіть не довелося щось змінювати в моєму файлі ~ / .vimrc або $ PATH. Homebrew додав посилання у / usr / local / bin, напр. vim -> ../Cellar/vim/8.1.2350/bin/vim.

Альтернативою, яка працювала раніше, є скопіювати деякі рядки тексту в межах vim, позначивши його мишкою та використовуючи копію та вставте (cmd + c, cmd + v) на mac. Цей параметр працює лише в тому випадку, якщо текст, який ви хочете скопіювати та вставити, має розмір менше, ніж розмір вікна vim. Якщо ви хочете скопіювати весь текст у vim, позначивши все вікно або використовуючи cmd + a, це скопіює інші частини консолі, написані перед запуском vim, що дуже дратує.

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

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