Łączenie sekwencji poleceń w celu powtórzenia (.)

10

Rozważać:

apple
pear

Umieść kursor w pierwszym wierszu i wpisz Yp, tworząc:

apple
apple
pear

Umieść kursor na pearlinii i wpisz, .aby powtórzyć ostatnie polecenie. Powtarza to tylko p(a nie kombinację Yp), tworząc:

apple
apple
pear
apple

Chciałbym opowiedzieć .o powtórzeniu ostatnich N poleceń. Coś jak 2.powtórzyć kombinację, Ypaby uzyskać:

apple
apple
pear
pear

Ofc to nie zadziała - powtarza pdwa razy. Pomysł polegałby jednak na „powtórzeniu sekwencji ostatnich 2 poleceń”.

Wiem, że mogę qnagrywać sekwencje poleceń i powtarzać je @@, ale to rozwiązanie nie jest idealne, ponieważ wymaga planowania od zawsze, podczas gdy w praktyce często nie zdajesz sobie sprawy, że musisz coś powtórzyć zrobiłeś to.

Czy jest jakiś sposób na osiągnięcie tego, czego chcę?

Nagroda pocieszenia: Jeśli powyższe nie jest możliwe, czy istnieje sposób na powtórzenie ostatniego odtwarzania makra? Na przykład, jeśli wpisałem, @@aby odtworzyć moje ostatnie makro, chciałbym, aby kolejne .były równoważne z @@ponownym wpisaniem - co nie jest (np. Jeśli wynik @@zależy od linii, na której jesteś)

Jonasz
źródło
Nie znam rozwiązania dla pierwszej części problemu, ale w drugiej części możesz wypróbować następujące mapowanie: Aby nno <silent> @@ @@:sil! call repeat#set('@@', v:count1)<CR>jednak działało, musisz zainstalować tę wtyczkę: github.com/tpope/vim-repeat
user9433424

Odpowiedzi:

4

Vim przechowuje tylko ostatnie wykonane polecenie i tylko to jest powtarzane przez .; moim zdaniem wszystko inne byłoby trudne do opanowania.

Jeśli czujesz potrzebę powtórzenia Ypkombinacji jako pojedynczego elementu, musisz zrobić to jedno polecenie. Wtyczka repeat.vim Tima Pope'a pozwala to zrobić z łatwością dla niestandardowych mapowań. Oczywiście, jeśli wybierzesz krótki klawisz [sekwencję] do mapowania, możesz po prostu szybko go wpisać (zamiast .), a nawet uniknąć integracji z powtórzeniem. Vim.

BTW, moja wtyczka LineJuggler zapewnia ]dmapowanie w celu zduplikowania bieżącej linii i obsługuje powtarzanie za pośrednictwem repeat.vim.

Ingo Karkat
źródło
2

W Ypjedyną „zmianą” do powtórzenia jest p. Jedynym sposobem, w jaki wiem, aby zmienić zachowanie .w trybie normalnym, jest dodanie ydo cpoptionsopcji:

set cpoptions+=y

co pozwala powtórzyć ostatni szarpnięcie, a także ostatnią zmianę.

Ale to nic nie zmienia w twoim problemie, ponieważ Ypwciąż są dwa polecenia: szarpnięcie, po którym następuje zmiana.

Nie sądzę, że możesz dostać to, co chcesz bez skromnych skryptów. Czy rzuciłeś okiem na sekcję skryptów vim.org ?

romainl
źródło
1

Często używam mapdo osiągnięcia tego efektu. Na przykład:

map <F12> Yp

Następnie F12kilkakrotne naciśnięcie spowoduje wykonanie YpYpYpitd. Jeśli chcesz przejść do następnego wiersza po każdej wklejaniu, zamapuj Yp+zamiast niego klawisz .

użytkownik112358
źródło
1

Niezwykłe urządzenie, jakim jest wtyczka RepeatLast (przez nasz własny @joeytwiddle ), zapewnia właśnie tę funkcjonalność, dzięki bezbożnej metodzie rejestrowania wszystkiego, co robisz jako makro.

To zapewnia szereg nowych odwzorowań, ale jeśli mam poprawnie czytać dokumentację, aby wykonać można opisać można użyć sekwencji poleceń (zakładając używasz domyślnego edycje <leader>z \):

  • YpYank i wstaw / wklej linię apple,
  • jPrzesuń w dół linii, aby kursor był teraz na pearlinii,
  • \Dzapomnij o jrozkazie,
  • 2\.Powtórz dwa polecenia Yip
Bogaty
źródło
Rzeczywiście, bezbożna! Ale doceniam ambicje.
Jonasz