这是一个非常有趣的问题,但我不确定您建议的方法是最好的方法!我尝试了一个答案,但第一次迭代可能并不完美。我假设 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()
。
要更改=
键的行为,您需要创建另一个&=
在 align 环境中返回的函数,=
否则:
function! TeXEquals()
return GetTeXEnv() =~ 'align\*\?' ? "&=" : "="
endfunction
=
然后您可以在插入模式下重新映射(仅适用于 TeX 文件)
autocmd FileType tex inoremap <silent> = <c-r>=TeXEquals()<CR>
这似乎在我的示例 LaTeX 文件中有效。如果您发现任何问题或有任何改进的想法,请告诉我。