LINUX.ORG.RU

vim автозаполнение целей make

 , ,


0

3

Некоторое время пользовался vim и он отлично автозаполнял имена целей:

:make<tab>

По какой-то причине это перестало работать. (Или у меня галлюцинации, что это работало.)

Как в vim добавить автозаполнение целей? В интернете нашёл только костыль, добавляющий команду :Make, у которой работает автозаполнение.

Подозреваю, что автодополнение в Vim работает так же, как и в оболочке (т.е. вызывается make -qnp и обрабатывается вывод).

Это ненадёжно, это работает только для GNU Make — и то не всегда. Т.е. всякие dmake/bmake — вообще без вариантов.

Я бы попробовал без .vimrc, в девственно чистой оболочке и на максимально простом Makefile (скажем, с двумя целями). И ещё для сравнения можно попробовать nvim, потому что в нём логика :make из коробки такая же.

P.S. А не подойдут ли тебе асинхронные варианты наподобие https://github.com/tpope/vim-dispatch или https://github.com/neomake/neomake?

Bass ★★★★★
()
Ответ на: комментарий от Bass

т.е. вызывается make -qnp и обрабатывается вывод

Не понимаю о чём речь… По умолчанию make с данными флагами запускается через vim?

как и в оболочке

В bash completion работает даже с указанием флагов -qnp.

сравнения можно попробовать nvim

Так же.

Jullyfish
() автор топика

В результате было сделано так:

function! MakeCompletion(A,L,P) abort                                           
        let l:targets = systemlist(                                             
                \ 'make -qp |                                                   
                \ awk -F'':'' ''/^[a-zA-Z0-9][^$#\/\t=]*:([^=]|$)/              
                \ {split($1,A,/ /);for(i in A)print A[i]}''                     
                \  | grep -v Makefile | sort -u')                               
        return filter(l:targets, 'v:val =~ "^' . a:A . '"')                     
endfunction                                                                     
command! -nargs=* -complete=customlist,MakeCompletion Make !make <args> 

Автодополнение с командой :Make <tab>.

Jullyfish
() автор топика
Ответ на: комментарий от Jullyfish

Можно чуть сократить, если использовать custom вместо customlist:

function! MakeCompletion(A,L,P) abort
        return system(
                \ 'make -qp |
                \ awk -F'':'' ''/^[a-zA-Z0-9][^$#\/\t=]*:([^=]|$)/
                \ {split($1,A,/ /);for(i in A)print A[i]}''
                \  | grep -v Makefile | sort -u')
endfunction
command! -nargs=* -complete=custom,MakeCompletion Make make <args>

В этом случае матчинг будет происходить с текущими настройками комплита – если включил fuzzy – будет fuzzy complete, иначе prefix based: https://asciinema.org/a/T7OHl7DYyXhmWOx4PZqS7YKm6

Или другой вариант

vim9script

def MakeCompletion(_, _, _): string
    return system("make -npq : 2> /dev/null | awk -v RS= -F: '$1 ~ /^[^#%.]+$/ { print $1 }' | sort -u")
enddef

command! -nargs=* -complete=custom,MakeCompletion Make make <args>

https://asciinema.org/a/724698 – добавил запуск make в vim-shout

habamax ★★★
()
Последнее исправление: habamax (всего исправлений: 3)
26 июля 2025 г.

Столкнулся с внезапной проблемой. Если использовать :Make, а не :make, тогда vim не перехватывает диагностические сообщения от gcc и по ним нельзя перемещаться командами :cn и :cp.

Jullyfish
() автор топика