vim에 약간의 차이가있는 반복적 인 텍스트를 삽입하는 방법은 무엇입니까?


11

다음과 같은 텍스트를 삽입하고 싶습니다.

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

텍스트를 여러 번 붙여 넣은 다음 대체를 사용하여 각 줄의 단일 단어를 변경할 수 있지만 여전히이 방법이 매우 불편하다는 것을 알고 있습니다.

단어 또는 단어 목록을 "변수"에 저장 한 다음이 변수를 사용하여 유사한 텍스트를 생성하는 방법이 있습니까?


편집 원래 질문에서 분명하지 않은 것을 만들었습니다. 사실 매우 비슷한 함수 정의를 만들려고합니다. 따라서 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 ...

(텍스트에는 줄 바꾸기가 포함될 수 있으며 wordA, wordB ...는 여러 번 존재할 수 있습니다)


두 번째 편집 "similar_text"부분은 내가 그런 작업을 수행 할 때마다 다를 수 있으므로이 작업에 대한 솔루션을 재사용하는 것이 좋습니다. 매우 유사한 함수 정의 또는 문자열 대 함수 매핑 테이블을 만들려고하기 때문에.

답변과 연습을 읽은 후에는이 작업을 대체 작업으로 생각하는 것이 더 편리하다는 것을 알았습니다. 개행을 포함 할 수있는 별도의 "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

변수에서 firstpartsecondpart이전과 단어 후 목록에 repeate에 텍스트를 넣어 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)있습니다.
Antony

매우 긴 "firstpart"및 "secondpart", 심지어 "thirdpart"를 사용하여 이러한 종류의 편집 작업을 자주 수행하므로 이러한 부분에는 줄 바꿈이 포함될 수 있으므로 명령 모드에서 많이 입력하기에는 너무 길어서 더 편리합니다. 레지스터에 텍스트를 넣은 다음 함수를 사용하여 레지스터에서 텍스트를 생성합니까?
social_loser

질문을 편집했는데 많이 바뀌 었습니다. 불편을 끼쳐 드려 죄송합니다.
social_loser

5

이러한 경우 나의 전략은 다양하지만 종종 다음 단계를 따릅니다.

  1. 고유 한 단어를 작성하십시오. 예 :

    wordA
    wordB
    ...
    wordK
    
  2. 어느 한 쪽

    a) 검색 및 교체

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

    b) 또는 시각적 차단 모드를 사용하십시오 (참조) :h blockwise-visual. 특히 단어를 선택하고 I비슷한 텍스트를 앞에 삽입하거나 A비슷한 텍스트를 추가하는 데 사용합니다.

이런 종류의 편집 작업을 비교적 드물게 수행 할 때는이 전략이 의미가 있다고 주장합니다. 그러나이 작업을 자주 수행해야하는 경우 단어 목록을 확장하는 함수로 @statox의 제안을 따라야합니다.


해결책은 단어 목록의 출처에 달려 있다고 생각합니다. 파일에서 가져온 것이면 :read대체가 의미가 있습니다.
Antony

귀하의 솔루션은 쉽게 수행 할 수 있으며 원래 질문에서 쉽게 제기 한 문제를 해결합니다. 그러나 내 원래 게시물에 몇 가지 실수가 있습니다, 나는 2 편집을하고 그것은 많이 변경, 답변 주셔서 감사합니다, 내 변경 및 나쁜 영어에 대한 죄송합니다 :)
social_loser

@social_loser 대체의 대체 부분에서 개행을 나타
내기

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

그리고 커서는 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는 명령에 운영되는 행 수 있기 때문에 위의 모든 명령에 하드 코딩.

디버깅 메모 : 모든 명령은 일반 모드에서 시작 및 종료됩니다. 명령 끝에서 시각적 또는 삽입 모드에있는 경우 잘못된 작업이 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.