Как сохранить текстовый блок в визуальном режиме в файл в Vim?
Название очень наглядное. На всякий случай я приведу пример:
START BLOCK1
something
END BLOCK1
START BLOCK2
something
somenthing...
END BLOCK2
- Я выбираю
BLOCK1
в визуальном режиме
- Я дергаю его, нажимая y
- Как сохранить yanked
BLOCK1
в какой-нибудь другой файл?
Ответы
Ответ 1
Выберите текст, который вы хотите сохранить, в визуальном или блочном визуальном режиме линии и
:w new.txt
То, что вы набираете, но на самом деле вы не увидите точно, что выше. Когда вы нажмете :
, вы перейдете в командную строку, которая будет автоматически заполнена информацией о выборе. Это будет выглядеть примерно так:
:'<,'>
Просто продолжайте печатать остальные (w new.txt
), чтобы получить
:'<,'>w new.txt
... и нажмите enter.
Ответ 2
При выборе блока вы можете :'<,'>w other-file
, который будет записывать только выбранный блок в other-file
. Нажатие :
в визуальном режиме должно помещать '<,'>
в командную строку для вас, так что вам действительно нужно только набрать :w other-file
.
Ответ 3
Вероятно, есть более простой способ сделать это, но то, что я сделал бы, это создать новый буфер (или вкладку), а затем вставить его с помощью p
. Вы можете создать новый буфер с помощью :new
или новой вкладки с :tabnew
. Вы можете записать буфер/вкладку в файл, как обычно, с помощью :w filename
.
Ответ 4
Как и @dronus, упомянутые в комментариях, предложения :w !pbcopy
не копируются правильно, поскольку копирует всю строку. Если я хочу скопировать только URL-адрес в строке, я не смогу. Здесь строка, которую вы можете добавить в свой файл .vimrc
, чтобы каждый раз, когда вы нажимали CTRL-C, выбранная строка в вашем vim будет скопирована в буфер обмена:
map <C-c> y:e ~/clipsongzboard<CR>P:w !pbcopy<CR><CR>:bdelete!<CR>
Если вы хотите узнать подробности о том, что это делает, вы можете прочитать об этом на моем блоге
Его та же реализация, что и предлагал @rmeador.
Ответ 5
Подобно решению @songz, я предпочитаю делать это так, используя ": new"
vmap <C-c> y:new ~/.vimbuf<CR>VGp:x<CR>:!pbcopy < ~/.vimbuf<CR><CR>
Ответ 6
Основываясь на варианте @chenkaie, у меня хорошо работает:
let mapleader = "," let g:mapleader = "," vmap <leader>yy:new ~/.vbuf<CR>VGp:x<CR> nmap <leader>p :r ~/.vbuf<CR>
Ответ 7
Vim получить визуальный выбор и сохранить в файл:
function! Get_visual_selection()
#Get the position of left start visual selection
let [line_start, column_start] = getpos("'<")[1:2]
#Get the position of right end visual selection
let [line_end, column_end] = getpos("'>")[1:2]
#gotta catch them all.
let lines = getline(line_start, line_end)
if len(lines) == 0
return ''
endif
#edge cases and cleanup.
let lines[-1] = lines[-1][: column_end - 2]
let lines[0] = lines[0][column_start - 1:]
return join(lines, "\n")
endfunction
function Save_visually_selected_text_to_file()
let selected_text = Get_visual_selection()
call writefile(split(selected_text, "\n"), "/tmp/something.txt")
endfunction
#the c-u does a union of all lines in visual selection.
#this goes in the vimrc
vnoremap <F10> :<c-u>call Save_visually_selected_text_to_file()<cr>
Ответ 8
В дополнение к выбранному ответу выше,
при использовании мыши для выбора (1),
и проблема только копирования целых строк, упомянутых в комментарии
@dronus, когда просто хотел частично скопировать строки (2):
(1) В моей системе DietPi (Raspberry PI), основанной на Debian, vim действует немного по-другому, как и в предпочтительном решении, описанном выше, при использовании мыши для входа и выбора "VISUAL MODE" на моей рабочей станции Ubuntu 16.04. Тогда
но если я наберу ':' для команды, она не будет отображаться с
'<,'>
где я могу просто добавить свой
w new.txt
после этого. Поэтому я просто набрал его сам, и это сработало:
'<,'>w new.txt
и он копирует всю строку (и) восстановленного содержимого в мой файл "new.txt", тогда как "& lt;,", по-видимому, означает "скопировать выбранные строки, а"> "перенаправить его в файл, на который ссылается команда записи.
(2) Что касается проблемы не вставки части строки, как в упомянутом комментарии @dronus comment, это решение (выбранная, первая альтернатива) сработало для меня :
Отредактируйте первый файл, набрав нужный текст. Затем откройте второй файл из vi (: e/path/to/other/file) и вставьте его (набрав p). Сохраните его (как выше ': w new.txt'.
Затем он просто скопирует часть линий, помеченную курсором или "y", с помощью курсоров.
[EDIT] В моей системе Ubuntu: иногда выбор мышью НЕ вводит 'VISUAL MODE' в vim. Затем можно выбрать обычное копирование/вставку с помощью контекстного меню... Я не нашел причину, по которой Ubuntu изменила свое поведение с "поведения клиента" на "хост" (с помощью Ubuntu, размещающего окно ssh bash на my '). Клиент ")...