Скопіюйте всі рядки в буфер обміну


564

Чи є можливість скопіювати всі рядки з відкритого файлу в буфер обміну в редакторі VI. Я спробував, yGале це не використання буфера обміну для зберігання цих рядків.

Так це можливо?



1
Якщо ви перебуваєте в Windows, а у вас не працює, дивіться 17-ту відповідь зверху: stackoverflow.com/questions/1620018/…
Noumenon

Відповіді:


635

Ви повинні перетягнути текст до *або + реєструвати :

gg"*yG

Пояснення:

  • gg щоб отримати курсор до першого символу файлу
  • "*yзапустити команду yank до регістра *з першого рядка, поки ...
  • G перейти до кінця файлу

6
Як ви розмічаєте текст, щоб він виглядав як клавіші? Я ще цього не бачив.
jergason

10
Привіт ... його не працює? Дані буфера обміну залишаються незмінними. коли я набираю gg курсор, переходить до першого рядка ... але коли я набираю "* yG ..cpu звучить на * ..так це нормально чи є якась проблема з моїм vim? Я на Ubuntu ..
Xinus

1
Чи увімкнено Deadkeys? (наприклад, при натисканні на "a" ви отримуєте á) Якщо так, вам потрібно натиснути пробіл після ".
Тордек

144
Vim може отримати доступ до буфера обміну системи лише у тому випадку, якщо він складений з увімкненим xterm_clipboard. Щоб дізнатися, чи є у вас ця функція, запустіть :versionvim і шукайте +xterm_clipboardпрапор. Якщо йому передує знак мінус, ви не будете мати цю функціональність. Якщо це так, можливо, ви захочете скомпілювати vim самостійно або запустити gvim, для якого зазвичай ця функція увімкнена.
nelstrom

9
Проблема такого підходу полягає в тому, що він переміщує курсор і прокручує вікно навколо. Двічі. Інший відповідь має набагато менше натискань клавіш і недоліки :)
sehe

696

Використання:

:%y+

потягнути всі лінії.

Пояснення:

  • % для позначення наступної команди для роботи над усіма рядками
  • y витягнути ці рядки
  • + скопіювати в буфер обміну системи

Примітка . У Windows +та *їх еквіваленті дивіться цю відповідь .


19
Плюс це не змінить розташування курсору.
nperson325681

1
@guangnan: цих регістрів не існує in vi; тільки в vim. Спробуйте ввести, :helpщоб переконатися, що ви фактично є vim.
Помітний укладач

6
Мені потрібно було set clipboard=unnamed, але тоді це спрацювало чудово!
cdunn2001

234
Вім каже E850: Invalid register name:(
самотній

23
Це рішення працює лише в тому випадку, якщо vim був скомпільований з параметром буфера обміну (vim --version покаже + буфер обміну в цьому випадку). Якщо цього не було, рішення Брайана (:% w! Pbcopy) - це рішення для Mac. Альтернативи доступні для інших операційних систем (наприклад, xclip).
yaccob

90

на Mac

  • скопіюйте вибрану частину: візуально виберіть текст (введіть vабо Vв звичайному режимі) та введіть:w !pbcopy

  • скопіюйте весь файл :%w !pbcopy

  • минуле з буфера обміну :r !pbpaste


6
Працює безперебійно. Пояснення команд було б дуже приємно.
Влад Мануель Муреган

5
@Geo pbcopy- це утиліта для Mac. У Linux xselможе працювати замість цього або clipв Windows.
Девід Лорд

1
Це не спрацює, якщо файл довше висоти вашого терміналу.
Шрідхар Сарнобат

1
@SridharSarnobat :%w !pbcopyвсе ще працює, якщо файл довший за висоту терміналу.
Адріан Шмідт

Пробачте, я мав на увазі над ssh, де клієнтом є Mac, а сервер - Linux (який я вважав, що шукав ОП, але тепер, коли я думаю про це, це непов'язана проблема). На свій захист я б уникав vim для копіювання та вставки для локальних файлів, але це мій особистий смак. Гарні поради.
Шрідхар Сарнобат

56

Буфер обміну буфер +. Щоб скопіювати у буфер обміну, виконайте "+yта [рух].

Отже, gg"+yGскопіюємо весь файл.

Аналогічно, щоб вставити з буфера обміну, "+p


4
Просто для додати до цього (4 роки пізніше ...), це має незначний недолік у тому, що ваше положення курсору підскочить до верхньої частини файлу. Щоб уникнути цього (наприклад, якщо ви позначаєте це на деякому ярлику у своєму vimrc), ви можете зробити щось на кшталт: mqgg "+ yG`q
Том Лорд,

45

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


1
E603:: ловити без: спробуйте
Пол Кріс Джонс

2
І якщо ви хочете , щоб зробити це , не виходячи з Vim, ви можете виконати наступну команду: :!cat %. І копіювати вміст файлу програмно в буфер обміну на Mac OS::!cat % | pbcopy
TanguyP

Необхідно скопіювати файл з Ubuntu VM в Windows на Debian в GCP, відкритий у вікні браузера ...: / Варіанти vim yanking не спрацювали, це працювало для вставки в Windows, а потім завантаження файлу в GCP.
frmbelz

31

Це те, що я роблю, щоб витягнути весь файл:

ggVGy

12
Я боюся, що це не відповідає на питання, оскільки ви втягуєтесь у регістр за замовчуванням, а не в буфер обміну.
Помітний укладач

2
@ConspicuousCompiler це було б, якби він мав clipboardнамір скопіювати вирваний текст у +все-таки.
TankorSmash

@TankorSmash, однак, не найшвидший (:% y) ні найменший (принаймні, ggyG - кращий) метод.
pedroapero

@ConspicuousCompiler в чому різниця між регістром за замовчуванням та буфером обміну ?
nilon

17

Ви можете скористатися командою "cat", щоб відкрити файл, а скопіювати мишу


5
Але це не так, як "vi", якщо файл величезний, то це також буде проблемою ... Це може спрацювати, але не запропонований спосіб ...
Aditya

1
resetзаздалегідь виберіть термінал, потім виберіть усі та скопіюйте Це працює через sshсеанс.
arcol

Найшвидший спосіб для великих файлів (до 10 тисяч рядків) на різних віддалених серверах, якщо xterm_clipboard недоступний
Matias Haeussler

10

(у відповідь на @rshdev, і щоб уникнути перекомпіляції vim з + xterm_clipboard per @nelstrom у коментарях до ОП)

є програма під назвою xclip, яка працює як putclip на Ubuntu 11:

:%!xclip -sel clip
u

він не встановлений за замовчуванням. для встановлення використовуйте:

sudo apt-get install xclip

10

У Ubuntu 12

ви можете спробувати встановити vim-gnomeпакет:

sudo apt-get install vim-gnome

Я спробував це, тому що vim --versionсказав мені, що прапор xterm_clipboard буде відключений (позначено - ), який необхідний для використання функцій буфера обміну.

-> встановлення пакету vim-gnome на Ubuntu 12 також встановила консольну версію vim, у якій включена ця опція (вказана знаком + перед прапорцем xterm_clipboard)

В Arch Linux

ви можете встановити vim-clipboardз тієї ж причини.

Якщо ви запускаєте neovim, вам слід встановити xclip(як пояснено help clipboard-tool)


1
unix.stackexchange.com/questions/25965/… чи є ще хтось варіант, про який хтось знає?
Сандіп Пінгл

6

Якщо ви використовуєте Vim у візуальному режимі, застосовуються також стандартні клавіші вирізання та вставки, принаймні для Windows.

  • CTRLA означає "Позначити весь файл.
  • CTRLC означає "Скопіюйте виділення.
  • ESC означає "Зняти вибір", тому наступне натискання клавіші не замінить весь файл :-)

Принаймні, під терміналом Ubuntu (Gnome) працює стандартна копія ( CTRLSHIFTCхоча, здається, не існує стандартного комбінації клавіш select all(крім того, ALTEза яким слід A).


6
Але якщо ви не використовуєте mswin.vim, тоді ctrl-a збільшує наступне число у поточному рядку.
Марк Рушакофф

@ Марк, така поведінка відбувається від стандартної установки Vim, тому я припускаю, що це за замовчуванням. Усі ставки знімаються, якщо середовище налаштовано інакше, хоча якби це було так, я підозрюю, що ОП знав би, що вони роблять :-) У будь-якому випадку ОП заявив у коментарі, що вони були на Ubuntu, тому частина Windows моя відповідь, ймовірно, не стосується. Що стосується терміналу Gnome.
paxdiablo

5

Ви можете натиснути gg, щоб знайти курсор до початку файлу, а потім натисніть yG, щоб скопіювати весь вміст від початку до кінця (G розміщено) до buffer.good luck!


4

Я спробував кілька команд, про які люди згадували вище. Жоден не працював. Тоді я влаштувався найпростішим з усіх.

Крок 1: vi <filename>
Крок 2: Клацніть правою кнопкою миші на заголовку вікна Putty.
Крок 3: Виберіть "Очистити прокрутку" (щоб уникнути копіювання решти сеансу SSH).
Крок 4: Клацніть правою кнопкою миші ще раз та виберіть "Скопіювати все у буфер обміну".


1
Для 15000 рядкових файлів це не захопило все. Мені потрібно було збільшити розмір Putty's Window > Settings > lines of scrollbackдо 40000 (доступно також клацанням правою кнопкою миші на заголовку). Він також допомагає використовувати catзамість vi, оскільки прокручує весь текст.
Номенон

1
Я завжди втрачав рядки зверху та внизу файлу таким чином. Що я зараз роблю - це cat, потім клацніть середнім клавішею на початку та в кінці файлу, щоб розширити вибір.
Номенон

Коли я спробував це, у мене з’явилося лише 111 рядків на екрані, але в моєму файлі є 174 рядки, тож відповідь на кішку Нуменона працювала на мене
seizethecarp

3

:%y aЯнькає весь вміст у буфер vim, Якщо натиснути pв командному режимі, буде вставлено збитий вміст після рядка, на якому зараз знаходиться ваш курсор.


3

gVim:

:set go=a

ggVG

Дивіться :help go-a:

'a' Autoselect:  If present, then whenever VISUAL mode is started,
 or the Visual area extended, Vim tries to become the owner of
 the windowing system's global selection.  This means that the
 Visually highlighted text is available for pasting into other
 applications as well as into Vim itself.  When the Visual mode
 ends, possibly due to an operation on the text, or when an
 application wants to paste the selection, the highlighted text
 is automatically yanked into the "* selection register.
 Thus the selection is still available for pasting into other
 applications after the VISUAL mode has ended.
     If not present, then Vim won't become the owner of the
 windowing system's global selection unless explicitly told to
 by a yank or delete operation for the "* register.
 The same applies to the modeless selection.

3

Ну, всі ці підходи цікаві, однак, як лінивий програміст, я використовую yank all line, використовуючи комбінацію числа + y

наприклад, у вас є файл вихідного коду загальною кількістю 78 рядків, ви можете зробити наступне:

  1. gg щоб отримати курсор на першому рядку
  2. вставте 78 + y -> він пронизує 78 рядків під курсором та поточним рядком

2

У ві-білі Біла Джоя не було поняття "буфер обміну", тому я не думаю, що існує вбудований спосіб зробити це.

Функція автоматичного копіювання будь-якого виділеного на кліп буфера обміну gVim найпростіша або використання зовнішньої програми через:!

Для сини Віґу я використовую

:%!putclip
u

Можливо, Ubuntu має такий додаток CLI, як putclip ??


чудова пропозиція, дякую! є така програма, яка називається xclip. для деталей я розмістив окрему відповідь (це було б занадто заплутано, щоб прочитати з коментаря, без зайвих нових рядків та форматування коду).
Стейв

2

Якщо ваші пальці за замовчуванням CTRL-A CTRL-C, то спробуйте зіставити карти $VIMRUNTIME/mswin.vim.

" CTRL-C and CTRL-Insert are Copy
vnoremap <C-C> "+y

" CTRL-A is Select all
noremap <C-A> gggH<C-O>G
inoremap <C-A> <C-O>gg<C-O>gH<C-O>G
cnoremap <C-A> <C-C>gggH<C-O>G
onoremap <C-A> <C-C>gggH<C-O>G
snoremap <C-A> <C-C>gggH<C-O>G
xnoremap <C-A> <C-C>ggVG

Я їх відобразив до <Leader><C-a>і <Leader><C-c>.


2

Скопіюйте весь файл усередині vim або його вкладок

y G 

потім перейдіть на вкладку та вставте

p

і скоротити використання всього файлу

d G

2

Я додав наступний рядок до свого .vimrc

nnoremap <F5> :%y+<CR>

Це дозволяє мені скопіювати весь текст Vim у буфер обміну натисканням F5(у командному режимі).


1

Ось команда на карті, щоб вибрати все до буфера обміну за допомогою CTRL+ a:

"
" select all with control-a
"
nnoremap <C-a> ggmqvG"+y'q

Додайте його до свого .vimrc, і ви готові йти ...


1

Я знаю, що десять років щодо цього слід вирішити, але перші два відповіді не спрацювали для мене, тому я продовжував копати. На Redhat (віддалений сервер) - Windows 10 (локальна машина), якщо ви не можете вибрати всю справу за допомогою миші, ви застрягли, оскільки звичайні копії не працюють між віддаленим та місцевим буфером машин.

Отже, для копіювання на віддалений Linux та вставки на локальну Windows вкажіть основний буфер із * та зробіть хороший подвійний ривок

Використовуйте gg" * yy.


0

Я створив функцію для виконання цієї дії, розмістіть її на своєму ~/.vimrc.

fun! CopyBufferToClipboard()
    %y+
endfun
nnoremap <Leader>y :call CopyBufferToClipboard()<CR>
command! -nargs=0 CopyFile :call CopyBufferToClipboard()

OBS: Якщо ви використовуєте neovim, вам також потрібен менеджер буфера обміну, наприклад xclip. для отримання додаткової інформації в neovim:h checkhealth

Важливо також зазначити , що не завжди просто yбуде копіювати в буфер обміну, для того , щоб кожен канал копіювання +яким є «Clipboard Регістр» спробувати встановити: :set clipboard=unnamed,unnamedplus. Для мор інформації див :h unnamed.

Тут більше інформації про vim wikia.


0

Ви можете використовувати короткий, наприклад, такий:

noremap <F6> :%y+<CR>

Це означає, що коли ви натиснете F6 у звичайному режимі, він скопіює весь файл та додасть його до буфера обміну. Або ви просто можете набрати в звичайному режимі, :%y+а потім натиснути Enter.


-1

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


3
Файл може бути величезним, і перетягування всього тексту за допомогою миші не є продуктивним (ані viспособом).
Доктор Беко

1
Насправді це гарна відповідь і працює для мене. У моїй системі довкілля v обмежувальне. Мені доводиться кішки виводити на екран, а потім за допомогою миші перетягувати, вибирати та відпускати .. потім я копіюю в Windows Notepad ++ .. і чудово працює. Більше нічого не працює.
Апурва Сінгх

-1

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

  1. Змініть налаштування свого сеансу PuTTY, перейдіть до журналу та змініть його на "символи для друку". Встановити файл журналу
  2. Зробіть кішку відповідного файлу
  3. Перейдіть до файла, який ви встановили на кроці №1, і ви матимете свій вміст у файлі журналу.

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

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