선택한 텍스트 블록에서 텍스트를 부분적으로 바꾸는 방법은 무엇입니까?


14

내 문제에 대한 좋은 제목을 찾기가 쉽지 않습니다.

텍스트 블록 앞에 삽입하는 것을 알고 있습니다.

Ctrl- v 라인 타입 텍스트 선택I ESC

이제이 작업을 수행하고 싶지만 블록 선택에서 부품을 교체합니다. 현재 두 가지 작업을하고 있습니다.

Ctrl- v 블록 선택 x 시작으로 돌아 가기

위에서 언급 한 순서가 이어졌습니다.

블록을 한 번만 선택하여 ( Ctrl- v) 두 작업을 결합하는 방법이 있습니까?

다음은 작은 예입니다.

다음 블록을 변환하고 싶습니다

1  text
2  text
3  text
4  text
5  text

으로

new text 
new text 
new text 
new text 
new text

하나의 "작업"만하고 있습니다.


1
나는 당신이 원하는 것을 100 % 확신하지 못합니다. 아마도 실제 예가 도움이 될 것입니다 (당신이 가진 것 대 원하는 것). 당신은 GV를 알고 있습니까? 마지막 시각적 선택을 다시 선택하며 여기에 도움이 될 수 있습니다.
PhilippFrank

답변:


21

c블록 대신에 블록을 선택한 후 입력 x하면 선택 블록의 텍스트가 제거되고 삽입 모드로 들어갑니다. 무언가를 입력하고 삽입 모드를 종료하면 모든 줄에서 동일한 변경 사항이 있어야합니다.

시험

Ctrl- v블록 선택 c--무엇이든 삽입-Esc


1
    1
   1 1
  1   1
 1111111
 1     1
 1     1
 1     1

위와 같은 세 가지 다른 블록 문자의 행을 그려보십시오. ^V위를 선택하면 A길이 줄이 다르기 때문에 행의 마지막 문자로 모든 문자 를 변경할 수 없습니다 . 이전 블록 문자는 :s/\%V1/T/g "이전 블록 문자는 '1에서 만든 T입니다. /T/무엇이든 변경하십시오 .

그러나 위에 표시된 마지막 블록 문자를 선택하면 모든 '1'에서 'A'가 A * 지점으로 변경되고 나머지는 그대로 남아 있습니다.

* 가장 짧은 라인.

모든 선을 같은 길이로 만들기 위해 공백으로 채웠습니다. (나는 vim을 처음 사용하므로 더 나은 스크립트를 작성할 수 있다고 확신합니다.)

참고 : A의 피크는 2 번 라인에서 시작되었습니다.

let Maxlen = 0
" Find longest line
for i in range(2,8)
    let t = getline(i)
    let a = strlen(t)
    if a > Maxlen
        Maxlen = a
    endif
endfor

" Append spaces 'til all lines are the same length.
for i in range(2,8)
    let t = getline(i)
    let a = strlen(t)
    if a < Maxlen
        let b = Maxlen - a
        execute "normal!" . i . "gg0" . b . "A "
    endif
endfor

그 후 :s/\%V1/T/g , 행의 마지막 블록 문자에 광고 된대로 작동했습니다.

추신 : 나는 execute위 의 선이 점없이 작동해야 한다는 것을 읽었 지만 나에게는 효과가 없었습니다.


실행 줄은 블록 문자의 i 행 시작으로 이동하고 줄 끝에 b 공백을 추가합니다. 'b'는 현재 줄과 가장 긴 줄 사이의 길이 차이입니다.
Ron
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.