VIM 삽입 모드에서 문자 반복


141

Vim의 삽입 모드에서 문자를 반복하는 방법이 있습니까? 예를 들어, 80 개의 대시를 emacs와 같은 곳에 삽입하고 싶다고 가정하십시오.

Ctrl+U   8 0 -

VIM에서 수행하는 방법을 알고있는 유일한 방법은 반복 인수에 대해 일반 모드를 종료 한 다음 삽입 모드로 돌아가 대시를 입력 한 다음 종료하여 실제 대시를 삽입 한 다음 삽입 모드로 돌아가서 계속 진행하는 것입니다. 타자. 순서는 정말 길다 :

Esc 8 0 a - Esc a

모드를 전환하지 않는 것이 좋습니다.

답변:


20

약간 다른 버전의 Eelvex 솔루션 :

function! Repeat()
    let times = input("Count: ")
    let char  = input("Char: ")
    exe ":normal a" . repeat(char, times)
endfunction

imap <C-u> <C-o>:call Repeat()<cr>

259

INSERT 모드를 한 번만 (끝에) 종료해도 괜찮 으면이 시퀀스가 ​​작동합니다.

Ctrl+o 80i- Esc

  • Ctrl+ o는 INSERT 모드를 벗어나지 않고 일반 명령을 실행하는 데 사용됩니다.
  • 80 반복
  • i 삽입
  • - 삽입하려는 캐릭터
  • Esc INSERT 모드를 종료합니다.

INSERT 모드를 떠나지 않은 다른 하나 :

Ctrl+o :norm 8ia Return


6
귀하의 답변과 OP의 답변만이 저에게 효과적입니다.
twblamer

34
"<삽입>은 INSERT 모드를 종료하지 않고 일반 명령을 내리는 데 사용됩니다."이 상을 믿지 못합니다.
Stabledog

11
<C-o>Ctrl+의 줄임말입니다 o.
Shaun Luttin

3
도 있습니다 :normal명령 프롬프트에서 그들을 발행 할 수 있습니다 명령. 때때로 매우 유용합니다.
Mark Reed

157

Escnic Esc Esc.

Esc4iJEsc Esc를 들어 출력 JJJJ합니다.


3
불행히도 정상 모드로 돌아 가지 않으면 내 vim에서 작동하지 않습니다.
Cthutu

5
그러나 이것은 "vim way"에서 가장 좋은 답입니다.
Drasill

1
나는 i를 누를 때 항상 삽입 모드로 돌아가는 것을 알기 때문에 CHARACTER 만 삽입 할 것입니다. 이 작업을 어떻게합니까?
Severo Raz

1
이것은 OP가 피하고 싶었던 명령의 정확한 순서입니다 .
Kenny Evitt

1
이것은 질문에 대한 답변이 아닐 수도 있지만 그것을 수행하는 가장 좋은 방법이며 내가 찾고있는 질문에 대한 답변입니다.
마이클 레너드

20
<ESC> 
<the number of times you want to repeat>
i 
<the char you want to repeat> 
<ESC>

for example: <ESC>12ia<ESC> will insert 12 a's.

8
이것은 OP가 피하고 싶었던 명령의 정확한 순서입니다 .
Kenny Evitt

13

단일 반복을 통해 :

Insert mode
-
Esc
80.

단일 반복에 대한 자세한 내용 : :help .


감사하지만이 솔루션을 사용하려면 삽입 모드를 종료해야합니다.
Cthutu

8

당신은 또한 할 수 있습니다 Escnihello there EscEsc

여기서 n은 반복 횟수입니다.

예를 들어 Esc5ihello there EscEsc



정확히 중복되지는 않습니다. 다른 하나는 나를 위해 작동하지 않았습니다. 여기서 나는 Esc나중에 두 번 눌러야한다는 것을 깨달았습니다 . 감사합니다 @prashant
Sridhar Sarnobat

7

다른 많은 방법이 있지만 AFAIK는 가장 짧은 방법입니다. vim 에서는 대부분 명령 모드에서 시간을 보내야하므로 3 번의 키 입력 + 반복 횟수 (80i-)입니다.

그러나이 반복적 인 일을 자주 사용한다는 것을 알게되면 그 목적에 맞는 기능이나 매크로를 만들 수 있습니다. 아마도 다음과 같은 것 :

:function Repeat(char)
: let counter = input("How many times?: ")
: call feedkeys("i")
: call feedkeys(repeat(a:char,counter))
:endfunction
:imap <C-U> <ESC>h"ryl :call Repeat(@r)<CR>

그것은 나를 위해 작동하지 않았지만 답변을 주셔서 감사합니다. vim 프로그래밍 언어에 대한 나의 지식은 이유를 파악하기에 충분하지 않습니다.
Cthutu

6

당신은 '삽입'모드로 유지하는 것이 '좋은'것이라고 말했지만, 명령 모드에서는 다음과 같은 방법으로 2 차를 피할 수 있습니다 ESC:-

이 게시물이 오래되었다는 것을 알고 있지만 '잘라 내기 / 복사하여 붙여 넣기'옵션을 놓치는 것은 부끄러운 일입니다 ...

x ...절단

80 ... 매수

p

참고 : 이것은 Martin Beckett이 제안한 방법과 비슷하지만 명령을 실행할 때 지연이 발생합니다. 아마도 여러 번 모드를 전환하기 때문에이 명령이 즉시 실행됩니다.


1
v y비주얼 모드로 들어간 다음, k 다음 80 p80 번 붙여 넣기 위해 사용해야 했습니다. 뭔가 빠졌습니까, 아니면 단계를 잊었습니까?
alexanderbird

잘 보았습니다 .'x '를 사용하여 잘라낸 다음 붙여 넣어야했습니다. 답변을 수정 해 주셔서 감사합니다.
Inyoka

1
실제로 일반적인 반복 방법보다 빠르기 때문에 좋습니다.
Auxiliary

3

답변을 늦었지만 그만한 가치가 있다면, 스팸 메일을 보내려면 "repeat last command"명령을 사용할 수 있습니다. .

i"구문" Esc -i to insert, enter phrase/character, esc to go normal mode

. - Spam till you are satisfied. Will repeatedly input the phrase you typed (it repeats your last command).

반복하고 싶은 반복 횟수를 정확히 모르지만 원하는 시간을 시각적으로 알 때 특히 유용합니다. 기본적으로 .내 눈이 만족할 때 까지 폭파합니다 .


3

아무도 아직 이것을 제안하지 않은 것에 놀랐습니다.

삽입 모드에서 <C-r>=repeat('-', 80)<CR>

그건:

  • 프레스 Ctrl-r=
  • 결과 프롬프트에서 다음을 입력하십시오. repeat('-', 80)
  • 프레스 Enter

모든 문자를 여러 번 반복 할 수 있습니다.

이것은 @romainl의 답변보다 더 많은 키 입력을 사용하지만 삽입 모드를 전혀 떠나지 않습니다.


2

텍스트를 여러 번 반복하는 쓰기 기능 외에도 다음을 사용할 수 있습니다 <C-x><C-l>: 이미 80 개의 대시가 포함 된 줄이있는 경우 새 줄의 시작 부분에 몇 개의 대시를 작성한 다음 키를 누르면 <C-x><C-l>몇 개의 대시로 시작하는 줄이 완성됩니다 80 개의 대시가있는 선일 가능성이 큽니다. 나는 그런 식으로 도움말 파일에 수평선 (78 대시)을 쓰곤했습니다.


1

이러한 쉬운 작업을 abbreviation위해서는 트릭을 수행 해야합니다. 에 다음을 추가하십시오.vimrc

iab <expr> -- repeat('-', 80)

그리고 지금부터 입력 한 --다음 공백이 있으면 (삽입 모드에 --있을 때)이 자동으로 -80 번 으로 변환됩니다 .

이 기능 repeat을 사용 하면 원하는만큼 문자열을 반복 할 수 있습니다.

모드로 .vimrc들어가서 command다음을 발행하여 를 업데이트하기 전에 테스트 할 수 있습니다.:iab <expr> -- repeat('-', 80)


1

아래 단계를 사용하여 INSERT 모드를 종료하지 않고이 작업을 수행했습니다.

  1. 삽입 모드를 활성화하십시오.
  2. 대시 "-"를 입력하십시오.
  3. Ctrl + O
  4. 소문자 'v'( -- (insert) VISUAL --모드 진입 )
  5. 소문자 'y'(복사)
  6. Ctrl + O
  7. 타입 80
  8. 그런 다음 소문자 'p'(붙여 넣기)가 이어집니다.

i - Ctrl+o v y Ctrl+o 80 p

모든 대시를 한 줄에 가로로 인쇄합니다.

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