Скопируйте все строки в буфер обмена


565

Есть ли способ скопировать все строки из открытого файла в буфер обмена в редакторе VI. Я пытался, yGно он не использует буфер обмена для хранения этих строк.

Так возможно ли это?



1
Если у вас Windows и yank не работает, посмотрите 17-й ответ сверху: stackoverflow.com/questions/1620018/…
Noumenon

Ответы:


636

Вы должны вернуть текст в регистры* или :+

gg"*yG

Объяснение:

  • gg чтобы получить курсор к первому символу файла
  • "*y запустить команду янки в реестр * с первой строки, пока ...
  • G идти в конец файла

6
Как разметить текст, чтобы он выглядел как клавиши? Я еще не видел этого на SO.
Джергасон

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 дергать эти строки
  • + скопировать в системный буфер обмена

NB : В Windows +и *аналогичных см. Этот ответ .


19
Плюс это не изменит местоположение курсора.
nperson325681

1
@guangnan: эти регистры не существуют в vi; только в vim. Попробуйте набрать, :helpчтобы убедиться, что вы на самом деле в VIM.
Заметный компилятор

6
Мне нужно было set clipboard=unnamed, но тогда это работало отлично!
cdunn2001

235
Вим говорит E850: Invalid register name:(
Одинокий

23
Это решение работает, только если vim был скомпилирован с опцией буфера обмена (в этом случае vim --version покажет + clipboard). Если это не так, решение Брайана (:% 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 (что, как я предполагал, было тем, что искал OP, но теперь, когда я об этом думаю, это не связанная проблема). В свою защиту я бы не использовал vim для копирования и вставки локальных файлов, но это мой личный вкус. Хорошие советы.
Шридхар Сарнобат

56

Буфер обмена является буфером +. Чтобы скопировать в буфер обмена, сделайте"+y и [движение].

Так, gg"+yG скопируем весь файл.

Точно так же, чтобы вставить из буфера обмена, "+p


4
Просто добавьте к этому (4 года спустя ...), у этого есть небольшой недостаток в том, что ваша позиция курсора переместится в начало файла. Чтобы избежать этого (например, если вы отображаете это на какой-то ярлык в вашем vimrc), вы можете сделать что-то вроде: mqgg "+ yG`q
Tom Lord

46

Другой простой способ скопировать весь файл, если у вас возникли проблемы с использованием VI, - просто набрать «cat filename». Он отобразит файл на экране, а затем вы можете просто прокрутить вверх и вниз и скопировать / вставить.


1
E603:: ловить без: попробовать
Пол Крис Джонс

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

Необходимо скопировать файл с виртуальной машины Ubuntu в Windows на Debian в GCP, открытом в окне браузера ...: / Варианты vim yanking не сработали, это работало, чтобы вставить в Windows, а затем загрузить файл в GCP.
frmbelz

31

Вот что я делаю, чтобы вытащить весь файл:

ggVGy

12
Боюсь, это не отвечает на вопрос, так как вы дергаете за регистр по умолчанию, а не за буфер обмена.
Заметный компилятор

2
@ConspicuousCompiler было бы, если бы у него был clipboardнабор, чтобы скопировать натянутый текст в +хотя.
TankorSmash

@TankorSmash не самый быстрый (:% y) и не самый лучший (по крайней мере, ggyG лучше) метод.
Pedroapero

@ConspicuousCompiler В чем разница между регистром по умолчанию и буфером обмена ?
Нильон

17

Вы можете использовать команду "кошка", чтобы открыть файл и использовать мышь, чтобы скопировать


5
Но это не будет способом "vi", если файл огромен, это также будет проблемой ... Это может работать, но не рекомендуемый способ ...
Aditya

1
resetТерминал заранее, затем выберите все и скопируйте. Это работает через sshсессию.
arcol

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

10

(в ответ на @rshdev, чтобы избежать необходимости перекомпилировать vim с + xterm_clipboard per @nelstrom в комментариях к OP)

В Ubuntu 11 есть программа xclip, которая работает как putclip:

:%!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, поэтому я предполагаю, что это по умолчанию. Все ставки отключены, если среда настроена по-другому, хотя, если бы это было так, я подозреваю, что OP будет знать, что они делают :-) В любом случае, OP заявил в комментарии, что они были в Ubuntu, так что часть Windows мой ответ, вероятно, не относится. Терминал гномов мог бы.
paxdiablo

5

Вы можете нажать gg, чтобы найти курсор в начале файла, а затем нажать yG, чтобы скопировать весь контент от начала до конца (расположенный G) в буфер. Удачи!


4

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

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


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

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

Когда я попробовал это, я получил только 111 строк на экране, но в моем файле 174 строки, поэтому кошачий ответ
Нуменона

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 всю строку, используя комбинацию цифр + y

например, у вас есть файл исходного кода с общим количеством 78 строк, вы можете сделать это следующим образом:

  1. gg получить курсор на первой строке
  2. вставьте 78 + y -> он возвращает 78 строк ниже вашего курсора и текущей строки

2

В vi Билла Джоя не было понятия «буфер обмена», поэтому я не думаю, что есть встроенный способ сделать это.

Функция автоматического копирования gVim «все, что выделено в буфер обмена» является самой простой или использует внешнюю программу с помощью:!

Для Cygwin's Vim я использую

:%!putclip
u

Может быть, в Ubuntu есть CLI-приложение типа putclip ??


отличное предложение, спасибо! есть такая программа, которая называется xclip. для деталей, я отправил отдельный ответ (это было бы слишком запутанным, чтобы прочитать из комментария, без дополнительных новых строк и форматирования кода).
Stew

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
На самом деле это хороший ответ и работает для меня. В моей системе среда ограничена. Мне нужно просмотреть вывод на экране, а затем использовать мышь для перетаскивания, выбора и отпускания ... затем я копирую в Windows Notepad ++ ... и отлично работает. Больше ничего не работает.
Апурва Сингх

-1

Я не мог скопировать файлы, используя ответы выше, но у меня есть замазка, и я нашел обходной путь на Quora.

  1. Измените настройки вашего сеанса PuTTY, перейдите в журнал и измените его на «печатные символы». Установите файл журнала
  2. Сделай кошку из соответствующего файла
  3. Перейдите к файлу, который вы установили в шаге # 1, и вы будете иметь свой контент в файле журнала.

Примечание: он копирует все напечатанные символы этого сеанса в файл журнала, поэтому со временем он станет большим. В этом случае удалите файл журнала и перейдите к целевому файлу, чтобы вы скопировали содержимое этого конкретного файла на свой компьютер.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.