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?


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.


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.


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>"))

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.


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