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 () возвращает флаг, который говорит, открыто ли всплывающее меню. Это мешает нам изменить поведение клавиши ввода в режиме вставки, когда всплывающее меню не открыто.
К сожалению, я не могу найти документацию для? и: и почему мы должны передавать строки в.