5

我想创建一个映射,该映射将根据光标之前的字符更改 ins-completion。如果字符是{然后我想要标签完成,如果它:我想要正常完成(这取决于完整选项)并且如果字符是反斜杠加上一些单词(\w+)我想要字典完成。我的ftplugin/tex/latex_settings.vim文件中有以下内容:

setlocal dictionary=$DOTVIM/ftplugin/tex/tex_dictionary
setlocal complete=.,k
setlocal tags=./bibtags;

function! MyLatexComplete()
    let character = strpart(getline('.'), col('.') - 1, col('.'))

    if character == '{'
        return "\<C-X>\<C-]>"
    elseif character == ':'
        return "\<C-X>\<C-N>"
    else
        return "\<C-X>\<C-K>"
    endif
endfunction

inoremap <C-n> <c-r>=MyLatexComplete()<CR>

这不起作用,我不知道如何解决它。

编辑:这似乎可行,但我想要一个条件来检查 \w+ (反斜杠加上任何单词)和最后一个给出消息“未找到匹配项”的条件。

function! MyLatexComplete()
    let line = getline('.')
    let pos = col('.') - 1

    " Citations (comma for multiple ones)
    if line[pos - 1] == '{' || line[pos - 1] == ','
        return "\<C-X>\<C-]>"
    " Sections, equations, etc
    elseif line[pos - 1] == ':'
        return "\<C-X>\<C-N>"
    else
    " Commands (such as \delta)
        return "\<C-X>\<C-K>"
    endif
endfunction
4

2 回答 2

3
于 2013-09-04T09:50:09.187 回答
1

要发现前面的 LaTeX 命令,您可以在line变量上使用以下正则表达式:

line =~ '\\\w\+$'

(如您所见,正则表达式类似于您猜到的 Perl 表达式,但需要转义一些字符)。

要回显"No match found"消息,您可以返回适当的:echoerr命令:

return "\<C-o>:echoerr 'No match found'\<CR>"

但这有暂时劫持插入模式的副作用......也许只是不返回任何匹配项作为空字符串更干净?

所以你的最终功能看起来像这样:

function! MyLatexComplete()
    let line = getline('.')
    let pos = col('.') - 1

    " Citations (comma for multiple ones)
    if line[pos - 1] == '{' || line[pos - 1] == ','
        return "\<C-X>\<C-]>"
    " Sections, equations, etc
    elseif line[pos - 1] == ':'
        return "\<C-X>\<C-N>"
    elseif line =~ '\\\w\+$'
    " Commands (such as \delta)
        return "\<C-X>\<C-K>"
    else
    " Echo an error:
        return "\<C-o>:echoe 'No match found'\<CR>"
    endif
endfunction
于 2013-09-04T08:15:31.433 回答