这是一个非常有趣的问题,但我不确定您提出的方法是最好的方法!我已经尝试了一个答案,但是这个第一次迭代可能并不完美。我假设LaTeX环境仅由\begin
和\end
命令分隔(我的LaTeX有点生疏!)。
首先你需要一个函数来返回光标位置的环境。我的下面的函数跳转到前面的\begin
命令,然后跳转到匹配的\end
命令,计算光标是否在该区域内,并继续该过程直到找到包含环境。它应该处理嵌套的环境。如果不在LaTeX环境中,则返回空字符串。现在
function! GetTeXEnv()
let pos = getpos('.')
let win = winsaveview()
let env = ''
let carry_on = 1
let search_ops = 'bWc'
let b_start = line('.')
while carry_on
keepjumps let b_start = search('\\begin{',search_ops)
let search_ops = 'bW'
" Only accept a match at the cursor position on the
" first cycle, otherwise we wouldn't go anywhere!
let env = matchstr(getline('.'),'\\begin{\zs.\{-}\ze}')
let env_esc = escape(env,'*')
keepjumps let b_end = search('\\end{\s*' . env_esc . '\s*}','Wn')
if b_start == 0
" finished searching; stop
let carry_on = 0
elseif b_end > b_start && b_end < pos[1]
" not inside this env; carry on
let env = ''
elseif b_end > b_start && b_end >= pos[1] && b_start <= pos[1]
" found it; stop
let carry_on = 0
endif
endwhile
call setpos('.',pos)
call winrestview(win)
return env
endfunction
您可以查询使用:echo GetTeXEnv()
光标的环境。
要改变=
键的行为,您需要创建另一个功能,在对准环境返回&=
,并=
否则:
function! TeXEquals()
return GetTeXEnv() =~ 'align\*\?' ? "&=" : "="
endfunction
然后你就可以重新映射在插入模式=
(为TeX文件只)
autocmd FileType tex inoremap <silent> = <c-r>=TeXEquals()<CR>
这似乎在我的示例LaTeX文件中工作。如果您发现任何问题或有任何改进想法,请告知我们。
我已经编辑了标题来指定LaTeX,否则这将是一个非常宽泛的问题。检测代码环境的方法在不同的语言中会有很大的不同。 – 2012-08-06 19:18:53