Jak mogę skonstruować mapowanie vim, aby wykonać Ctrl-N, ale tak, jakby zawierało słowo-klucz „-”?

1

W Vimie, kiedy programuję, często chcę, aby Ctrl-N zachowywał się tak, jakby -był częścią słowa kluczowego; innymi słowy, należy włączyć to do iskeyword. Chciałbym jednak utworzyć nowe mapowanie klawiszy w tym celu i sprawić, by Ctrl-N zachował swoje istniejące zachowanie.

Próbowałem tego:

inoremap <C-B> <C-O>:set iskeyword+=-<CR><C-N>

... który rodzaj działa, ale opcja iskeyword zawiera dodatkowe -później, co nie jest pożądanym zachowaniem.

To także działa:

inoremap <C-B> <C-O>:set iskeyword+=-<CR><C-N><C-O>:set iskeyword-=-<CR>

... ale wyskakujące menu zostało zabite przez <C-O>.

Czy istnieje sposób, aby zjeść ciasto? Czy wyskakujące menu pojawi się i pozostanie na swoim miejscu, ale także iskeywordpowróci do tego, co było później?

Alternatywnie, czy istnieje inny sposób rozwiązania tego problemu?

Andrew Ferrier
źródło

Odpowiedzi:

2

To wydaje się działać.

function! CustomComplete(type)
    set iskeyword+=-
    return a:type
endfunction
inoremap <expr> <C-B> CustomComplete("<C-N>")
autocmd CompleteDone * set iskeyword-=-

Używamy odwzorowania wyrażeń, aby uruchomić funkcję, która ustawia się za iskeywordkażdym razem, gdy jest uruchamiana (nie wydaje się to problemem. Nie znalazłem też autocmd przed niedokończeniem.) Zwracana wartość funkcji jest następnie używana jako zamiennik mapowania. W tym przypadku chciałeś <C-N>zachowania. Następnie, aby usunąć zestaw -z zestawu słów kluczowych, używamy CompleteDoneautokomandy, która dzieje się po zakończeniu uzupełniania.


Wypróbowałem też oba twoje mapowania, ten pierwszy nie działa tak jak powinien, ponieważ ma także <C-O>okno, które zabija okno zakończenia.

FDinoff
źródło
Perfekcyjnie, dziękuję! - to wydaje się działać. Wgląd tutaj wykorzystywał funkcję otoki C-N(której nie wiedziałem, że możesz zrobić) i CompleteDonezdarzenie. Dziękuję - sam bym tego nie rozgryzł!
Andrew Ferrier,