Lặp lại các ký tự trong chế độ chèn VIM


141

Có cách nào lặp lại một ký tự khi ở chế độ chèn của Vim không? Ví dụ: giả sử tôi muốn chèn 80 dấu gạch ngang, trong một cái gì đó giống như emacs tôi sẽ gõ:

Ctrl+U   8 0 -

Cách duy nhất tôi biết cách thực hiện trong VIM là thoát khỏi chế độ bình thường cho đối số lặp lại, sau đó quay lại chế độ chèn để nhập dấu gạch ngang, sau đó thoát để chèn dấu gạch ngang thực tế, và sau đó quay lại chế độ chèn để tiếp tục đánh máy. Chuỗi này thực sự dài:

Esc 8 0 a - Esc a

Sẽ thật tốt nếu không chuyển đổi trong và ngoài chế độ.

Câu trả lời:


20

Phiên bản hơi khác của giải pháp 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

Nếu bạn đồng ý với chế độ INSERT chỉ một lần (ở cuối), chuỗi này hoạt động:

Ctrl+o 80i- Esc

  • Ctrl+ ođược sử dụng để phát hành các lệnh bình thường mà không cần rời khỏi chế độ INSERT,
  • 80 sự lặp lại,
  • i chèn vào,
  • - ký tự bạn muốn chèn,
  • Esc rời khỏi chế độ INSERT.

Một số khác không có EVER rời khỏi chế độ INSERT:

Ctrl+o :norm 8ia Return


6
Câu trả lời của bạn và câu trả lời của OP là những câu duy nhất phù hợp với tôi.
twblamer

34
"<Co> được sử dụng để phát hành các lệnh thông thường mà không cần rời khỏi chế độ INSERT" sẽ giành giải thưởng không thể tin được của tôi về giải thưởng này!
Stablesog 20/03/2016

11
<C-o>là tốc ký cho Ctrl+ o.
Shaun Luttin

3
Ngoài ra còn có :normallệnh cho phép bạn phát hành chúng từ dấu nhắc lệnh. Thỉnh thoảng khá hữu ích.
Mark Reed

157

Escnic Esc Esc.

Vd Esc4iJEsc Escsẽ xuất JJJJ.


3
Thật không may, nó không hoạt động trên vim của tôi trừ khi bạn thoát trở lại chế độ bình thường.
Cthutu

5
Nhưng đây là câu trả lời tốt nhất theo "cách vim".
Drasill

1
Tôi luôn thấy mình quay trở lại chế độ chèn khi nhấn i, vì vậy sau đó tôi sẽ chỉ chèn CHARACTER. Làm thế nào để tôi làm việc này?
Severo Raz

1
Đây là chuỗi lệnh chính xác mà OP muốn tránh .
Kenny Evitt

1
Đây có thể không phải là câu trả lời cho câu hỏi đã được hỏi, nhưng đó là cách vim để làm điều đó và đó là câu trả lời cho câu hỏi tôi đang tìm kiếm.
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
Đây là chuỗi lệnh chính xác mà OP muốn tránh .
Kenny Evitt

13

Thông qua lặp lại duy nhất:

Insert mode
-
Esc
80.

Thêm chi tiết về lặp lại duy nhất: :help .


Cảm ơn nhưng giải pháp này yêu cầu bạn ra khỏi chế độ chèn.
Cthutu

8

Bạn cũng có thể làm Escnihello there EscEsc

trong đó, n là số lần lặp lại.

ví dụ, Esc5ihello there EscEsc


Điều này trông giống như một bản sao chính xác của câu trả lời
mkobit

Nó không phải là một bản sao chính xác. Một cái khác không làm việc cho tôi. Ở đây tôi nhận ra tôi phải bấm Eschai lần sau đó. Cảm ơn @prashant
Sridhar Sarnobat

7

Có nhiều cách khác nhưng AFAIK cách bạn mô tả là cách ngắn nhất. Trong vim, bạn chủ yếu dành thời gian ở chế độ lệnh, vì vậy đó sẽ chỉ là 3 lần nhấn phím + số lần lặp lại (80i-).

Tuy nhiên, nếu bạn thấy rằng bạn rất thường xuyên sử dụng điều lặp lại này, bạn có thể biến mình thành một hàm hoặc macro cho đến cuối; có thể một cái gì đó như:

: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>

Nó không làm việc cho tôi nhưng cảm ơn vì câu trả lời. Kiến thức của tôi về ngôn ngữ lập trình vim không đủ tốt để tìm hiểu tại sao.
Cthutu

6

Bạn nói rằng sẽ rất tốt khi ở trong chế độ 'Chèn', tuy nhiên trong Chế độ lệnh, phương pháp sau sẽ tránh được lần thứ 2 của bạn ESC: -

Mặc dù tôi biết bài đăng này đã cũ, nhưng có vẻ xấu hổ khi bỏ lỡ tùy chọn 'Cắt / Sao chép và Dán' rõ ràng ...

x ...cắt

80 ...Số bản sao

p Dán

Lưu ý: Điều này tương tự như phương pháp được đề xuất bởi Martin Beckett, tuy nhiên tôi gặp sự chậm trễ khi ban hành lệnh đó, có lẽ vì nó chuyển chế độ nhiều lần, lệnh này thực thi ngay lập tức.


1
Tôi đã phải sử dụng v yđể vào chế độ trực quan, sau đó kéo dài, sau đó 80 pdán nó 80 lần. Tôi đang thiếu một cái gì đó, hoặc bạn đã quên một bước?
alexanderbird

Được phát hiện rõ, tôi nên sử dụng 'x' để cắt, sau đó dán. Cảm ơn bạn tôi đã sửa đổi câu trả lời của tôi.
Inyoka

1
tốt vì điều này thực sự nhanh hơn phương pháp lặp lại thông thường.
Phụ trợ

3

Trả lời muộn nhưng với giá trị của nó, nếu bạn muốn spam nó, bạn có thể sử dụng lệnh "lặp lại lệnh cuối": .

i"Cụm từ" 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).

Tôi thấy điều này đặc biệt hữu ích khi tôi không biết chính xác mình muốn thực hiện bao nhiêu lần lặp lại, nhưng biết trực quan tôi muốn nó kéo dài bao lâu. Về cơ bản vụ nổ .cho đến khi mắt tôi hài lòng.


3

Tôi ngạc nhiên không ai đề nghị điều này chưa:

Trong chế độ Chèn, sử dụng <C-r>=repeat('-', 80)<CR>

Đó là:

  • nhấn Ctrl-r=
  • Tại dấu nhắc kết quả, nhập repeat('-', 80)
  • nhấn Enter

Hoạt động để lặp lại bất kỳ nhân vật bất kỳ số lần.

Điều này sử dụng nhiều tổ hợp phím hơn câu trả lời của @ romainl, nhưng hoàn toàn không rời khỏi chế độ Chèn.


2

Ngoài chức năng viết sẽ lặp lại văn bản nhiều lần, bạn có thể sử dụng <C-x><C-l>: nếu bạn đã có dòng chứa 80 dấu gạch ngang, hãy viết một vài dấu gạch ngang ở đầu dòng mới và sau đó nhấn <C-x><C-l>sẽ hoàn thành các dòng bắt đầu bằng một vài dấu gạch ngang này. có khả năng dòng đó với 80 dấu gạch ngang. Tôi đã từng viết các đường ngang (78 dấu gạch ngang) trong các tệp trợ giúp theo cách như vậy.


1

Đối với một nhiệm vụ dễ dàng như vậy abbreviationnên làm các thủ thuật. Thêm phần sau vào.vimrc

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

và từ bây giờ, khi bạn nhập --theo sau là khoảng trắng (trong khi bạn ở chế độ chèn), --nó sẽ tự động được chuyển đổi thành -80 lần.

Bằng cách sử dụng chức năng, repeatbạn có thể lặp lại chuỗi nhiều lần bạn muốn.

Lưu ý rằng bạn có thể kiểm tra nó trước khi cập nhật .vimrcbằng cách vào commandchế độ sau đó ban hành các thao tác sau:iab <expr> -- repeat('-', 80)


1

Tôi đã làm điều này mà không thoát khỏi chế độ INSERT bằng các bước dưới đây.

  1. Kích hoạt chế độ INSERT.
  2. Nhập một dấu gạch ngang "-".
  3. Ctrl + O
  4. chữ thường 'v' (để vào -- (insert) VISUAL --chế độ)
  5. chữ thường 'y' (để sao chép)
  6. Ctrl + O
  7. Loại 80
  8. Sau đó, tiếp theo là chữ thường 'p' (để dán).

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

Điều này sẽ in tất cả các dấu gạch ngang theo một dòng duy nhất.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.