這是一個非常有趣的問題,但我不確定您提出的方法是最好的方法!我已經嘗試了一個答案,但是這個第一次迭代可能並不完美。我假設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