Как копировать, вырезать и вставлять в Vim / Vi
При работе с текстовыми файлами копирование, вырезание и вставка текста — одна из наиболее часто выполняемых задач.
Vim или его предшественник Vi предустановлен на macOS и почти во всех дистрибутивах Linux. Знание основ Vim полезно в ситуации, когда ваш любимый редактор недоступен.
В этой статье показано, как копировать, вырезать и вставлять в редакторе Vim / Vi.
Копирование, вырезание и вставка в нормальном режиме
Когда вы запускаете редактор Vim, вы находитесь в обычном режиме. В этом режиме вы можете запускать команды Vim и перемещаться по файлу.
Чтобы вернуться в нормальный режим из любого другого режима, просто нажмите Esc .
В Vim есть собственная терминология для копирования, вырезания и вставки. Копирование называется yank ( y ), вырезание называется delete ( d ), а вставка называется put ( p ).
Копирование (Янкинг)
Чтобы скопировать текст, поместите курсор в желаемое место и нажмите клавишу y а затем команду перемещения. Ниже приведены некоторые полезные команды восстановления:
- yy — Янкнуть (скопировать) текущую строку, включая символ новой строки.
- 3yy — 3yy (копирование) трех строк, начиная с строки, в которой находится курсор.
- y$ — копировать (копировать) все от курсора до конца строки.
- y^ — Янкинг (копирование) всего от курсора до начала строки.
- yw — Янкнуть (копировать) до начала следующего слова.
- yiw — yiw (скопировать) текущее слово.
- y% — Янкнуть (копировать) на соответствующий символ. По умолчанию поддерживаются пары () , <> и [] . Полезно для копирования текста между совпадающими скобками.
Резка (Удаление)
В обычном режиме d — клавиша для вырезания (удаления) текста. Переместите курсор в желаемое положение и нажмите клавишу d , а затем команду перемещения. Вот несколько полезных команд для удаления:
- dd — Удалить (вырезать) текущую строку, включая символ новой строки.
- 3dd — Удалить (вырезать) три строки, начиная с линии, в которой находится курсор,
- d$ — Удалить (вырезать) все от курсора до конца строки.
Команды движения, применяемые для восстановления, также действительны для удаления. Например, dw удаляет до начала следующего слова, а d^ удаляет все от курсора до начала строки.
Склеивание (Вставка)
Чтобы поместить извлеченный или удаленный текст, переместите курсор в желаемое место и нажмите p чтобы вставить (вставить) текст после курсора, или P чтобы поместить (вставить) перед курсором.
Копирование, вырезание и вставка в визуальном режиме
Визуальный режим Vim позволяет выбирать текст и управлять им.
Поместите курсор на линию, с которой вы хотите начать копирование или резку.
Визуальный режим имеет три подтипа.
- Нажмите v чтобы войти в визуальный режим.
- Нажмите V чтобы войти в визуальный линейный режим, в котором текст выделяется построчно.
- Нажмите Ctrl+v чтобы войти в режим визуального блока. В этом режиме текст выделяется прямоугольными блоками.
Переход в визуальный режим также отмечает начальную точку выбора.
Переместите курсор в конец текста, который вы хотите скопировать или вырезать. Вы можете использовать команду перемещения или клавиши со стрелками вверх, вниз, вправо и влево.
Нажмите y чтобы скопировать, или d чтобы вырезать выделение.
Переместите курсор в то место, куда вы хотите вставить содержимое.
Нажмите P чтобы вставить содержимое перед курсором, или p чтобы вставить его после курсора.
Выводы
В этом руководстве мы показали вам, как копировать, вырезать и вставлять в Vim.
Если вы новичок в Vim, посетите сайт Open Vim, где вы можете попрактиковаться в Vim с помощью интерактивного руководства.
[vim][вопрос знатокам] Копирование из vim в буфер обмена
Включена нумерация строк, как из vim скопировать текст в буфер обмена (не "y", а именно в системный буфер), так что бы не захватить номера строк (мышкой так получается). gvim не предлагать.


Re: [vim][вопрос знатокам] Копирование из vim в буфер обмена
выбрать текст в визуальном режиме (v, V, C-v) и скопировать командой "+y (поочереди нажимаешь ", +, y)
может, и без визуального выделания можно, но я не вкурсе как.
а еще, если мешают именно номера строк, то можно их временно отключить (:set nonumber) 😉

Re: [vim][вопрос знатокам] Копирование из vim в буфер обмена
"ay — копирование в "именной" буфер "a"
"ad — удаление в "именной" буфер "a"
"ap — вставка из буфера "a"
всего "именных" буферов — по числу букв (latin) — 26. работа же с обычными буферами элементарна:
:badd [ПУТЬ/ИМЯ] — добавить новый буфер
:bd — удалить
:bn/:bp — циклическое перемещение по буферам
аналог — :tabnew (imho — лишнее, но кому-то нравится)

Re: [vim][вопрос знатокам] Копирование из vim в буфер обмена
эээ, а при чем тут именованные буферы?
наверное, я что-то таки пропустил.

Re: [vim][вопрос знатокам] Копирование из vim в буфер обмена
>>эээ, а при чем тут именованные буферы?
любой "янк" (imho) идёт через "системный" буфер (проверить можно тем же xclipboard). мой ответ о копировании данных сугубо в "пространстве" запущенного vim-а.

Re: [vim][вопрос знатокам] Копирование из vim в буфер обмена
> любой "янк" (imho) идёт через "системный" буфер
вроде как нет.

Re: [vim][вопрос знатокам] Копирование из vim в буфер обмена
>вроде как нет.
ваша правда, почему-то был уверен в обратном.

Re: [vim][вопрос знатокам] Копирование из vim в буфер обмена
>выбрать текст в визуальном режиме (v, V, C-v) и скопировать командой "+y (поочереди нажимаешь ", +, y)
Спасибо, то что надо.

Re: [vim][вопрос знатокам] Копирование из vim в буфер обмена
Блин, а у меня что-то не получается: выделяю, нажимаю " (Shift и ‘), далее нажимаю + (Shift и =), а затем y. Но klipper показывает что в буфере ничего нового нет. ЧЯДНТ?

Re: [vim][вопрос знатокам] Копирование из vim в буфер обмена
Хм, что сделал я. v выделил, shift+’, shift++, y. После этого текст вставляется glipper показывает что все ок.

Re: [vim][вопрос знатокам] Копирование из vim в буфер обмена
shift+= конечно же
Может просто раскладка русская включена?

Re: [vim][вопрос знатокам] Копирование из vim в буфер обмена
Да, тоже самое делаю, но ничего не происходит. А ты shift между " и + отжимаешь?
Как скопировать в буфер обмена в Vim?
можно ли скопировать в буфер обмена прямо из Vim? yy копирует только материал во внутренний буфер Vim. Я хочу скопировать в буфер обмена ОС. Есть ли такая команда в Vim или вы можете только дергать вещи в Vim?
26 ответов
на * Регистрация сделает это. В Windows, + и * эквивалентны. В unix есть тонкая разница между + и * :
под управлением ОС Windows, * и + регистры являются эквивалентными. Для систем X11, хотя, они отличаются. Для систем X11, * является выбором, а + — буфером вырезания (например, буфером обмена). http://vim.wikia.com/wiki/Accessing_the_system_clipboard
* is вероятно, что вы хотите большую часть времени, поэтому я использую * потому что он работает так, как я ожидаю, в обеих средах.
в дистрибутивах Linux по какой-то причине вам нужно сначала установить vim-gtk, чтобы получить функциональность буфера обмена.
и для тех, кто запутался в том, как использовать регистры при дергании или вводе, вы просто пишете » затем название регистра. Поэтому для копирования чего-либо в буфер обмена вы вводите «*y а затем, чтобы поставить вас тип «*p
На Mac OSX
копировать выбранную часть: визуально выбрать текст (введите v или V в нормальных режим) и типа :w !pbcopy
скопировать весь файл :%w !pbcopy
вставить из буфера обмена :r !pbpaste
On большинство Linux дистрибутивы, вы можете заменить:
- pbcopy выше xclip -i -sel c или xsel -i -b
- pbpaste используя xclip -o -sel -c или xsel -o -b
— Примечание:в случае, если ни один из этих инструментов ( xsel и xclip ) предустановлены на вашем дистрибутиве, вы, вероятно, можете найти их в репозиториях
в файле vimrc можно указать автоматическое использование системного буфера обмена для копирования и вставки.
на Linux set (vim 7.3.74+):
Примечание: вам может потребоваться использовать последнюю версию Vim для их работы.
использовать регистр «+ копировать в системный буфер обмена (т. е. «+y вместо y ).
аналогично вы можете вставить «+ для получения текста из системного буфера обмена (т. е. «+p вместо p ).
@Jacob Dalton упомянул об этом в комментарии, но никто, похоже, не упомянул в ответе, что vim должен быть скомпилирован с поддержкой буфера обмена для любого из предложений, упомянутых здесь, чтобы работать. Мой не был настроен таким образом на Mac OS X по умолчанию, и мне пришлось перестроить vim. Используйте эту команду, чтобы узнать, есть ли у вас это или нет vim —version | grep ‘clipboard’ . +clipboard означает, что Вы хороши, и предложения здесь будут работать для вас, в то время как -clipboard означает, что вам нужно перекомпилировать и перестроить vim.
подведение итогов и сделать его проще для новичков,
чтобы скопировать текущую строку, в командном режиме введите:
скопировать весь файл/буфер, в командном режиме, перейдите к началу через gg тип
как уже отмечалось, для этого требуется +clipboard из vim —version , которые указывают на наличие поддержки буфера обмена, -clipboard значит нет.
Я не смог скопировать в систему буфера обмена, потому что у меня было это в моем
но если вы добавите эту строку далее, это позволит вам просто Ctrl + c чтобы получить то, что вы выбрали в буфер обмена.
если вы используете vim в MAC OSX, к сожалению, он поставляется со старым verion и не соответствует параметрам буфера обмена. К счастью, homebrew может легко решить эту проблему.
установить 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 и вставьте его в масштабах всей системы.
Обновленный Метод:
я никогда не был доволен методом set clipboard в течение многих лет. Самый большой недостаток-это испортит историю буфера обмена, даже если вы используете x для удаления. Вот лучшее и более элегантное решение.
скопируйте текст [диапазон] vim в систему буфер. (Подсказка: используйте v или V сначала выберите диапазон, а затем введите двоеточие : для активации команды Ex):
:[range]yank +
например,
:5,10y * (копировать / дергать строки 5-10 в системный буфер обмена * Регистрация)
вставьте содержимое из системного буфера обмена в vim в новой строке:
:put +
Настройка Vim
Vim — это очень сложный, но в то же время очень популярный текстовый редактор текста среди пользователей операционных систем Linux. Программа позволяет перемещаться по тексту и выполнять большинство действий с помощью клавиатуры, это очень сильно ускоряет работу за компьютером, поэтому что вам не надо постоянно переносить руку на мышь и обратно.
В нескольких предыдущих статьях я рассказывал про основы работы с Vim и основные команды программы, сегодня же хочу поговорить о настройке и персонализации программы. Добавление нескольких строчек в конфигурационный файл может сделать Vim намного удобнее. Несмотря на то, что в тексте я буду писать Vi, речь будет идти про современную версию редактора — Vim.
Настройка редактора Vim
Основной конфигурационный файл Vim находится в папке /etc/. Это файл /etc/vimrc/vimrc. Коме того, для каждого отдельного пользователя можно настроить Vi с помощью локального конфигурационного файла, который находится в домашней папке
/.vimrc. Вы можете использовать тот файл, который вам надо, например:
Я рекомендую комментировать если не каждую строчку, то хотя бы каждую секцию, потому что если вы этого не будете делать, то потом не разберетесь что и зачем добавляли. Для комментария добавьте перед строкой символ кавычки — «.
1. Отступы и нумерация строк
Если вы собрались программировать в Vi, то вам надо обязательно разобраться с отступами. В стандартах многих языков программирования рекомендуется использовать пробелы вместо табов, а каждый отступ оформлять фиксированным количеством пробелов, например, стандарт Python PEP-8 рекомендует использовать четыре пробела. Чтобы это настроить добавьте такие строки:
set expandtab set smarttab set tabstop=4 set softtabstop=4 set shiftwidth=4
Переменная expandtab включает замену табов на пробелы, tabstop — количество пробелов в одном обычном табе, softtabstop — количество пробелов в табе при удалении, smarttab — при нажатии таба в начале строки добавляет количество пробелов равное shiftwidth.
Чтобы добавить нумерацию строк добавьте такую команду:

Раз мы уже заговорили про отступы, давайте сделаем ещё небольшой отступ между левой частью окна:
2. Внешний вид
Для редактора доступно несколько цветовых схем. Вы можете посмотреть все доступные схемы открыв редактор и набрав там команду :colorscheme, затем пробел, а затем Tab:

Для выбора цветовой схемы на постоянной основе добавьте в конфигурационный файл такую строчку
colorscheme имя_цветовой_схемы
Для многих языков программирования есть подсветка синтаксиса, чтобы её включить добавьте:
3. Звук
При нажатии неверной клавиши или ошибке в Vim проигрывается специальный звук. Если он вам мешает, его можно отключить:
set noerrorbells set novisualbell
4. Поддержка мыши
Если вы работаете в графическом окружении, то, возможно, вам понадобиться поддержка мышки. Поддержка может быть добавлена в несколько режимов работы программы:
- n — обычный режим;
- v — визуальный режим (режим выделения);
- i — режим вставки;
- c — режим командой строки;
- a — все перечисленные ранее режимы;
- r — для режима «Нажмите Enter» или запроса ввода информации.
В большинстве случаев чтобы включить мышку во всех режимах программы достаточно добавить такую строчку:

Также можно включить мышку только в визуальном режиме:
Или вовсе её отключить:
При включённой поддержке мыши, вы все ещё можете копировать текст в системный буфер обмена, для этого просто зажмите клавишу Shift.
5. Настройка привязок
Очень полезная возможность Vim — это настройка своих привязок клавиш. Для этого существует функция map. Она похожа на alias в Linux и сообщает программе, что если мы вводим что-то, то хотим сделать ещё что-то. Здесь прежде чем переходить к настройке нужно понять как это работает. Синтаксис map простой:
map набор_символов_или_сочетание_клавиш на_что_заменить
Откройте редактор и выполните там команду:
:map losst <ESC>iHello world!<CR>

При вводе набора символов losst программа нажимает клавишу Esc, затем вводит i чтобы перейти в режим редактирования, потом пишет приветствие и добавляет символ перевода строки. Клавиши, которые надо нажать пишутся в скобках <>.
Мы рассмотрели общую команду map, но существуют также отдельные команды для других режимов:
- nmap — нормальный режим;
- vmap — визуальный режим;
- omap — режим, когда выбран оператор действия (y,p или d);
- cmap — режим командной строки;
- imap — режим вставки.
Кроме того есть не рекурсивный вариант команды. Например, если на слово Hello назначить ещё одну замену, то в нашем примере она сработает. Но в не рекурсивном варианте всё равно будет вставлено Hello. Не рекурсивные варианты команды тоже есть для всех режимов, это noremap, vnoremap, nnoremap, onoremap, cnoremap и inoremap.
Но это ещё не всё. В начале пользовательских привязок клавиш принято использовать клавишу <leader> по умолчанию это обратный слеш. Например, если сделать вот так:
:map <leader>losst <ESC>iHello world!<CR>
Тогда для выполнения этой привязки надо набрать \losst. Использовать обратный слеш не всегда удобно, поэтому часто его заменяют на запятую. Для этого в конфигурационный файл надо добавить:
Теперь вы знаете как настроить привязки клавиш в vim и что это всё означает. Теперь можно добавить сочетание клавиш для быстрого сохранения:
Поиск дальше нажатием пробела:
Поиск предыдущего вхождения по нажатию Ctrl+Пробел:
Более удобное перемещение между открытыми вкладками редактора:
Включение или отключение проверки орфографии:
map <leader>ss :setlocal spell!<CR>
Таким образом, вы можете сделать более удобным и быстрым любое действие в редакторе.
6. Буфер обмена
Vim использует специальный внутренний буфер обмена для копирования и вставки текста, он никак не связан с системным. Постоянная проблема пользователей Vim в графическом интерфейсе, это невозможность что-либо скопировать непосредственно из визуального режима Vim в системный буфер обмена. Если окно редактора пусто, нет никаких дополнительных настроек или плагинов, можно просто копировать текст из терминала, но если запустить vim в tmux или screen, то тут уже возникнет проблема. Она решается. В Vim существуют специальные регистры для системного буфера обмена, это + и *. К ним можно получить доступ с помощью клавиши «.
Но сначала надо убедится, что ваша версия Vim поддерживает работу с системным буфером обмена. Для этого выполните:
vim —version | grep clipboard
Если вы видите надпись +clipboard, значит всё хорошо. В противном случае надо искать другую версию vim. В Ubuntu или Debian для поддержки буфера обмена можно установить пакет vim-gtk:
sudo apt install vim-gtk
Теперь, когда вы нажмете «+y в визуальном режиме, выделенный текст будет скопирован в системный буфер обмена, а при нажатии «+p в обычном режиме, содержимое буфера обмена будет вставлено в позицию курсора. Для большего удобства можно добавить горячие клавиши:
inoremap <C-v> <ESC>»+pa vnoremap <C-c> «+y vnoremap <C-d> «+d
Теперь чтобы вставить из буфера vim будет достаточно нажать Ctrl+V, а для копирования в буфер обмена системы — Ctrl+C.
7. Настройка поиска
Давайте немного настроим поиск. Для того чтобы игнорировать регистр при поиске добавьте в конфигурационный файл:
set ignorecase set smartcase
Подсвечивать результаты поиска:

Чтобы программа подсказывала первое вхождение при вводе шаблона поиска добавьте:
8. Команды
Для сохранения, открытия нового файла в программе и выполнения многих других операций мы вводим команды. Но кроме предустановленных команд вы можете добавлять свои. Для этого используется такая конструкция:
command опции имя действие
В качестве действия может быть указано выполнение какой-либо команды, нажатие клавиш, как в случае с привязками или вызов какой-либо функции. Это очень обширная тема, поэтому я не буду трогать её в этой статье.
Добавьте такую строчку чтобы с помощью команды :W можно было сохранить файл, если он открыт не через sudo:
command! W execute ‘w !sudo tee % > /dev/null’ <bar> edit!
9. Плагины
Для Vim существует огромное количество различных плагинов и начиная с восьмой версии появилась своя система управления пакетами. Все пакеты должны располагаться в папке
/.vim, подпапке pack/vendor/start или pack/vendor/opt. Файлы из подпапки start загружаются автоматически при старте программы, и из opt надо подгружать вручную.
Например, давайте установим такой популярный плагин, как NerdTree. Для этого просто склонируйте его с GitHub в эту папку:
git clone https://github.com/preservim/nerdtree.git
После этого разработчики рекомендуют выполнить такую команду, чтобы загрузить старицы справки:
vim -u NONE -c «helptags
/.vim/pack/vendor/start/nerdtree/doc» -c q
После этого вы можете запустить программу и набрать такую команду для активации панели выбора файлов:

Можно добавить горячую клавишу на открытие панели, для этого добавьте в конфигурационный файл:
nmap <F6> :NERDTreeToggle<CR>
Установим для примера ещё один плагин, Vim , который позволяет выполнять unix команды прямо в командной строке редактора:
git clone https://tpope.io/vim/eunuch.git
vim -u NONE -c «helptags
/.vim/pack/vendor/start/eunuch/doc» -c q
Перезагрузите Vim и вы сможете пользоваться и этим плагином. Вообще, вы можете найти подробную инструкцию по установке любого нужного вам плагина на GitHub странице самого плагина.
10. Кодировка
Часто при открытии в Vim тестовых файлов с кириллическими символами, те отображаются неверно. Чтобы они отображались как надо следует выбрать кодировку UTF-8 по умолчанию:
Также можно установить стандарт использования символов переноса строки в файлах:
В данном случае на первом месте находится вариант Unix, где для переноса строки используется только символ \n.
Выводы
В этой статье я постарался детально разобрать как выполняется настройка Vim. Вы узнали о базовых переменных, которые надо установить чтобы изменить внешний вид, о привязках клавиш, а также о том как устанавливать плагины. К тому же у нас получился такой файл
«Табы и пробелы set expandtab set smarttab set tabstop=4 set softtabstop=4 set shiftwidth=4 «Нумерация строк и отступ set number set foldcolumn=2 «Цветовая схема colorscheme delek syntax on «Без звука set noerrorbells set novisualbell «Мышь set mouse=a «Привязки let mapleader = «,» nmap <leader>w :w!<CR> map <space> / map <C-space> ? map <C-j> <C-W>j map <C-k> <C-W>k map <C-h> <C-W>h map <C-l> <C-W>l map <leader>ss :setlocal spell!<CR> inoremap <C-v> <ESC>»+pa vnoremap <C-c> «+y vnoremap <C-d> «+d «Поиск set ignorecase set smartcase set hlsearch set incsearch «Выход с sudo command! W execute ‘w !sudo tee % > /dev/null’ <bar> edit! «Кодировка set encoding=utf8 «Тип переноса set ffs=unix,dos,mac
Даже этот небольшой конфигурационный файл уже может сильно помочь вам в работе, а дальше останется только расширять его дополнительными командами и привязками клавиш. А какие команды и привязки используете вы? Какие плагины? Поделитесь в комментариях!