completion: Add omni completion for new task modstrings

This commit is contained in:
Tomas Janousek 2020-12-26 22:23:22 +01:00 committed by Tomas Babej
parent 12d363df5e
commit 57a5c405ea
6 changed files with 91 additions and 1 deletions

View file

@ -0,0 +1,5 @@
if exists('b:did_ftplugin_taskwiki_after') | finish | endif
let b:did_ftplugin_taskwiki_after = 1
let b:taskwiki_omnifunc_fallback = len(&omnifunc) ? function(&omnifunc) : ''
setlocal omnifunc=taskwiki#CompleteOmni

View file

@ -36,3 +36,33 @@ endfunction
function! taskwiki#CompleteMod(arglead, line, pos) abort
return py3eval('cache().get_relevant_completion().modify(vim.eval("a:arglead"))')
endfunction
function! taskwiki#CompleteOmni(findstart, base) abort
if a:findstart == 1
let line = getline('.')[:col('.')-2]
" Complete modstring after -- in new tasks
let modstring = py3eval('cache().get_relevant_completion().omni_modstring_findstart(vim.eval("l:line"))')
if modstring >= 0
let s:omni_method = 'modstring'
return modstring
endif
" Fallback to vimwiki's omnifunc
if type(b:taskwiki_omnifunc_fallback) is v:t_func
let s:omni_method = 'fallback'
return b:taskwiki_omnifunc_fallback(a:findstart, a:base)
else
let s:omni_method = ''
return -1
endif
else
if s:omni_method is 'modstring'
return py3eval('cache().get_relevant_completion().omni_modstring(vim.eval("a:base"))')
elseif s:omni_method is 'fallback'
return b:taskwiki_omnifunc_fallback(a:findstart, a:base)
else
return []
endif
endif
endfunction

View file

@ -314,6 +314,11 @@ Taskwarrior:
~ * [ ] This has project home #431f42
Typing additional metadata can be simplified by using omni completion (see
|compl-omni|), like so:
~ * [ ] This has project home -- project:<C-X><C-O>
----------------------------------------------------------------------------
5.2. Viewports *taskwiki-features-viewport*

View file

@ -4,6 +4,7 @@ import re
from tasklib import TaskWarrior
from taskwiki import constants
from taskwiki import regexp
def complete_last_word(f):
@ -121,3 +122,20 @@ class Completion():
self._complete_dates(w) or \
self._complete_recur(w) or \
[]
def omni_modstring_findstart(self, line):
m = re.search(regexp.GENERIC_TASK, line)
if m and not m.group('uuid') and ' -- ' in line:
return line.rfind(' ') + 1
else:
return -1
def omni_modstring(self, w):
return \
self._complete_any(w) or \
self._complete_attributes(w) or \
self._complete_projects(w) or \
self._complete_tags(w) or \
self._complete_dates(w) or \
self._complete_recur(w) or \
[]

View file

@ -85,6 +85,7 @@ class IntegrationTest(object):
self.configure_global_variables()
self.add_plugin('taskwiki')
self.add_plugin('vimwiki', 'plugin/vimwiki.vim')
self.add_plugin('taskwiki/after')
self.filepath = os.path.join(self.dir, 'testwiki.txt')
self.client.edit(self.filepath)

View file

@ -53,8 +53,19 @@ class TestCompletionUnit():
assert c.modify("re:da") == ["re:daily", "re:day"]
assert c.modify("recur:q") == ["recur:quarterly"]
def test_omni(self):
c = Completion(FakeTW())
assert c.omni_modstring_findstart("* [ ] x") == -1
assert c.omni_modstring_findstart("* [ ] x --") == -1
assert c.omni_modstring_findstart("* [ ] x #12345678 --") == -1
assert c.omni_modstring_findstart("* [ ] x -- #12345678") == -1
assert c.omni_modstring_findstart("* [ ] x -- ") == 11
assert c.omni_modstring_findstart("* [ ] x -- x") == 11
assert c.omni_modstring_findstart("* [ ] x -- xy") == 11
assert c.omni_modstring_findstart("* [ ] x -- x y") == 13
class TestCompletionIntegration(IntegrationTest):
class TestCompletionIntegMod(IntegrationTest):
viminput = """
* [ ] test task 1 #{uuid}
* [ ] test task 2 #{uuid}
@ -74,3 +85,23 @@ class TestCompletionIntegration(IntegrationTest):
task.refresh()
assert self.tasks[0]['project'] == "DEF"
class TestCompletionIntegOmni(IntegrationTest):
viminput = """
* [ ] test task 1 #{uuid}
"""
tasks = [
dict(description="test task 1", project="ABC"),
]
def execute(self):
self.client.feedkeys('1gg')
self.client.feedkeys('otest task 2 -- pro\\<C-X>\\<C-O>A\\<C-X>\\<C-O>\\<Esc>')
self.client.eval('0') # wait for command completion
self.command("w", regex="written$", lines=1)
task = self.tw.tasks.pending()[1]
assert task['description'] == 'test task 2'
assert task['project'] == 'ABC'