列表 @ 标签在 vim 内自动完成
List @ tag auto completes in vim
我想在 vim 中编辑时在我的降价文件中植入一些 @tags
(例如 @sea_ice
、@models
)。目前我正在使用 SuperTab 来制表完成普通单词。但是,如果我在 @
符号后点击 <tab>
,它不会给我所有 @tags
的列表,而是在当前上下文中找到的所有单词的长列表。
我注意到 SuperTab 允许自定义上下文定义,但是,由于我对 vim 脚本编写一无所知,而且文档仅包含 2 个示例,因此我无法自己编写脚本。
经过一番搜索,我想我可能需要定义一个新的自定义 omni 完整函数,特别是函数的第二部分:
function! TagComplete(findstart, base)
if a:findstart
" locate the start of the word
let line = getline('.')
let start = col('.') - 1
while start > 0 && line[start - 1] != '@'
let start -= 1
endwhile
return start
else
" find @tag
let res = []
????
????
endif
return res
endif
endfun
这是我正在处理的代码。但我不知道如何测试它或把它放在哪里合适。请帮忙
谢谢
我从未使用过 SuperTab,所以我不知道该解决方案是否以及如何与该插件一起使用,但内置的手动完成功能非常简单。
如果尚不存在,请创建此目录结构:
~/.vim/after/ftplugin/
在~/.vim/after/ftplugin/markdown.vim
中添加这一行:
setlocal define=@
在降价缓冲区中,键入 @
并按 <C-x><C-d>
。
参见 :help 'define'
和 :help ctrl-x_ctrl-d
。
经过一番挣扎和寻求帮助后,我找到了一个解决方案。
首先创建一个 completefunc
在当前文件中搜索 @tags
(致谢 cherryberryterry:https://www.reddit.com/r/vim/comments/4dg1rx/how_to_define_custom_omnifunc_in_vim_seeking/):
function! CompleteTags(findstart, base)
if a:findstart
return match(matchstr(getline('.'), '.*\%' . col('.') . 'c'), '.*\(^\|\s\)\zs@')
else
let matches = []
" position the cursor on the last column of the last line
call cursor(line('$'), col([line('$'), '$']))
" search backwards through the buffer for all matches
while searchpos('\%(^\|\s\)\zs' . (empty(a:base) ? '@' : a:base) . '[[:alnum:]_]*', 'bW') != [0, 0]
let matches += [matchstr(getline('.'), '\%' . col('.') . 'c@[[:alnum:]_]*')]
endwhile
return filter(matches, "v:val != '@'")
endif
endfunction
set completefunc=CompleteTags
将以下内容放入 .vimrc
以使用 SuperTab 设置制表符补全:
function! TagCompleteContext()
let line = getline('.')
if line[col('.') - 2] == '@'
return "\<c-x>\<c-u>"
endif
endfunction
let g:SuperTabDefaultCompletionType = "context"
let g:SuperTabCompletionContexts = ['TagCompleteContext', 's:ContextText']
let g:SuperTabContextDefaultCompletionType = "<c-p>"
我想在 vim 中编辑时在我的降价文件中植入一些 @tags
(例如 @sea_ice
、@models
)。目前我正在使用 SuperTab 来制表完成普通单词。但是,如果我在 @
符号后点击 <tab>
,它不会给我所有 @tags
的列表,而是在当前上下文中找到的所有单词的长列表。
我注意到 SuperTab 允许自定义上下文定义,但是,由于我对 vim 脚本编写一无所知,而且文档仅包含 2 个示例,因此我无法自己编写脚本。
经过一番搜索,我想我可能需要定义一个新的自定义 omni 完整函数,特别是函数的第二部分:
function! TagComplete(findstart, base)
if a:findstart
" locate the start of the word
let line = getline('.')
let start = col('.') - 1
while start > 0 && line[start - 1] != '@'
let start -= 1
endwhile
return start
else
" find @tag
let res = []
????
????
endif
return res
endif
endfun
这是我正在处理的代码。但我不知道如何测试它或把它放在哪里合适。请帮忙
谢谢
我从未使用过 SuperTab,所以我不知道该解决方案是否以及如何与该插件一起使用,但内置的手动完成功能非常简单。
如果尚不存在,请创建此目录结构:
~/.vim/after/ftplugin/
在
~/.vim/after/ftplugin/markdown.vim
中添加这一行:setlocal define=@
在降价缓冲区中,键入
@
并按<C-x><C-d>
。
参见 :help 'define'
和 :help ctrl-x_ctrl-d
。
经过一番挣扎和寻求帮助后,我找到了一个解决方案。
首先创建一个 completefunc
在当前文件中搜索 @tags
(致谢 cherryberryterry:https://www.reddit.com/r/vim/comments/4dg1rx/how_to_define_custom_omnifunc_in_vim_seeking/):
function! CompleteTags(findstart, base)
if a:findstart
return match(matchstr(getline('.'), '.*\%' . col('.') . 'c'), '.*\(^\|\s\)\zs@')
else
let matches = []
" position the cursor on the last column of the last line
call cursor(line('$'), col([line('$'), '$']))
" search backwards through the buffer for all matches
while searchpos('\%(^\|\s\)\zs' . (empty(a:base) ? '@' : a:base) . '[[:alnum:]_]*', 'bW') != [0, 0]
let matches += [matchstr(getline('.'), '\%' . col('.') . 'c@[[:alnum:]_]*')]
endwhile
return filter(matches, "v:val != '@'")
endif
endfunction
set completefunc=CompleteTags
将以下内容放入 .vimrc
以使用 SuperTab 设置制表符补全:
function! TagCompleteContext()
let line = getline('.')
if line[col('.') - 2] == '@'
return "\<c-x>\<c-u>"
endif
endfunction
let g:SuperTabDefaultCompletionType = "context"
let g:SuperTabCompletionContexts = ['TagCompleteContext', 's:ContextText']
let g:SuperTabContextDefaultCompletionType = "<c-p>"