VIM挿入モードでの文字の繰り返し


141

Vimの挿入モードで文字を繰り返す方法はありますか?たとえば、emacsのようなものに80個のダッシュを挿入したいとします。

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モードを1回だけ(最後に)終了しても問題がない場合、次のシーケンスが機能します。

Ctrl+o 80i- Esc

  • Ctrl+ oは、INSERTモードを終了せずに通常のコマンドを発行するために使用されます。
  • 80 繰り返し、
  • i 挿入する
  • - 挿入したい文字
  • Esc INSERTモードを終了します。

INSERTモードを終了することのない別のもの:

Ctrl+o :norm 8ia Return


6
あなたの答えとOPの答えは私のために働く唯一のものです。
twblamer 2011

34
「<Co>はINSERTモードを終了せずに通常のコマンドを発行するために使用されます」は、この賞を受賞しました。
ステーブルドッグ2014年

11
<C-o>Ctrl+の省略形ですo
Shaun Luttin、2015

3
:normalコマンドプロンプトからそれらを発行できるコマンドもあります。時々かなり便利です。
マークリード

157

Escnic Esc Esc

例えばEsc4iJEsc Esc出力しますJJJJ


3
残念ながら、通常のモードに戻らない限り、私のvimでは機能しません。
クトゥツ

5
しかし、これは「vimの方法」での最良の答えです。
ドラシル

1
iを押すと、常に挿入モードに戻るので、CHARACTERのみを挿入します。これはどのように機能しますか?
セベロラズ2013

1
これは、OPが避けたいコマンドの正確なシーケンスです。
ケニーエビット2015

1
これは尋ねられた質問への答えではないかもしれませんが、それはそれを行うためのvimの方法であり、私が探していた質問への答えです。
マイケルレナード

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が避けたいコマンドの正確なシーケンスです。
ケニーエビット2015

13

シングルリピートを通じて:

Insert mode
-
Esc
80.

シングルリピートの詳細: :help .


おかげで、このソリューションでは、挿入モードを終了する必要があります。
クトゥツ

8

あなたもできます Escnihello there EscEsc

ここで、nは繰り返しの数です。

例えば、 Esc5ihello there EscEsc



完全に重複しているわけではありません。もう1つはうまくいきませんでした。ここで、Esc後で2回押す必要があることに気付きました。ありがとう@prashant
Sridhar Sarnobat

7

他にも多くの方法がありますが、あなたが説明する方法は最も短い方法です。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プログラミング言語に関する私の知識は、その理由を理解するには不十分です。
クトゥツ

6

「挿入」モードのままにしておくのは「いい」と言っていましたが、コマンドモードでは次の方法で2番目を回避できますESC

私はこの投稿が古いことを知っていますが、明らかな「切り取り/コピーして貼り付け」オプションを見逃すのは残念です...

x ...切る

80 ...部数

p ペースト

注:これは、Martin Beckettによって提案された方法に似ていますが、そのコマンドを発行すると、おそらくモードが数回切り替わるため、このコマンドが即座に実行されるため、遅延が発生します。


1
を使用v yしてビジュアルモードに入り、ヤンクし80 pてから80回貼り付ける必要がありました。何か不足していますか、それともステップを忘れましたか?
アレクサンダーバード2016年

よく見つかる、「x」を使用してカットしてから貼り付けるべきだった。ありがとうございます。
Inyoka

1
これは実際には典型的な繰り返し方法よりも速いのでいいです。
補助

3

遅い答えですが、それだけの価値がある場合は、スパムを送信したい場合は、「最後のコマンドを繰り返す」コマンドを使用できます。 .

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. ダッシュ「-」を1つ入力します。
  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

これにより、すべてのダッシュが水平に1行で印刷されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.