Як я можу зберегти текстовий блок у візуальному режимі у файл у Vim?


75

Заголовок дуже описовий. Про всяк випадок я наведу приклад:

START BLOCK1
something
END BLOCK1

START BLOCK2
something
somenthing...
END BLOCK2
  1. Я вибираю BLOCK1в візуальному режимі
  2. Я тягну його натисканням y
  3. Як я можу зберегти yanked BLOCK1до якогось іншого файлу?

Відповіді:


133

Виберіть текст, який ви хочете зберегти, у візуальному режимі або в блочному візуальному режимі, та

:w new.txt

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

:'<,'>

Просто продовжуйте вводити решту ( w new.txt), щоб отримати

:'<,'>w new.txt

... і натисніть клавішу Enter.


18
Це не забезпечує очікуваного результату, оскільки він пише лише повні рядки, не враховуючи положення початку та кінця виділення всередині рядка. Будь-яке рішення для цього? В іншому випадку я люблю подавати головне питання ще раз.
дронус

2
@dronus - Я не зовсім розумію, про що ти питаєш. Це робить те, що просив ОП, наскільки я розумію питання.
Ладья

6
Якщо вибрати в будь-якому нелінійному візуальному режимі, :wвсе одно виписуються повні рядки, доторкнуті до вибраного діапазону, але не точний діапазон, що починається або закінчується всередині рядків. Наприклад, якщо ви вибрали вузький стовпець у режимі вибору блоку або частину одного рядка в режимі візуального вибору, повний рядок буде записаний :w, навіть якщо yкопіюватиме правильні частини рядка.
дронус

1
@dronus - Ах, гаразд. Так, це правильно. Але все ж, хоча я не можу говорити за інших, для мене це очікувана поведінка.
Ладья

17

Вибравши блок, ви можете :'<,'>w other-file, що буде писати лише вибраний блок other-file. Натискання :у візуальному режимі вже повинно помістити вас '<,'>у командний рядок, тому вам дійсно потрібно лише вводити текст :w other-file.


3
Vim завжди вибирає цілі лінії для трубопроводів з зовнішньою командою, так що ви можете використовувати команду Unix / Cygwin «вирізати» , щоб вибрати прямокутник колонці N М, з кожного рядка у виборі: :'<,'>w !cut -cN-M > new.txt. Здивований, що відповідь, яка отримала найбільшу кількість голосів, і читачі, здається, не розуміють питання.
мош

7

Можливо, це простіший спосіб зробити це, але я хотів би створити новий буфер (або вкладку), а потім вставити його в p. Ви можете створити новий буфер за допомогою :newабо нову вкладку за допомогою :tabnew. Ви можете записати буфер / вкладку у файл як зазвичай за допомогою :w filename.


2
Обов’язково видаліть зайвий рядок вгорі !! (Вставлення в порожній буфер створює додатковий рядок вгорі або, якщо використовується P, внизу.)
lmat - Відновити Моніку

3

Як @dronus, згаданий у коментарях, :w !pbcopy пропозиції копіюються неправильно, оскільки копіюють весь рядок. Якщо я хочу скопіювати лише URL-адресу в рядок, я не зможу. Ось рядок, який ви можете додати до свого .vimrcфайлу, щоб кожен раз, коли ви натискаєте CTRL-C, вибраний рядок у вашому vim буде скопійований у буфер обміну:

map <C-c> y:e ~/clipsongzboard<CR>P:w !pbcopy<CR><CR>:bdelete!<CR>

Якщо ви хочете прочитати подробиці про те, що це робить, ви можете прочитати про це в моєму блозі

Це те саме, що запропонував @rmeador.


2

Подібно до рішення @ songz, я вважаю за краще робити це так, використовуючи ": new"

vmap <C-c> y:new ~/.vimbuf<CR>VGp:x<CR>:!pbcopy < ~/.vimbuf<CR><CR>

pbcopy, наскільки мені відомо, присутній лише на OSX. Є подібні програми в Linux та інших системах, але вони мають різні назви і працюють по-різному.
Джош Румбут,

Так, це працює, лише якщо pbcopy виконується :) Так що ніякої шкоди взагалі
chenkaie

0

Грунтуючись на варіанті @ chenkaie, мені добре підходить:

let mapleader = "," let g:mapleader = "," vmap <leader>y y:new ~/.vbuf<CR>VGp:x<CR> nmap <leader>p :r ~/.vbuf<CR>


0

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>

0

На додаток до вибраної відповіді вище,

  • при використанні миші для вибору (1),

  • і проблема лише копіювання цілих рядків, згаданих коментарем @dronus до нього, коли просто хотіли частково скопіювати рядки (2):

(1) У моїй системі DietPi (Raspberry PI), що базується на Debian, vim діє трохи інакше, як у бажаному рішенні вище, коли за допомогою миші входить і вибирає „VISUAL MODE“ на моїй робочій станції Ubuntu 16.04. Тоді

  • y, щоб потягнути це

але якщо я введу ':' для команди, вона не відображатиметься з

'<,'>

де я можу просто додати свій

w new.txt

після нього. Тож я просто набрав це сам, і це справді вдалося:

'<,'>w new.txt

і він копіює весь рядок (-и) вирваного вмісту у мій файл 'new.txt', тоді як '<,' здається, означає 'копіювати вибрані рядки та'> 'перенаправляє його у файл посилання на команду write.

(2) І для проблеми не вставки частини рядків, як у згаданому коментарі @dronus , це рішення (вибране, перша альтернатива) спрацювало для мене:

Відредагуйте перший файл, витягуючи потрібний текст. Потім відкрийте другий файл зсередини vi (: e / path / to / other / file) та вставте його (набравши p). Збережіть його (як вище ': w new.txt'.

Потім він просто скопіює частину рядків, позначену мишкою або "y" курсорами.

[EDIT] У моїй системі Ubuntu: Іноді вибір за допомогою миші НЕ вводить „VISUAL MODE“ у vim. Тоді звичайну копію / вставку можна вибрати за допомогою контекстного меню ... Я не знайшов причини, чому Ubuntu змінив свою поведінку з `` поведінки клієнта '' на `` хост '' (з Ubuntu, що розміщує вікно ssh bash на моє '' Клієнт ') ...

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