숭고한 텍스트처럼 Vim 멀티 라인 편집?


133

gvim을 사용하기 시작했고 gvim에서 여러 줄 편집이 어떻게 작동하는지 이해할 수 없습니다.

예를 들면 다음과 같습니다.

원문 :

asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;

ctrl + q, jjjjjj, $ 모든 것이 선택되면 I 키를 눌러 여러 줄 삽입을 수행합니다.

내 의도는 첫 줄과 같이 따옴표를 삽입하고 Esc 키를 누르는 것입니다.

asd "asd asd" asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;

어떻게 된 거예요? 나는 숭고한 텍스트와 비슷한 행동을 기대했습니다.

여기에 이미지 설명을 입력하십시오

그것이 어떻게 작동하는지 모르는 경우 모든 라인에 대해 동작을 반복합니다. 어떻게 그렇게 할 수 있습니까? 그리고 vim은 여기서 무엇을하고 있습니까?


키보드 매크로를 기록하여 첫 번째 줄을 변경 한 다음 다른 모든 줄의 매크로를 재생하십시오.
high5

답변:


215

Windows 호환성 계층을 삭제하여 호의를 베푸십시오.

Visual-Block 모드로 들어가는 일반적인 단축키는 <C-v>입니다.

다른 사람들은 매크로 기록을 다루었습니다. 여기 몇 가지 다른 아이디어가 있습니다.

비주얼 블록 모드 만 사용 합니다.

  1. 두 번째 단어에 커서를 놓습니다.

    asd |a|sd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    
  2. 히트 <C-v>입력 시각 블록 모드 및 아래쪽으로 선택을 확장 :

    asd [a]sd asd asd asd;
    asd [a]sd asd asd asd;
    asd [a]sd asd asd asd;
    asd [a]sd asd asd asd;
    asd [a]sd asd asd asd;
    asd [a]sd asd asd asd;
    asd [a]sd asd asd asd;
    
  3. I"<Esc>얻기 위해 명중 :

    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    
  4. 세 번째 단어의 마지막 문자에 커서를 놓습니다.

    asd "asd as|d| asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    
  5. 히트 <C-v>입력 시각 블록 모드 및 아래쪽으로 선택을 확장 :

    asd "asd as[d] asd asd;
    asd "asd as[d] asd asd;
    asd "asd as[d] asd asd;
    asd "asd as[d] asd asd;
    asd "asd as[d] asd asd;
    asd "asd as[d] asd asd;
    asd "asd as[d] asd asd;
    
  6. A"<Esc>얻기 위해 명중 :

    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    

함께 시각적 블록 모드 Surround.vim .

  1. 두 번째 단어에 커서를 놓습니다.

    asd |a|sd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    
  2. 히트 <C-v>입력 시각 블록 모드 및 하단과 오른쪽으로 선택을 확장 :

    asd [asd asd] asd asd;
    asd [asd asd] asd asd;
    asd [asd asd] asd asd;
    asd [asd asd] asd asd;
    asd [asd asd] asd asd;
    asd [asd asd] asd asd;
    asd [asd asd] asd asd;
    
  3. 히트 S""를 선택을 둘러싸고 :

    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    

함께 시각적 라인 모드 :normal.

  1. V전체 줄을 선택하고 아래쪽으로 확장하려면 누르십시오 .

    [asd asd asd asd asd;]
    [asd asd asd asd asd;]
    [asd asd asd asd asd;]
    [asd asd asd asd asd;]
    [asd asd asd asd asd;]
    [asd asd asd asd asd;]
    [asd asd asd asd asd;]
    
  2. 다음 명령을 실행하십시오 :'<,'>norm ^wi"<C-v><Esc>eea"<CR>.

    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    
    • :norm[al]라인 범위에서 일반 모드 명령 을 실행할 수 있습니다 ( '<,'>부분은 Vim에 의해 자동으로 추가되며 "선택된 영역에서 작동"을 의미합니다)

    • ^ 줄의 첫 번째 문자에 커서를 놓습니다.

    • w 다음 단어로 이동

    • i""커서 앞에 a 를 삽입

    • <C-v><Esc>이 컨텍스트에서 제어 문자를 입력하는 Vim의 방법입니다. 여기에서 삽입 모드 <Esc>를 종료하는 데 사용 됩니다

    • ee 다음 단어의 끝으로 이동

    • a""커서 뒤에 a 를 추가합니다

    • <CR> 명령을 실행

    Surround.vim을 사용하면 위의 명령은

    :'<,'>norm ^wvees"<CR>
    

7
4 단계와 5 단계를 위해 나는 타격 추천 할 것입니다 gv이전 시각적 선택 등을 얻기 위해, 그리고 다음 에 아마, 수평으로 이동합니다 2e. (줄이 많을수록 더 가치 gv가 있습니다!)
joeytwiddle

4
서라운드 sSS"
.vim

1
영상 블록 + Surround.vim의 포인트 3이어야 S"하지s"
zool

1
비주얼 블록 모드 5 단계와 6 단계 대신 세 번째 단어 뒤에 커서를 놓고를 누르십시오 ..
조나스

2
이것은 멋지지만 다른 줄에서 편집하려는 문자가 각 줄에서 동일한 수평 위치에 있고 편집 된 줄이 차례로 올바른 경우에만 작동합니다. 우리는 Vim의 어느 줄에서 편집 모드로 들어가야하는지 체리 피킹 할 수 있습니까? 우리는 할 수 Sublim ...에서 편집 : 사실 두 번째 대답은 내가 찾던입니다
알렉상드르 Bourlier

30

그것들은 위에 주어진 좋은 즉시 사용 가능한 솔루션이지만 Sublime과 같은 여러 커서를 제공하는 플러그인을 사용해 볼 수도 있습니다.

나는 이것이 유망 해 보인다고 생각한다.

한동안 버린 것 같았지만 2014 년에 약간의 기여를했습니다.

흐름에 익숙해지기까지 약간의 시간이 걸렸지 만 상당히 강력합니다 (이것은 상당히 숭고한하지만 여전히 Vim과 같은 모달입니다).

내 경험상 다른 많은 플러그인이 설치되어 있으면 약간의 충돌이 발생할 수 있습니다!

이 기능에 대한 다른 시도가 있습니다.

개선이 진행 중이라면 언제든지 수정하십시오.


github.com/osyo-manga/vim-over 는 현재 가장 활발한 것 같습니다 .
Wernight

훌륭합니다. 제가 찾던 것
Alexandre Bourlier

1
테스트 한 후 대부분 hlissner / VIM-multiedit는 최고의 AFAIAC 보인다
알렉상드르 Bourlier

1
vim-multiple-cursor의 대체품으로 mg979 / vim-visual-multi 를 확인하십시오
Mushex Antaranian

29

Vim에는 몇 가지 방법이 있습니다. Sublime Text와 가장 유사한 것이 무엇인지 모르겠습니다.


첫 번째는 다중 라인 삽입 모드 를 통하는 것 입니다. 첫 번째 줄에서 커서를 두 번째 "a"에 놓고을 Ctrl-V누르고 모든 줄을 선택한 다음을 누르고 I큰 따옴표를 넣습니다. 를 누르면 <esc>모든 라인에서 작업이 반복됩니다.


두 번째는 매크로를 통한 것입니다. 커서를 첫 번째 문자에 놓고로 매크로 기록을 시작하십시오 qa. 을 사용하여 오른쪽으로 이동 하고을 사용 llll하여 삽입 모드로 들어가고 a큰 따옴표를 입력하고 삽입 모드를 종료 한 다음 <home>(또는 동등한 항목) 을 사용하여 행의 처음으로 돌아갑니다 . j한 행 아래로 이동하려면 누릅니다 . 로 녹화를 중지하십시오 q. 그런 다음로 매크로를 재생하십시오 @a. 여러번.


위의 방법 중 어느 것이 당신에게 효과가 있습니까?


15

"global"명령을 사용하면 한 줄에서 여러 줄로 온라인으로 수행 할 수있는 작업을 반복 할 수 있습니다.

:g/<search>/.<your ex command>

예:

:g/foo/.s/bar/baz/g

위의 명령은 foo가있는 모든 줄을 찾고 해당 줄의 모든 줄을 baz로 바꿉니다.

:g/.*/

모든 라인에서 할 것입니다


1
이것은 매우 유용합니다, 나는 그것을 몰랐습니다. 매우 강력하고 영리한 명령 조합으로 보입니다.
0xc0de

편의를 위해 커서 아래에 단어 (또는 시각적으로 선택된 단어)를 가져 와서 교체하라는 메시지를 표시 한 다음 :g여기에 설명 된 명령 을 실행하는 작은 기능을 작성했습니다 . 내가 사용하려면 /gc내가 칠 수 있도록 "확인서"를 요청 y하거나 n각 교체, 또는 a모두를 변경할 수 있습니다.
joeytwiddle

11
Ctrl-v ................ start visual block selection
6j .................... go down 6 lines
I" .................... inserts " at the beginning
<Esc><Esc> ............ finishes start
2fdl. ................. second 'd' l (goes right) . (repeats insertion)

3 단계 I에서 삽입 모드로 들어갈 수 없습니다. 왜 이런 일이 발생하는지 아십니까?
닌자

플러그인없이 vim을로드 vim -u NONE하십시오. 원하는 작업을 다시 수행하십시오 .vim의 동작을 변경하는 맵이나 플러그인 일 수 있습니다.
SergioAraujo

6

나는 무엇 vim을하고 있는지 잘 모르겠지만 흥미로운 효과입니다. 원하는 것을 설명하는 방식은 매크로가 작동하는 방식과 비슷합니다 ( :help macro). 이와 같은 것은 매크로로 원하는 것을 할 것입니다 (정상 모드에서 시작).

  1. qa: 기록 할 매크로를 a기록합니다.
  2. 0w: 0줄의 시작으로, w한 단어로 이동합니다.
  3. i"<Esc>: 삽입 모드로 들어가서 a를 삽입하고 "일반 모드로 돌아갑니다.
  4. 2e: 두 번째 단어의 끝으로 이동합니다.
  5. a"<Esc>다음을 추가합니다 ".
  6. jq 다음 줄로 이동하여 매크로 기록을 종료하십시오.

함께 찍은 : qa0wi"<Esc>2ea"<Esc>

이제로 매크로를 실행하고로 @a마지막 매크로를 반복 할 수 있습니다 @@. 파일의 나머지 부분에 적용하려면 99@a99 줄을 초과하지 않는 것으로 가정하면 매크로 실행이 파일 끝에 도달하면 종료됩니다.

원하는 것을 달성하는 방법은 다음과 같습니다 visual-block-mode(일반 모드에서 시작).

  1. 첫 번째 견적을 원하는 곳으로 이동하십시오.
  2. 를 입력 visual-block-mode하고 영향을 줄 줄을 선택 G하여 파일의 맨 아래로 이동하십시오.
  3. 을 누르십시오 I"<Esc>.
  4. 삽입하려는 다음 지점으로 이동하십시오 ".
  5. 당신은 당신이 방금 한 일을 반복하고 싶을 .것입니다.

4
99 @ a가 필요 없습니다. 파일의 모든 줄에서 매크로를 실행하려면 : % norm! @ㅏ.
Rook

점이 없으면 (명령의 일부가 아닌 문장의 끝일뿐입니다)
Rook

9999@a못생긴 것일 수도 있지만 입력하기가 훨씬 쉽고 :%norm! @a방금 편집 한 줄에서 다시 실행되지 않습니다. 어쨌든 그것을 아는 것이 좋습니다. :)
joeytwiddle

0

내 해결책은 다음 두 가지 매핑을 사용하는 것입니다.

map <leader>n <Esc><Esc>0qq
map <leader>m q:'<,'>-1normal!@q<CR><Down>

그것들을 사용하는 방법 :

  1. 라인을 선택하십시오. 다음 12 줄을 선택하려면 그냥 누르십시오.V12j
  2. 프레스 <leader>n
  3. 회선을 변경하십시오
  4. 정상 모드인지 확인한 다음 <leader>m

다시 편집하기 위해 다시 선택할 필요는 없습니다. 을 누르고 <leader>n수정 한 다음을 눌러 <leader>m적용하십시오.


작동 방식 :

  • <Esc><Esc>0qq 시각적 선택을 종료하고 줄의 시작 부분으로 이동하여 매크로 기록을 시작하십시오.

  • q 매크로 기록을 중지하십시오.

  • :'<,'>-1normal!@q<CR> 시각적 선택의 시작부터 끝 이전 줄까지 각 줄에서 매크로를 재생합니다.

  • <Down> 마지막 줄로 돌아갑니다.


동일한 키를 다른 모드로 매핑 할 수도 있습니다.

vmap <leader>m <Esc><Esc>0qq
nmap <leader>m q:'<,'>-1normal!@q<CR><Down>

이로 인해 다른 편집 기능을 사용할 수 없게됩니다. 회선을 다시 선택해야합니다.

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