Як вставити повторюваний текст із незначною різницею у vim?


11

Я хочу вставити текст так:

similar text wordA similar text ...
similar text wordB similar text ...
similar text wordC similar text ...

Я знаю, що я можу вставити текст багато разів, а потім використати підстановку, щоб змінити одне слово для кожного рядка, проте я все ще вважаю цей метод дуже незручним.

Чи є спосіб зберегти слово або список слів у "змінній", а потім використовувати цю змінну для створення аналогічного тексту?


EDIT Я створив щось незрозуміле в оригінальному запитанні, насправді я намагаюся зробити кілька подібних визначень функцій, тому wordA wordB... може з’являтися багато разів у кожному клоні тексту, а текст може містити багато рядків. візерунок точно такий:

similar_text1 wordA similar_text2 wordA similar_text3 ...
similar_text1 wordB similar_text2 wordB similar_text3 ...
similar_text1 wordC similar_text2 wordC similar_text3 ...

(текст може містити нові рядки, а словоA, wordB ... може існувати багато разів)


2-е редагування "схожий_текст" частини можуть бути різними щоразу, коли я виконую таку роботу, тому рішення для цієї роботи краще бути багаторазовим. Тому що я намагаюся зробити дуже схожі визначення функцій, або рядок для таблиці відображення функцій.

Прочитавши відповіді та певну практику, я вважаю, що зручніше розглядати цю роботу як якусь заміну, тому що окремо "part1", "part2" ... "partN", яка може містити нові рядки, важко написати, тому пишіть спочатку шаблон:

similar_text1 $WORD similar_text2 $WORD similar_text3 ...
(text may contain <ENTER>, make sure $WORD not exist in "similar_text" parts )

Тоді спроба поставити клони тексту, але замінити $ WORD на список слів є більш прямим мисленням.

Тож, здається, моя проблема змінилася на те, як "багато разів клонувати текстовий блок, але кожен раз замінюючи в ньому ключове слово словом зі списку?"


Саме тому регістри використовуються для. Ви можете витягнути (скопіювати) текст до реєстру, а потім використовувати його. Макроси можна використовувати для виконання подібних, а також повторюваних завдань.
SibiCoder

Відповіді:


7

Ви можете використовувати таку функцію:

function! GenerateLines()
    let firstpart="similar text part 1"
    let secondpart="similar text part 2"

    let words=["wordA","wordB","wordC","wordD","wordE"]

    for word in words
        let line = firstpart . word . secondpart
        call append(line('.')+1, line)
        normal j
    endfor
endfunction

У змінні firstpartі secondpartпомістіть текст для повторення перед і після слів, а в список wordsпомістіть слова, які слід змінити.

Тоді цикл створить вміст рядка для кожного слова списку, вставить рядок у буфер і перейде до цього нового рядка.

Ви можете просто викликати функцію: call GenerateLines().


Редагування Для спрощення маніпуляцій ви також можете передавати різні частини як аргументи, функція повинна виглядати так:

function! GenerateLines(firstpart, secondpart, words)
    for word in a:words
        call append(line('.')+1, a:firstpart . word . a:secondpart)
        normal j
    endfor
endfunction

І ви можете назвати це так:

call GenerateLines("first part", "second part", ["wordA","wordB","wordC","wordD","wordE"])

Ви можете уникнути циклу за допомогою call map(a:words, 'a:firstpart . v:val . a:secondpart')та call append(line('.'), a:words).
Антоній

Оскільки я часто редагую такі типи з дуже довгими "firstpart" і "secondpart", навіть "3rdpart", і ці частини можуть містити нові рядки, здається, що це занадто довго, щоб набрати стільки в командному режимі, тому, можливо, це більш зручно забирати текст у регістри, а потім використовувати функції для створення тексту з регістрів?
social_loser

Я редагував питання, воно сильно змінюється, вибачте за незручності.
social_loser

5

Моя стратегія в таких випадках буде різною, але вона часто дотримується наступних кроків:

  1. Напишіть унікальні слова (слова), напр

    wordA
    wordB
    ...
    wordK
    
  2. Або

    а) здійснити пошук та заміну, напр

    :%s/\w\+/similar text \0 similar text .../
    

    б) або використовувати режим візуального блоку, див :h blockwise-visual. Зокрема, я б вибрав слова і використовую, Iщоб вставити подібний текст спереду або Aдодати подібний текст після.

Я заперечую, що ця стратегія має сенс, коли ви робите подібне завдання редагування порівняно рідко. Однак, якщо вам здається, що це потрібно робити часто, вам слід дотримуватися пропозиції @ statox з функцією, яка розширює список слів.


Я думаю, що рішення залежить від того, звідки походить список слів. Якщо це з файлу, то :readподальше заміщення має багато сенсу.
Антоній

ваше рішення легко зробити, і вирішити проблему, яку я задав в оригінальному запитанні, легко. Однак у моєму початковому дописі є деякі помилки, я зробив 2 редагування, і це дуже змінилося, дякую за відповідь, вибачте за мою зміну та погану англійську мову :)
social_loser

@social_loser ви можете адаптувати це рішення, скориставшись "\ r", щоб відстояти новий рядок у замінній частині заміни
frangio

2

Я заперечу, що це робота для візуального блоку ( Ctrl+ v). Спочатку я б написав усі виразні слова:

wordA
wordB
wordC
wordD
wordE

Починаючи з першого курсору, wя б тоді виконав:

<c-v>5j$yA <esc>pA <esc>p

Я можу контролювати кількість потрібних стовпців, натискаючи A <esc>pстільки разів, скільки мені потрібно. Припустимо, що мені були потрібні три стовпчики так, як показана команда вище. Тепер ми маємо це:

wordA wordA wordA
wordB wordB wordB
wordC wordC wordC
wordD wordD wordD
wordE wordE wordE

А курсор знаходиться на початку 3-го wordAв першому рядку. Далі я б заблокував вибір стовпця пробілів між стовпцями, що йдуть назад, і додавши текст між ними. Від поточного місця розташування курсору:

h<c-v>5jI similar text 3<esc>

Це призводить до (% відмічає позицію курсора):

wordA wordA%similar text 3 wordA
wordB wordB similar text 3 wordB
wordC wordC similar text 3 wordC
wordD wordD similar text 3 wordD
wordE wordE similar text 3 wordE

Повторіть наступний стовпець:

bh<c-v>5jI similar text 2<esc>

І останній / перший (той, що знаходиться зліва) стовпчик:

b<c-v>5jIsimilar text 1 <esc>

Нарешті в результаті:

similar text 1 wordA similar text 2 wordA similar text 3 wordA
similar text 1 wordB similar text 2 wordB similar text 3 wordB
similar text 1 wordC similar text 2 wordC similar text 3 wordC
similar text 1 wordD similar text 2 wordD similar text 3 wordD
similar text 1 wordE similar text 2 wordE similar text 3 wordE

Оновлення: додано скріншот

введіть тут опис зображення


Здається, це дуже багато набору тексту, але насправді дуже легко звикнути. Він надає вам свободу змінювати кількість слів, кількість стовпців і навіть інтервали між стовпцями.

Недолік полягає в тому, що вам потрібно знати кількість виразних слів, які ви використовуєте. У 5всіх командах, описаних вище, у мене є жорсткий код, оскільки це кількість рядків, над якими працюють команди.

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

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