Wybierz element z listy autouzupełniania vima bez wstawiania podziału linii

22

Dość denerwującą cechą vima jest to, że jeśli jesteś w trybie wstawiania i wykonujesz autouzupełnianie (Ctrl-N), naciśnij klawisz strzałki w dół do żądanego elementu i naciśnij klawisz Enter, a następnie wstawi element, ale również wstawi nowy wiersz, który następnie musisz usunąć.

Czy istnieje sposób na wybranie pozycji z listy autouzupełniania bez uzyskiwania dodatkowej niechcianej nowej linii?

Tyler Durden
źródło
1
Nie działa to dla mnie tak ... Wybieram coś, wciskam Enter, a kursor nadal znajduje się w tym samym wierszu.
goldilocks

Odpowiedzi:

37

To zależy od tego, w jakim stanie jest wyskakujące menu (patrz :help popupmenu-completion). Rozumiem z twojego pytania, że ​​jesteś w stanie 2 (odkąd nacisnąłeś klawisze strzałek, aby znaleźć zakończenie). Jednak domyślne zachowanie Enterw stanie 2 polega na wstawieniu uzupełnienia bez znaku nowej linii; to, co opisujesz, to zwykle zachowanie stanu 1 (to znaczy, kiedy używasz Ctrl+ N/ Ctrl+ P.)

Sposobem, który działa konsekwentnie we wszystkich stanach, jest użycie Ctrl+Y . Lubię pamiętać Y jako „tak, zaakceptuj to słowo”. Możliwe jest również, aby po prostu zacząć pisać tekst, który powinien pojawić się po skończonym słowie, chyba że odwzorowałeś rzeczy jak w odpowiedzi geedoubleya.

W tym samym kontekście możesz nacisnąć Ctrl+, Eaby anulować menu i pozostawić tekst taki, jaki był przed jego wywołaniem. Jeśli jesteś przyzwyczajony do parowania Ctrl+ Ei Ctrl+ Yw innych kontekstach (np. Przewijanie w górę lub w dół w trybie normalnym lub wstawianie znaku poniżej lub powyżej kursora w trybie wstawiania), to jeden ze sposobów, aby go tutaj zapamiętać. Wydaje mi się, że można również myśleć o tym jako o „wyjściu” z menu lub podobnym.

Zobacz :help popupmenu-keyswięcej.

echristopherson
źródło
2
Ach, to ma sens. Używam Ctrl-N, aby otworzyć menu rozwijane. Właśnie używałem klawiszy strzałek do poruszania się po rozwijanej liście. Nie wiedziałem, że możesz użyć klawiszy strzałek, aby otworzyć menu rozwijane.
Tyler Durden
Klawisze strzałek nie mogą otworzyć menu rozwijanego w domyślnej konfiguracji. Wyróżnienie, o którym wspomniałem, dotyczyło poruszania się po menu po jego otwarciu.
echristopherson
Z jakiegoś powodu, gdy próbowałem to zrobić za pomocą <kbd> Ctrl </kbd> + <kbd> Y </kbd>, wcięliśmy również linię, co jest niepożądane. Wszelkie przemyślenia, dlaczego tak się stanie?
mpacer,
Nigdy tego nie spotkałem. Być może wynika to z jakiegoś ustawienia wcięcia lub wtyczki, o której zapomniałeś. Chciałbym zapytać na liście mailowej Vima: vim.org/maillist.php .
echristopherson
6

Osobiście korzystam z tego:

inoremap <expr> <TAB> pumvisible() ? "\<C-y>" : "\<CR>"
inoremap <expr> <Esc> pumvisible() ? "\<C-e>" : "\<Esc>"
inoremap <expr> <C-j> pumvisible() ? "\<C-n>" : "\<Down>"
inoremap <expr> <C-k> pumvisible() ? "\<C-p>" : "\<Up>"

Każdy, kto korzysta z wtyczki CtrlP, może uznać to mapowanie za wygodne.

Dmitrii
źródło
3

Wiem, że jest to stare, ale rodzaj poparcia dla odpowiedzi geedoubleya, ponieważ chociaż odpowiedź echristophersona była pouczająca i niesamowita, jeśli ktoś chce szybkiego i brudnego rozwiązania:

inoremap <expr> <cr> ((pumvisible())?("\<C-y>"):("\<cr>"))
Sójka
źródło
2

Alternatywnie do używania klawiszy strzałek, włącz klawisze j& k, aby przewijać listę autouzupełniania.

W ten sposób bieżący wiersz zostanie dopasowany do wybranego słowa podczas przewijania.

Dlatego nie trzeba naciskać klawisza Enter, ponieważ kursor nadal znajduje się w trybie wstawiania na końcu podstawionego słowa.

Aby to włączyć, dodaj to do swojego .vimrc (Podziękowania dla innych w Stackoverflow):

inoremap <expr> j ((pumvisible())?("\<C-n>"):("j"))
inoremap <expr> k ((pumvisible())?("\<C-p>"):("k"))

Osobno, zamiast używać klawiszy strzałek, możesz po prostu powtórzyć ten, Ctrl-nktóry przeklnie opcje ( Ctrl-paby cofnąć) i zastąpić bieżącą linię podczas ruchu, bez potrzeby Entermapowania klawiszy lub vim.

geedoubleya
źródło
To zachowanie może być nieco mylące, ponieważ zarówno 1) jest w trybie wstawiania, jak i 2) interpretuje j i k, aby robić rzeczy, których nie robią w trybie wstawiania. W szczególności nie można wybrać pozycji menu, a następnie śledzić jej bezpośrednio, zaczynając od j lub k.
echristopherson
Zgodziłem się, dlatego podałem drugą opcję, jeśli był to krok za daleko. Osobiście wolałbym zamieszanie niż poruszać ręką, aby użyć strzałek.
geedoubleya