これは非常に興味深い質問ですが、提案されたアプローチが最善の方法であるかどうかはわかりません! 私は答えを試みましたが、この最初の繰り返しは完璧ではないかもしれません. 私は、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 ファイルで機能するようです。問題が見つかった場合、または改善のアイデアがあればお知らせください。