перемістити виділення в окремий файл


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

Відповіді:


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

Ваше припущення правильне. Це добре виглядає, я йду на тестування. Чи можете ви пояснити 2. трохи більше? Я не дуже знайомий з діапазонами. EDIT: Якщо я спробую це у другому рядку, він записує перший рядок в інший файл, а не другий рядок.
greg0ire

@ greg0ire У мене це трохи відстало, я редагую, щоб краще пояснити
embedded.kyle

Я додав приклад, щоб зробити своє питання зрозумілішим.
greg0ire

@ greg0ire Я виправив свою відповідь. Це ще два кроки. Перші копіює і пише. Другий видаляється.
embedded.kyle

1
Приємне рішення! Ви також можете написати це як '<,'>d | new | 0put "для наочності.
атрип

1

На основі відповіді @ embedded.kyle і цього запитання , я закінчив цей один вкладиш, щоб додати виділення до файлу та видалити з поточного файлу. Вибравши рядки з Shift+V, натисніть :і запустіть:

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

Перша частина додає вибрані рядки. Друга команда переходить у звичайний режим і працює gvdдля вибору останнього вибору, а потім видаляє.


0

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

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

Щоб знову закрити поділ, передайте розріз, який ви хочете закрити :q.


1
На даний момент у мене є 4 кроки: вибрати, записати, вибрати, видалити. З вашим методом у мене є 6 кроків: виберіть, видаліть, розділіть, вставити, записати, закрити. Я попросив щось більш ефективне: P
greg0ire

Що ж, якщо ви :xзамість цього передасте розділення , ви можете поєднати написання та закриття в один і зробити це п'ять кроків. : P
Xyon

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