11

Как с помощью 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

4 ответа4

6

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

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

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

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

Это можно сделать, используя тот же диапазон и команду 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! " - поместить содержимое безымянного регистра (") в буфер
    • Взрыв (!) есть ли так, что содержимое ставится перед текущей строкой. Это вызывает и пустую строку в конце файла. Без этого есть пустая строка в верхней части файла.
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

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

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

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

0

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .