2012-08-06 40 views
6

Tôi muốn biết làm thế nào tôi có thể kích hoạt một hành động nhất định khi tôi ở trong một môi trường nhất định khi viết mã/latex bằng cách sử dụng vim. Ví dụ: giả sử tôi đang viết tex và bên trong môi trường căn chỉnh, thì tôi muốn mọi dấu bằng tôi nhập được chuyển đổi thành & =.Vim hành động bên trong môi trường LaTeX

Điều tôi đang nghĩ bây giờ khá là cồng kềnh. Đây là mã giả cho những gì có trong vimrc của tôi. Đây là hình thức trông giống như

Shortcut for environment opens start and end tag for align environment (Using imap) 
The above action also initiates a counter variable, sets it to 1 
If counter is 1, every equals sign I enter should be entered as an &=. 
Shortcut to force counter to zero when I move out of the environment. (Using imap) 

Tôi muốn biết liệu có cách nào dễ dàng hơn để giải quyết vấn đề này không. Đây chỉ là một ví dụ. Ý tưởng chính ở đây là dành cho vim có nhận thức về môi trường.

Mong đề xuất của bạn.

+0

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. –

Trả lời

2

Tôi thường giải quyết vấn đề này sau sự kiện. Ví dụ, tôi viết nó với các dấu hiệu bình thường = và sau đó chọn trực quan vùng đó và sử dụng :s/=/\&=/g. Nếu bạn muốn làm nhiều thứ với "môi trường" sau khi thực tế bạn có thể tạo một hàm và kích hoạt một khóa để thực thi nó. Ví dụ:

vnoremap <leader>la :call <SID>latexAlign()<cr> 

function! s:latexAlign() range 
    exe ":'<,'>s/=/\&=/g" 
    " add more stuff here... 
endfunction 

Tuy nhiên, tôi nghĩ giải pháp của bạn tốt hơn trong trường hợp bạn quay lại và chỉnh sửa sau này. Các tập tin htmlcomplete trong vim xử lý tình huống này như thế này:

let stylestart = searchpair('<style\>', '', '<\/style\>', "bnW") 
let styleend = searchpair('<style\>', '', '<\/style\>', "nW") 
if stylestart != 0 && styleend != 0 
    if stylestart <= curline && styleend >= curline 
     let start = col('.') - 1 
     let b:csscompl = 1 
     while start >= 0 && line[start - 1] =~ '\(\k\|-\)' 
     let start -= 1 
     endwhile 
    endif 
endif 

Bạn có thể thấy nó sử dụng searchpair để xác định xem nó là bên trong <style></style> thẻ. Xem :help searchpair() để biết thêm thông tin.

+0

Xin chào, Xin lỗi vì sự chậm trễ lớn. Tôi đã có rất nhiều việc phải làm và bị bắt. Đây không phải là điều tôi đang tìm kiếm. Tôi không muốn thay đổi khi tôi đã hoàn thành mã. Tôi muốn nó biết khi tôi ở trong. Tuy nhiên, tôi đã học được rất nhiều từ câu trả lời của bạn, vì vậy cảm ơn. – WiFO215

0

Nếu bạn đang tìm kiếm "nhận thức về môi trường" và nếu điều đó có nghĩa là "tôi có đang ở trong tệp latex không?" bạn có thể bật hành vi với số autocommand.

Vim nhận một sự giàu có của các loại tập tin và bạn có thể chắc chắn rằng các loại tập tin bạn đang chỉnh sửa được công nhận bởi mặc định bằng cách thực hiện:

:echo &filetype 

Khi chỉnh sửa một tập tin Python, tôi nhận được python như một kết quả. Nếu bạn cần điều này chỉ mủ và bạn nhận được một câu trả lời thỏa đáng từ đó biến Vim, bạn có thể thiết lập một autocommand sử dụng đó, nếu không bạn có thể chỉ định các phần mở rộng trong nó, nó sẽ trông như thế này:

autocmd BufReadPost,BufNewFile,BufEnter *.tex, *.latex call MyFunction() 

đâu RedPost, NewFile và Enter là một số tương tác Vim có thể sẽ kích hoạt MyFunction của bạn khi tiện ích mở rộng tệp kết thúc bằng .text hoặc .latex

Nếu bạn thực sự cần một số ví dụ về mã. phù hợp hơn.

+2

Bởi "môi trường", áp phích có nghĩa là một vùng cụ thể của tệp LaTeX được xác định theo cú pháp, không phải là loại tệp. –

2

Đâ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\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.

Các vấn đề liên quan