From 60bc8ea8b3b7be511c4240ca1d7dc1cc1149b113 Mon Sep 17 00:00:00 2001 From: Teddy Wing Date: Wed, 10 May 2017 05:10:41 +0200 Subject: gitcha#GitSHAComplete(): Use `complete()` to open popup menu (WIP) Work in progress Rough code for a working implementation using `complete()` instead of 'completefunc'. Rejigger `start` and make a new `base` variable since we can no longer get it as an argument. Correctly reset 'completeopt' to its original user value after opening the popup menu. Return an empty string from the function as recommended by :h complete() --- autoload/gitcha.vim | 36 +++++++++++++++++++++--------------- ftplugin/gitcommit/gitcha.vim | 11 +++++++---- 2 files changed, 28 insertions(+), 19 deletions(-) diff --git a/autoload/gitcha.vim b/autoload/gitcha.vim index e5543f7..c2e30b1 100644 --- a/autoload/gitcha.vim +++ b/autoload/gitcha.vim @@ -4,32 +4,36 @@ let s:old_completefunc = &completefunc let s:old_completeopt = &completeopt " Completion for Git SHAs in the current repository -function! gitcha#GitSHAComplete(findstart, base) - if a:findstart +function! gitcha#GitSHAComplete() + " if a:findstart " locate the start of the word let line = getline('.') - let start = col('.') - 1 - while start > 0 && line[start - 1] =~ '[0-9a-f]' + let start = col('.') + while start > 0 && line[start - 2] =~ '[0-9a-f]' let start -= 1 endwhile - return start - endif - - " Restore user completion function - let &completefunc = s:old_completefunc - " let &completeopt = s:old_completeopt + " return start + " endif " Match Git SHAs in the current repository let matches = [] let revs = system('git rev-list --all --pretty=oneline --no-abbrev-commit') + let base = line[start - 1 : col('.') - 1] for m in s:BuildMatchDictionary(revs) - if m['word'] =~ '^' . a:base + if m['word'] =~ '^' . base call add(matches, m) endif endfor - return matches + " echom start + " echom string(matches) + " let &completeopt = 'menu,pattern,menuone' + set completeopt=menu,menuone,preview + call complete(start, matches) + " call complete(col('.'), matches) + let &completeopt = s:old_completeopt + return '' endfunction " Takes rev-list output from: @@ -58,7 +62,9 @@ endfunction " Allow mappings to initiate completion function! gitcha#StartGitSHACompletion() - set completefunc=gitcha#GitSHAComplete - set completeopt=menu,menuone,preview - return "\\" + " call gitcha#GitSHAComplete() + " return '' + " set completefunc=gitcha#GitSHAComplete + " set completeopt=menu,menuone,preview + " return "\\" endfunction diff --git a/ftplugin/gitcommit/gitcha.vim b/ftplugin/gitcommit/gitcha.vim index 19f4a0b..9be271d 100644 --- a/ftplugin/gitcommit/gitcha.vim +++ b/ftplugin/gitcommit/gitcha.vim @@ -8,10 +8,13 @@ if exists('g:no_plugin_maps') || exists('g:no_gitcha_maps') finish endif -if !hasmapto('GitchaCompleteSHA') - imap GitchaCompleteSHA -endif +" if !hasmapto('GitchaCompleteSHA') +" imap GitchaCompleteSHA +" endif -inoremap GitchaCompleteSHA gitcha#StartGitSHACompletion() +" inoremap GitchaCompleteSHA =gitcha#StartGitSHACompletion() +" inoremap GitchaCompleteSHA =gitcha#GitSHAComplete() +" inoremap =gitcha#GitSHAComplete() +inoremap =gitcha#GitSHAComplete() let b:undo_ftplugin = 'iunmap ' -- cgit v1.2.3