除此之外,我还将Vim用于工作报告。不完全是报道,但我现在找不到更好的词汇。 它们的形式类似于
20-01-2015 14:43h
<bop> <modular system> <iva>
Text of report. Text of report. Text of report. Text of report. Text of report. Text of report. Text of report. Text of report. Text of report. Text of report. Text of report. Text of report. Text of report. Text of report. Text of report. Text of report.
02-03-2015 14:43h
<pob> <some other tag> <some other tag 2>
Text of report. Text of report. Text of report. Text of report. Text of report. Text of report. Text of report. Text of report. Text of report. Text of report. Text of report. Text of report. Text of report. Text of report. Text of report. Text of report.
日期和时间。第二行中的标签,以及描述已完成内容的描述。
现在这可能会变得很冗长,因为这些条目每天都会添加几次,而且文本可能比两行或三行长得多。
有些人阅读这些内容,并非所有人都掌握了这方面的知识。通常通过文件跟踪某个标签来跟踪某些主题的进度。
由于我经常还有其他事情,我有时会犯错,而不是<modular system>
标记写<system modular>
标记,这使得保持历史非常困难。
所以我想知道,有没有办法使用Vim的自动完成功能来显示所有标签的列表(&lt;&gt;括号中的一个或多个单词和数字),所以当添加那些我可以从列表中选择它们,从而避免错误输入或混合它们的问题?
答案 0 :(得分:0)
这是我的方法。它使用单独的标记文件,因此您可以编辑多个报告文件,并且可以在任何文件中使用任何标记。它扫描文件中的标签并将它们保存为dict中的键,因此自动完成应该非常快。在运行时路径中将其保存为autoload / tagHelper.vim,然后在.vimrc中调用tagHelper#AddAutocmds()
。您必须为标记文件的位置设置全局变量,并使用模式识别这些报告文件。
let tags = {}
if exists('g:tagFile')
let tagFile = glob(g:tagFile)
else
let tagFile = glob('~/tags.txt')
endif
if exists('g:reportPattern')
let reportPattern = g:reportPattern
else
let reportPattern = 'reports/*'
endif
function! tagHelper#LoadTags()
try
let taglist = readfile(tagFile)
catch
let taglist = []
endtry
for tag in taglist
let tags[tag] = 1
endfor
endfunction
function! tagHelper#AddMappings()
inoremap <buffer> > ><Esc>:call tagHelper#AddTagsFromLine(getline('.'))<CR>a
inoremap <buffer> < <<C-x><C-o>
setlocal omnifunc=tagHelper#CompleteTag
endfunction
function! tagHelper#AddTagsFromLine(line)
let matchStart = 0
while matchStart != 0
let nextMatchStart = match(a:line, '<[^>]\+>', matchStart)
let tag = matchstr(a:line, '<[^>]\+>', matchStart)
let tags[tag] = 1
let matchStart = nextMatchStart + strlen(tag)
endwhile
endfunction
function! tagHelper#AddAllTagsInBuffer()
for line in getline(1, '$')
call tagHelper#AddTagsFromLine(line)
endfor
endfunction
function! tagHelper#CompleteTag(findstart, base)
if a:findstart
let line = getline('.')
let col = col('.')
let start = strridx(line, '<', col) + 1
return start
endif
let matches = []
for tag in keys(tags)
if stridx(tolower(tag), tolower(a:base)) == 0
call add(matches, tag)
endif
endfor
return matches
endfunction
function! tagHelper#SaveTags()
call writefile(keys(tags), tagFile)
endfunction
function! tagHelper#AddAutocmds()
autocmd VimLeave call tagHelper#SaveTags()
exe 'autocmd BufEnter ' . reportPattern . ' call tagHelper#AddAllTagsInBuffer()'
exe 'autocmd BufEnter ' . reportPattern . ' call tagHelper#AddMappings()'
endfunction
答案 1 :(得分:0)
我的CompleteHelper library可以轻松构建自定义完成(我已经写了很多);您需要一个匹配<...>
内的任何标记名称。但即使库完成了构建匹配列表的艰苦工作,您仍然需要编写样板代码来定义模式,并将其分配给完成键。
因此,在您的用例提示下,我编写了使用CompleteHelper库的SpecialLocationComplete plugin,并允许通过简单的配置对象定义自定义完成。最好的(对你来说),它甚至可以为完整标签提供CTRL-X CTRL-X T
完成,正如你所要求的那样(我想象的对XML标签也更有用)!