Powtarzanie znaków w trybie wstawiania VIM


141

Czy istnieje sposób na powtórzenie znaku w trybie wstawiania Vima? Na przykład, powiedzmy, że chciałbym wstawić 80 myślników, w czymś takim jak emacs wpisałbym:

Ctrl+U   8 0 -

Jedynym sposobem, w jaki wiem, jak to zrobić w VIM, jest wyjście z trybu normalnego dla argumentu powtarzania, a następnie powrót do trybu wstawiania, aby wpisać myślnik, a następnie wyjście, aby wstawić rzeczywiste myślniki, ORAZ powrót do trybu wstawiania, aby kontynuować pisanie na maszynie. Sekwencja jest naprawdę długa:

Esc 8 0 a - Esc a

Byłoby miło nie włączać i wyłączać trybów.

Odpowiedzi:


20

Nieco inna wersja rozwiązania 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

Jeśli możesz wyjść z trybu INSERT tylko raz (na koniec), ta sekwencja zadziała:

Ctrl+o 80i- Esc

  • Ctrl+ osłuży do wydawania normalnych poleceń bez wychodzenia z trybu INSERT,
  • 80 powtórzenie,
  • i wstawić,
  • - znak, który chcesz wstawić,
  • Esc aby opuścić tryb INSERT.

Kolejny bez NIGDY nie wychodząc z trybu INSERT:

Ctrl+o :norm 8ia Return


6
Twoja odpowiedź i odpowiedź OP są jedynymi, które działają dla mnie.
twblamer

34
„<Co> służy do wydawania normalnych poleceń bez wychodzenia z trybu INSERT” wygrywa moją nagrodę „Nie mogę uwierzyć, że nigdy nie wiedziałem o-tej-sprawie!
Stabledog

11
<C-o>jest skrótem od Ctrl+ o.
Shaun Luttin,

3
Jest też :normalpolecenie, które pozwala wydać je z wiersza polecenia. Czasami całkiem przydatne.
Mark Reed

157

Escnic Esc Esc.

Np . Esc4iJEsc EscWyjdzie JJJJ.


3
Niestety to nie działa na moim vimie, chyba że powrócisz do normalnego trybu.
Cthutu

5
Ale to najlepsza odpowiedź w „vimowy sposób”.
Drasill

1
Zawsze wracam do trybu wstawiania po naciśnięciu i, więc wstawię tylko ZNAK. Jak mam to zrobić?
Severo Raz

1
To jest dokładna sekwencja poleceń, które chciał wykonać OP uniknąć .
Kenny Evitt

1
Może to nie jest odpowiedź na zadane pytanie, ale jest to vim sposób na zrobienie tego i jest to odpowiedź na pytanie, którego szukałem.
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
To jest dokładna sekwencja poleceń, których OP chciał uniknąć .
Kenny Evitt

13

Przez pojedyncze powtórzenie:

Insert mode
-
Esc
80.

Więcej szczegółów na temat pojedynczego powtórzenia: :help .


Dzięki, ale to rozwiązanie wymaga wyjścia z trybu wstawiania.
Cthutu

8

Możesz też zrobić, Escnihello there EscEsc

gdzie, n to liczba powtórzeń.

na przykład, Esc5ihello there EscEsc


To wygląda na dokładną kopię odpowiedzi Martina Becketta
mkobit

To nie jest dokładny duplikat. Drugi nie działał dla mnie. Tutaj zdałem sobie sprawę, że muszę Escpóźniej dwukrotnie nacisnąć . Dzięki @prashant
Sridhar Sarnobat

7

Jest wiele innych sposobów, ale AFAIK ten, który opisujesz, jest najkrótszy. In vim powinieneś spędzać czas w trybie poleceń, więc wystarczyłoby to 3 naciśnięcia klawiszy + liczba powtórzeń (80-).

Jeśli jednak stwierdzisz, że bardzo często używasz tego powtarzania, możesz stworzyć sobie funkcję lub makro do tego celu; może coś takiego:

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

Dla mnie to nie zadziałało, ale dzięki za odpowiedź. Moja znajomość języka programowania vim nie jest wystarczająco dobra, aby zrozumieć dlaczego.
Cthutu

6

Powiedziałeś, że byłoby „miło” pozostać w trybie „Wstaw”, jednak w trybie poleceń następująca metoda pozwoli uniknąć drugiego ESC : -

Chociaż wiem, że ten post jest stary, szkoda przegapić oczywistą opcję „Wytnij / Kopiuj i Wklej” ...

x ...skaleczenie

80 ...Liczba kopii

p Pasta

Uwaga: Jest to podobne do metody sugerowanej przez Martina Becketta, jednak przy wydawaniu tego polecenia pojawia się opóźnienie, być może dlatego, że kilkakrotnie przełącza tryby, polecenie to jest wykonywane natychmiast.


1
Musiałem użyć, v yaby przejść do trybu wizualnego, następnie szarpnąć, a następnie 80 pwkleić 80 razy. Czy coś mi brakuje, czy zapomniałeś o kroku?
alexanderbird

Dobrze zauważony, powinienem użyć „x” do wycięcia, a następnie wklejenia. Dziękuję, poprawiłem moją odpowiedź.
Inyoka

1
fajnie, ponieważ jest to w rzeczywistości szybsze niż typowa metoda powtarzania.
Pomocniczy

3

Spóźniona odpowiedź, ale warto, jeśli chcesz ręcznie ją spamować, możesz użyć polecenia „powtórz ostatnią komendę”: .

i„Do wyrażenia” 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).

Uważam to za szczególnie przydatne, gdy nie wiem dokładnie, ile powtórzeń chcę zrobić, ale wizualnie wiem, jak długo chcę, aby to trwało. Zasadniczo strzelaj, .aż moje oczy są zadowolone.


3

Dziwię się, że nikt jeszcze tego nie zasugerował:

W trybie wstawiania użyj <C-r>=repeat('-', 80)<CR>

To jest:

  • naciśnij Ctrl-r=
  • W wyświetlonym monicie wprowadź repeat('-', 80)
  • naciśnij Enter

Działa przy powtarzaniu dowolnego znaku dowolną liczbę razy.

Wykorzystuje to więcej naciśnięć klawiszy niż odpowiedź @ romainl, ale w ogóle nie opuszcza trybu wstawiania.


2

Oprócz funkcji pisania, która będzie powtarzała tekst wiele razy, możesz użyć <C-x><C-l>: jeśli masz już linię zawierającą 80 myślników, wpisanie kilku myślników na początku nowej linii, a następnie naciśnięcie <C-x><C-l>zakończy wiersze, które zaczynają się od tych kilku myślników, co spowoduje prawdopodobnie ta linia z 80 myślnikami. W ten sposób pisałem w plikach pomocy poziome linie (78 kresek).


1

Na tak łatwe zadanie abbreviationpowinno wystarczyć . Dodaj następujące elementy do swojego.vimrc

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

i od teraz, kiedy wpiszesz, --a po nim spacja (gdy jesteś w trybie wstawiania), --zostanie automatycznie przekonwertowany na -80 razy.

Korzystając z funkcji repeat możesz powtarzać ciąg dowolną liczbę razy.

Zauważ, że możesz go przetestować przed aktualizacją .vimrc, wchodząc w commandtryb, a następnie wydając następujące polecenie:iab <expr> -- repeat('-', 80)


1

Zrobiłem to bez wychodzenia z trybu INSERT, wykonując poniższe czynności.

  1. Włącz tryb INSERT.
  2. Wpisz jedną myślnik „-”.
  3. Ctrl + O
  4. małe litery `` v '' (aby wejść w -- (insert) VISUAL --tryb)
  5. mała litera „y” (do skopiowania)
  6. Ctrl + O
  7. Wpisz 80
  8. Następnie następuje małe litery „p” (do wklejenia).

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

Spowoduje to wydrukowanie wszystkich kresek poziomo w jednej linii.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.