Đây là một câu hỏi rất thú vị, nhưng tôi không chắc chắn rằng cách tiếp cận được đề xuất của bạn là cách tốt nhất! Tôi đã thử một câu trả lời, nhưng lần lặp đầu tiên này có thể không hoàn hảo. Tôi giả định rằng một môi trường LaTeX chỉ đơn giản là giới hạn bởi các lệnh \begin
và \end
(LaTeX của tôi hơi bị gỉ!).
Trước tiên, bạn cần một hàm để trả về môi trường của vị trí con trỏ.Hàm của tôi bên dưới nhảy đến lệnh \begin
trước đó, sau đó nhảy tới lệnh \end
phù hợp, tính toán liệu con trỏ có nằm trong vùng này hay không và tiếp tục quá trình cho đến khi tìm thấy môi trường có chứa. Nó sẽ xử lý môi trường lồng nhau. Nếu không có trong môi trường LaTeX, một chuỗi rỗng sẽ được trả về.
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
Bây giờ bạn có thể tìm hiểu môi trường của con trỏ bằng cách sử dụng :echo GetTeXEnv()
.
Để thay đổi hành vi của khóa =
, bạn cần phải tạo ra một chức năng mà trả &=
trong môi trường class, và =
khác:
function! TeXEquals()
return GetTeXEnv() =~ 'align\*\?' ? "&=" : "="
endfunction
Sau đó, bạn có thể remap =
trong chế độ chèn (cho các tập tin TeX chỉ)
autocmd FileType tex inoremap <silent> = <c-r>=TeXEquals()<CR>
Điều này dường như hoạt động trong tệp LaTeX mẫu của tôi. Hãy cho tôi biết nếu bạn tìm thấy bất kỳ vấn đề nào hoặc có bất kỳ ý tưởng cải tiến nào.
Nguồn
2012-08-06 18:33:10
Tôi đã chỉnh sửa tiêu đề để chỉ định LaTeX, nếu không thì đây sẽ là một câu hỏi rất rộng. Phương pháp phát hiện một môi trường mã sẽ khác nhau đáng kể từ ngôn ngữ này sang ngôn ngữ khác. –