Bash-подобное завершение кода в vim?

В настоящее время я использую superTab для дополнений в Vim. Тем не менее, я хотел бы, чтобы завершения были больше похожи на bash. Например, если я печатаю

st

и возможные дополнения

struct, string

Я бы хотел, чтобы он был завершен, если я нажму клавишу Tab, и в идеале отобразил бы меню возможных завершений.

Плагины в порядке.

3 ответа

Решение

Я думаю, что следующий плагин делает то, что вы просите:
Ты дополняешь меня

Из описания:

YouCompleteMe - это быстрый механизм для нечеткого поиска кода по мере ввода текста для Vim. Он имеет два механизма завершения: механизм на основе идентификатора, который работает с каждым языком программирования, и семантический механизм на основе Clang, который обеспечивает завершение семантического кода для C/C++/Objective-C/Objective-C++ (отныне именуемый " языки семейства С ").

Ввод set completeopt=menu,longestПолучается, чтобы сделать трюк, в основном. К сожалению, ввод еще текста, затем повторное нажатие клавиши табуляции пытается сделать полное завершение, вместо того, чтобы дать следующий самый длинный общий префикс.

Основываясь на ответе Александра, у меня есть что-то вроде этих строк в моем.vimrc

"unix like completion - longest substring
set completeopt+=longest
"add command to retrigger longest substring
"Naive version... see below
inoremap <C-m> <C-e><C-n>

Таким образом, самый длинный бит выполняет большую часть работы, однако последующие нажатия <C-n> просто начнет циклически переключаться между вариантами. Если вы нажмете <C-e> что (е) находит автозаполнение, вызывая его снова с <C-n> соответствует следующей самой длинной подстроке... добавление ярлыка, который останавливает необходимость нажатия двух клавиш....

Вы не хотите связывать это с <C-n> как это остановит вас на велосипеде в привычной манере

Я выбрал M, так как он прямо рядом с N и проверял (:h insert-index) по умолчанию просто быть привязанным к same as <CR>.... потому что это vim и ничто никогда не бывает легким, оказывается, что это означает, что vim не может на самом деле различать два нажатия клавиш!

Если вы не заботитесь об использовании <C-m> тогда просто выберите что-то другое, иначе читайте дальше...

Основываясь на этом другом посте, я адаптировал ответ внизу и немного очистил синтаксис (основываясь на этом)

Я закончил с этим:

"add command to retrigger longest substring
inoremap <expr> <C-M> pumvisible() ? "\<C-e><C-n>" : "\<C-m>"

pumvisible () возвращает флаг, который говорит, открыто ли всплывающее меню. Это мешает нам изменить поведение клавиши ввода в режиме вставки, когда всплывающее меню не открыто.

К сожалению, я не могу найти документацию для? и: и почему мы должны передавать строки в.

Другие вопросы по тегам