การทำซ้ำอักขระในโหมดแทรก 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
"<Co> ใช้เพื่อออกคำสั่งปกติโดยไม่ออกจากโหมด INSERT" ชนะรางวัลที่ไม่น่าเชื่อว่าฉันไม่เคยรู้มาก่อนเกี่ยวกับรางวัลนี้!
Stabledog

11
<C-o>คือชวเลข+Ctrl o
Shaun Luttin

3
นอกจากนี้ยังมี:normalคำสั่งที่ให้คุณออกคำสั่งได้จากพรอมต์คำสั่ง มีประโยชน์บ้างครั้งคราว
Mark Reed

157

Escnic Esc Esc.

เช่นออกจะEsc4iJEsc EscJJJJ


3
น่าเสียดายที่ใช้ไม่ได้กับเสียงเรียกเข้าของฉันเว้นแต่คุณจะหนีกลับสู่โหมดปกติ
Cthutu

5
แต่นี่คือคำตอบที่ดีที่สุดใน "วิธีที่เป็นกลุ่ม"
Drasill

1
ฉันมักจะพบว่าตนเองกลับไปที่โหมดแทรกเมื่อฉันกด i ดังนั้นฉันจะใส่อักขระเท่านั้น ฉันจะทำงานนี้ได้อย่างไร
Severo Raz

1
นี่คือลำดับที่แน่นอนของคำสั่ง OP ต้องการที่จะหลีกเลี่ยง
Kenny Evitt

1
นี่อาจไม่ใช่คำตอบของคำถามที่ถาม แต่เป็นวิธีที่น่าสนใจและเป็นคำตอบสำหรับคำถามที่ฉันกำลังมองหา
Michael Leonard

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


ดูเหมือนว่าคำตอบ
mkobit

มันไม่ซ้ำกันแน่นอน อีกอันหนึ่งไม่ได้ผลสำหรับฉัน ที่นี่ฉันรู้ว่าฉันต้องกดEscสองครั้งหลังจากนั้น ขอบคุณ @prashant
Sridhar Sarnobat

7

มีวิธีอื่นอีกมากมาย แต่ AFAIK วิธีที่คุณอธิบายนั้นสั้นที่สุด ในกลุ่มคุณส่วนใหญ่ควรจะใช้เวลาของคุณในโหมดคำสั่งดังนั้นการกดแป้นเพียง 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>

มันไม่ได้ผลสำหรับฉัน แต่ขอบคุณสำหรับคำตอบ ความรู้เกี่ยวกับภาษาการเขียนโปรแกรมที่เป็นกลุ่มของฉันไม่ดีพอที่จะคิดออกว่าทำไม
Cthutu

6

คุณบอกว่ามันจะ 'ดี' ที่จะยังคงอยู่ในโหมด 'แทรก' อย่างไรก็ตามในโหมดคำสั่งวิธีการต่อไปนี้จะหลีกเลี่ยงที่สองของคุณ ESC : -

แม้ว่าฉันจะรู้ว่าโพสต์นี้เก่า แต่น่าเสียดายที่พลาดตัวเลือก 'ตัด / คัดลอกและวาง' ที่ชัดเจน ...

x ...ตัด

80 ... จำนวนสำเนา

p วาง

หมายเหตุ: นี่คล้ายกับวิธีที่ Martin Beckett แนะนำ แต่ฉันได้รับความล่าช้าเมื่อออกคำสั่งนั้นอาจเป็นเพราะมันสลับโหมดหลายครั้งคำสั่งนี้จะทำงานทันที


1
ฉันต้องใช้v yเพื่อเข้าสู่โหมดภาพแล้วงัดแล้ว80 pวางมัน 80 ครั้ง ฉันทำบางสิ่งหายไปหรือคุณลืมขั้นตอนหนึ่งหรือไม่?
alexanderbird

เห็นแล้วฉันควรใช้ '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. เปิดใช้งานโหมด INSERT
  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.