переместить выделение в отдельный файл

12

Как с помощью vim переместить фрагмент текста в новый файл? На данный момент я делаю это:

  • выберите текст
  • использование :w new_file
  • выберите текст снова
  • удалить текст

Есть ли более эффективный способ сделать это?

Перед

a.txt

sometext
some other text
some other other text
end

После

a.txt

sometext
end

b.txt

some other text
some other other text
greg0ire
источник

Ответы:

4

Как насчет этих пользовательских команд:

:command! -bang -range -nargs=1 -complete=file MoveWrite  <line1>,<line2>write<bang> <args> | <line1>,<line2>delete _
:command! -bang -range -nargs=1 -complete=file MoveAppend <line1>,<line2>write<bang> >> <args> | <line1>,<line2>delete _
Инго Каркат
источник
1
Это очень уродливо, но эй, похоже, делает за один шаг именно то, что я просил (я пытался). +1 и принято. Я искал собственный способ сделать это быстро, но так как его, кажется, нет, ваш будет хорошо. Благодарность!
greg0ire
1
Красота в глазах смотрящего. Я нахожу это довольно элегантным; вам нужно всего лишь набрать его один раз (в ваш .vimrc).
Инго Каркат
Вы правы, "очень некрасиво", должно быть "очень незнакомо". Ваша команда очень удобна, и я думаю, что я определенно собираюсь вырезать ее в моем .vimrc
greg0ire
8

Под «перемещением фрагмента текста в новый файл» я предполагаю, что вы имеете в виду вырезать этот фрагмент текста из текущего файла и создать новый файл, содержащий только этот текст.

Различные примеры:

  • :1,1 w new_file создать новый файл, содержащий только текст из строки № 1
  • :5,50 w newfile создать новый файл, содержащий текст из строки 5 в строку 50
  • :'a,'b w newfileсоздать новый файл, содержащий текст от метки aк меткеb
    • установить свои оценки с помощью maи mbгде угодно

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

Это можно сделать, используя тот же диапазон и dкоманду:

  • :5,50 d удалить текст из строки 5 в строку 50
  • :'a,'b dудалить текст с отметки aна отметкуb

Или используя ddдля случая единственной строки.

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

:'<,'>

Который указывает на выделенный текст. Затем вы можете расширить команду до:

:'<,'>w >> old_file

Который будет добавлять текст в существующий файл. Затем удалите, как указано выше.


Один лайнер:

:2,3 d | new +put! "

Разбивка:

  • :2,3 d - удалить строки со 2 по 3
  • | - технически это перенаправляет вывод первой команды на вторую команду, но поскольку первая команда ничего не выводит, мы просто объединяем команды в цепочку
  • new - открывает новый буфер
  • +put! "- поместить содержимое безымянного register ( ") в буфер
    • Функция bang ( !) предназначена для размещения содержимого перед текущей строкой. Это вызывает и пустую строку в конце файла. Без этого в верхней части файла есть пустая строка.
embedded.kyle
источник
Ваше предположение верно. Это выглядит хорошо, я собираюсь проверить. Не могли бы вы объяснить 2. немного больше? Я не очень знаком с диапазонами. РЕДАКТИРОВАТЬ: Если я попробую это во второй строке, он записывает первую строку в другой файл, а не во вторую строку.
greg0ire
@ greg0ire Я получил немного назад, я отредактирую, чтобы лучше объяснить
embedded.kyle
Я добавил пример, чтобы прояснить свой вопрос.
greg0ire
@ greg0ire Я исправил свой ответ. Это еще два шага. Первые копии и пишет. Второй удаляет.
embedded.kyle
1
Отличное решение! Вы также можете написать это '<,'>d | new | 0put "для ясности.
atripes
1

Основываясь на ответе @ embedded.kyle и этих вопросах и ответах , я получил этот вкладыш, чтобы добавить выделение к файлу и удалить из текущего файла. После выбора нескольких строк Shift+Vнажмите :и запустите:

'<,'>w >> test | normal gvd 

Первая часть добавляет выбранные строки. Вторая команда входит в обычный режим и запускается, gvdчтобы выбрать последний выбор, а затем удалить.

jtpereyda
источник
0

Выделите текст в визуальном режиме, затем нажмите, yчтобы «вытащить» его в буфер (копировать) или d«удалить» его в буфер (вырезать).

Затем вы можете :split <new file name>разбить окно vim вверх и нажать, pчтобы вставить в текст. Напишите файл как обычно.

Чтобы снова закрыть разделение, передайте разделение, которое вы хотите закрыть :q.

Xyon
источник
1
У меня есть 4 шага на данный момент: выбрать, написать, выбрать, удалить. С вашим методом у меня есть 6 шагов: выбрать, удалить, разделить, вставить, написать, закрыть. Я попросил что-нибудь более эффективное: P
greg0ire
Что ж, если :xвместо этого вы передадите разделение , вы можете объединить запись и закрытие в одно и сделать это за пять шагов. : P
Xyon
Это лучше, но 5 все еще> 4: P
greg0ire