Как сохранить текстовый блок в визуальном режиме в файл в 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 '). Клиент ")...