Ctags, Completion

1 юни 2023

Преговор

Преговор

Преговор

Преговор

Довършващи неща: Дефиниране на функции за навигация

Вариант 1: глобални команди в локален файл

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
" Check if editing a directory
autocmd VimEnter * call s:MaybeEnterDirectory(expand("<amatch>"))

function! s:MaybeEnterDirectory(file)
  if a:file == '' || !isdirectory(a:file)
    return
  endif

  let dir = a:file
  exe "cd ".fnameescape(dir)

  if filereadable('_project.vim')
    edit _project.vim
    setfiletype vim
    source _project.vim
  endif
endfunction

Оттам мога да извикам примерно runtime! projects/rails.vim: Vimfiles/projects/

Довършващи неща: Дефиниране на функции за навигация

Довършващи неща: Дефиниране на функции за навигация

Довършващи неща: Дефиниране на функции за навигация

Довършващи неща: Дефиниране на функции за навигация

Вариант 2: буфер-локални променливи (the Tim Pope way)

1
autocmd FileType * if RailsDetect() | call rails#buffer_setup() | endif

И една купчина други аутокоманди

Detection-a се свежда до "има ли Gemfile.lock" в родителска директория (:help findfile()). И командите се дефинират само в този буфер и така във всеки следващ.

Довършващи неща: Ctags

Ако минем твърде бързо, или ви се чете, две стари статии:

Ctags: История

Оригиналния ctags е само за C, hence the name. После излиза Exuberant ctags, което започва да се използва мега много, и наскоро Universal ctags, което е поддържаната версия.

Съществуват разни language-specific алтернативи за haskell, за rust, за ruby, със смесен успех.

Ctags: Генериране

1
ctags -R .

Ако искате да индексирате и пакетите, освен вашия код, трябва да намерите директориите им. Аз имам bundle-tags за руби и cargo-tags за Rust (което използва cargo-local)

Ctags: Употреба

Ctags: Употреба

Ctags: Употреба

Ctags: Употреба

Ctags: Употреба

Ctags: Сериозна употреба

Ctags: Сериозна употреба

Ctags: Сериозна употреба

Ctags: Сериозна употреба

Ctags: Сериозно генериране

Ctags: Сериозно генериране

Ctags: Сериозно генериране

Ctags: Сериозно генериране

Ctags: Има ли смисъл?

Ctags: Има ли смисъл?

Ctags: Има ли смисъл?

Ctags: Има ли смисъл?

Ctags: Има ли смисъл?

Ctags: Идеи за проекти

Ctags: Идеи за проекти

Ctags: Идеи за проекти

Ctags: Идеи за проекти

Insert-mode Completion

:help ins-completion

Insert-mode Completion

:help ins-completion

Insert-mode Completion

:help ins-completion

Insert-mode Completion

:help ins-completion

Insert-mode Completion

:help ins-completion

Insert-mode Completion

:help complete-functions

Insert-mode Completion

Пример: strftime completion: strftime.vim

Функцията се вика два пъти, веднъж със findstart истина, веднъж лъжа. При първото викане, искаме да върнем на коя колона започва completion-а. При второто, връщаме списък с думи, които complete-ват:

1 2 3 4 5 6 7
function! strftime#Complete(findstart, base)
  if a:findstart
    " Намери началото и върни номер на колона или отрицателно число, за да спреш completion-а
  else
    " Върни списък от думи, или `{ word: ..., menu: ..., ... }`
  endif
endfunction

Rust импорти

Rust импорти

Готин трик

1 2 3 4 5 6 7 8 9 10 11
inoremap <expr> <Plug>StrftimeComplete <SID>CompleteOnce()

function s:CompleteOnce()
  let b:saved_completefunc = &completefunc
  set completefunc=strftime#Completefunc

  autocmd CompleteDone * ++once let &completefunc = b:saved_completefunc
  autocmd CompleteDone * ++once unlet b:saved_completefunc

  return "\<c-x>\<c-u>"
endfunction

Можем да си изберем наша клавишна комбинация примерно със:

1
imap <c-x><c-d> <Plug>StrftimeComplete

Какво е <SID>?

Това би дало грешка:

1
inoremap <expr> <Plug>StrftimeComplete s:CompleteOnce()
1
E120: Using <SID> not in a script context: s:CompleteOnce

Функцията s:CompleteOnce е script-local… Но когато изпълняваме мапинга, той все едно бива "написан" в командния ред, което е различен контекст.

Конкретно при мапинги, скрипт-локални функции и променливи могат да се реферират със <SID>. :help <SID>

Completion

Има много повече за четене, но не го ползвам често. Ако решите да пишете completion script за проект, започнете от това да прочетете цялата документация във

Completion: примери

Completion: примери

Completion: примери

Completion: примери

Автоматичен completion

Автоматичен completion

Автоматичен completion

Автоматичен completion

Асорти

Асорти

Въпроси