これは非常に興味深い質問ですが、あなたの提案したアプローチが最良の方法であるかどうかはわかりません。私は答えを試みましたが、この最初の反復は完璧ではないかもしれません。私は、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ファイルで動作するようです。何か問題がある場合はお知らせください。改善のためのアイデアがあります。
LaTeXを指定するタイトルを編集しました。そうしないと、非常に広い質問になります。コード環境を検出する方法は、言語ごとに劇的に異なります。 –