2012-08-06 12 views
6

मैं जानना चाहता हूं कि जब मैं एक निश्चित वातावरण में हूं तो विम का उपयोग करके कोड/लेटेक्स लिखते समय मैं एक निश्चित कार्रवाई कैसे कर सकता हूं। उदाहरण के लिए, मान लीजिए कि मैं टेक्सास लिख रहा हूं और संरेखण पर्यावरण के अंदर हूं, तो मैं 0 बराबर चिह्नों को बदलना चाहता हूं जो मैं & = में परिवर्तित करने के लिए दर्ज करता हूं।लाटेक्स पर्यावरण के अंदर विम एक्शन

जो मैं अब सोच रहा हूं वह बोझिल है। यह मेरे vimrc में क्या है के लिए छद्म कोड है। यह

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) 

मुझे यह जानना है कि इसके आसपास जाने का कोई आसान तरीका है या नहीं। यह सिर्फ एक उदाहरण है। पर्यावरण का जागरूकता रखने के लिए यहां मुख्य विचार है।

अपने सुझावों के लिए तत्पर हैं।

+0

मैंने लाटेक्स निर्दिष्ट करने के लिए शीर्षक संपादित किया है, अन्यथा यह एक बहुत व्यापक प्रश्न होगा। कोड वातावरण का पता लगाने की विधि भाषा से भाषा में नाटकीय रूप से भिन्न होगी। –

उत्तर

2

मैं आम तौर पर इस तथ्य के बाद इस तरह की समस्या से निपटता हूं। उदाहरण के लिए, मैं इसे सामान्य = संकेतों के साथ लिखता हूं और फिर दृष्टि से इसे क्षेत्र का चयन करता हूं और :s/=/\&=/g का उपयोग करता हूं। यदि आप इस तथ्य के बाद "पर्यावरण" में कई चीजें करना चाहते हैं तो आप एक फ़ंक्शन बना सकते हैं और इसे निष्पादित करने के लिए एक कुंजी ट्रिगर कर सकते हैं। उदाहरण के लिए:

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

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

हालांकि, मुझे लगता है कि यदि आप वापस जाएं और बाद में इसे संपादित करें तो आपका समाधान बेहतर होगा। vim में htmlcomplete फ़ाइल इस तरह इस स्थिति संभालता है:

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 

आप देख सकते हैं कि यह कैसे searchpair का उपयोग करता है अगर यह <style></style> टैग के अंदर है निर्धारित करने के लिए। अधिक जानकारी के लिए :help searchpair() देखें।

+0

हाय, बड़ी देरी के लिए खेद है। मेरे पास बहुत काम था और पकड़ा गया। यह वही नहीं है जो मैं ढूंढ रहा था। कोड के साथ किए जाने के बाद मैं बदलना नहीं चाहता हूं। मैं अंदर रहना चाहता हूं क्योंकि मैं अंदर हूं। हालांकि, मैंने आपके उत्तर से बहुत कुछ सीखा, इसलिए धन्यवाद। – WiFO215

0

यदि आप "पर्यावरण जागरूकता" की तलाश में हैं और यदि इसका मतलब है कि "क्या मैं लेटेक्स फ़ाइल में हूं?" आप के साथ व्यवहार सक्षम कर सकते हैं।

विम फ़ाइल प्रकार की एक धन को पहचानता है और आप ऐसा करके सुनिश्चित करें कि फ़ाइल प्रकार आप संपादन कर रहे डिफ़ॉल्ट रूप से मान्यता प्राप्त है बना सकते हैं:

:echo &filetype 

एक अजगर फ़ाइल संपादित करते समय, मैं एक परिणाम के रूप python मिलता है। आप केवल लेटेक्स के लिए इस की जरूरत है और आपको लगता है कि विम चर से एक संतोषजनक प्रतिक्रिया प्राप्त हैं, तो आप एक autocommand कि का उपयोग करता है सेट कर सकते हैं, अन्यथा आप उस में एक्सटेंशन निर्दिष्ट कर सकते हैं, यह इस प्रकार दिखाई देगा:

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

कहाँ RedPost, NewFile और दर्ज कुछ संभव विम बातचीत जब फ़ाइल एक्सटेंशन .text या .latex में खत्म हो कि आपके MyFunction ट्रिगर किया जाएगा रहे हैं

आप वास्तव में क्या जरूरत है कुछ कोड उदाहरण क्या करेंगे वह यह है कि यदि आपके वर्णन राज्यों, तो शायद कोनर के जवाब बेहतर अनुकूल है।

+2

"पर्यावरण" द्वारा, पोस्टर का अर्थ है सिंटैक्स द्वारा निर्धारित लाटेक्स फ़ाइल का एक विशेष क्षेत्र, फ़ाइल प्रकार नहीं। –

2

यह एक बहुत ही रोचक सवाल है, लेकिन मुझे यकीन नहीं है कि आपका सुझाया गया दृष्टिकोण सबसे अच्छा तरीका है! मैंने एक जवाब का प्रयास किया है, लेकिन यह पहला पुनरावृत्ति सही नहीं हो सकता है। मुझे लगता है कि एक लाटेक्स पर्यावरण \begin और \end कमांड द्वारा सीमित है (मेरा लाटेक्स थोड़ा जंगली है!)।

सबसे पहले आपको कर्सर की स्थिति के वातावरण को वापस करने के लिए एक फ़ंक्शन की आवश्यकता है।नीचे मेरा कार्य पिछले \begin कमांड पर कूदता है, फिर \end कमांड से आगे बढ़ता है, यह गणना करता है कि कर्सर इस क्षेत्र के अंदर है या नहीं, और जब तक कोई वातावरण नहीं मिलता है तब तक प्रक्रिया जारी रखती है। यह नेस्टेड वातावरण को संभालना चाहिए। यदि लाटेक्स पर्यावरण में नहीं है, तो खाली स्ट्रिंग लौटा दी जाती है।

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 

तो फिर तुम टेक्स फ़ाइलों के लिए डालने मोड में = (पुन: मैप कर सकते हैं केवल)

autocmd FileType tex inoremap <silent> = <c-r>=TeXEquals()<CR> 

यह मेरे उदाहरण LaTeX फ़ाइल में काम करता प्रतीत होता है। अगर आपको कोई समस्या आती है, या सुधार के लिए कोई विचार है तो मुझे बताएं।

संबंधित मुद्दे