Próbuję zdefiniować makro, które szybko generuje listę losowych słów.
Chcę, aby makro przekształciło to w taką listę
a
b
c
d
e
zaangażowany w to
arezzo
bywords
czars
détente
eyrie
Co mam do tej pory:
- umieść kursor na literze
a
- rozpocznij rejestrowanie makra
qq
a
wejdź w tryb wstawiania<C-x><C-k> - perform dictionary completion on the character before cursor - in this case the letter
a`<C-p>
wybierz ostatni element z wyświetlonej listy ukończeń, w moim systemie jest to słowoarezzo
. (Uwaga:longest
Uwzględniłem w swoim'completeopt'
ustawieniu, które jest wymagane<C-p>
do pracy w ten sposób podczas ukończenia:)'set completeopt=longest,menuone,preview'
.<C-y>
zaakceptować zakończenie^[^[
wyjdź z trybu wstawianiaj
przejdź w dół do następnej linii, gotowy do wykonania tej samej operacji w następnej liniiq
Zatrzymaj nagrywanie
kiedy tworzę makro i wykonuję kroki ręcznie, wszystko działa dobrze, jednak kiedy wykonuję makro, widzę komunikat migający w linii poleceń coś takiego:
skanowanie pliku słownika
i nic się nie dzieje, polecenia j
są uruchamiane tylko w makrze , tzn. kursor przesuwa się w dół linii, ale nie uruchamia się żadne polecenie zakończenia.
Czy można używać uzupełnień w trybie wstawiania w makrze, a jeśli tak, to jak to zrobić?
autocompletion
macro
the_velour_fog
źródło
źródło
<C-p>
kroku ... kiedy to robię w moim vimie, to po prostu daje komunikatback at original
- nie wybiera ostatniego elementu. Użyłem dwa razy klawisza strzałki w górę, aby wybrać ostatnie słowo (moja sprawaazures
), nacisnąłem enter i potemEsc+j+q
.. to działa całkiem dobrze na uruchamianiu makrset completeopt=longest,menuone,preview
jejlongest
opcji, która powoduje<C-p>
natychmiastowe wstawienie. Jeśli usunęlongest
zcompleteopt
łańcucha, otrzymam takie samo zachowanie jak ty. Także tak, klawisze strzałek działały! dzięki (zapomniałem, że można ich użyć do poruszania się po liście ukończenia):set completeopt=
ia<c-x><c-k><esc>j
jako makro.Odpowiedzi:
EDYCJA : Naprawdę jesteś po zakończeniu słownika; aby to zrobić, niekoniecznie potrzebujesz trybu wstawiania (tryb Ctrl + X). Jak odkryłeś, praca z makrami sprawia prawdziwy ból. Poniższego skryptu można użyć do wykonania uzupełniania słownika bez trybu wstawiania, dzięki czemu można łatwo powtórzyć go w makrze.
Dodaj poniższy kod do
.vimrc
pliku, zamknij i ponownie otwórz wszystkie okna vima, aby uzyskać nową funkcję, a następnie nagraj się na przemian naciskając,<C-k>
aby ukończyć ij
przejść do następnego wiersza. Dodałem opcję sprawdzania,longest
a jeśli jest wyłączona, wybiera losowy wpis przy użyciu losowego czasu systemowego. Jeśli znajdzie tęlongest
opcję, ręcznie wyszukuje najdłużej pasujący wpis ze słownika i wstawia go.Jeśli nie podoba Ci się
<C-k>
mapowanie, możesz je zmienić według własnego uznania. Powinien działać z każdym mapowaniem, które lubisz.Ponadto polecenie zwrócenia wyrażenia do oceny mapowania dodaje
\<esc>
znak na końcu, dzięki czemu automatycznie wychodzimy z trybu wstawiania po każdym wstawieniu, oraz znak0cw
z przodu, aby przejść do trybu wstawiania na początku i upewnić się, że zastąpimy całe słowo poprawnie. W zależności od dokładnego zachowania, jakie chcesz (jeśli twoje słowa nie są ładnie na początku każdej linii), możeszbcw
zamiast tego użyć faktycznego początku słowa. Jednak wracając do słów rozpoczynających wiersz, zobaczysz pewne dziwactwa. Prawdopodobnie istnieje bardziej zaawansowane polecenie, aby zignorować zakończenie linii i wykonać oba jednocześnie, ale nie mogłem go znaleźć.Ponadto, nie byłoby trudno rozszerzyć logikę tutaj, aby utworzyć alternatywne odwzorowania (przy użyciu, na przykład, parametrów funkcji), które wykonują dowolną funkcję zapewnianą przez tryb wstawiania. Z przyjemnością pomogę w spełnieniu takich wymagań i zaktualizuję ten skrypt, gdy będę miał czas.
źródło
sleep
polecenia?completeopt
jak opisano w komentarzach (ponownie, nie przeze mnie). edycja : Ups,'longest'
jest wymagany dlactrl-p
kroku: niectrl-y
. Nadal kroki opisane przez pracę pytanie-pytającego dla mnievim -Nu NONE
zcompleteopt
edycji.