2011-03-04 12 views
8

मैं एक विम धोखा शीट प्लगइन बनाना चाहता हूं। यह वास्तविक सरल है:विम स्क्रिप्ट: बफर/चीटशीट टॉगल

  • मैं अपनी चीटशीट टॉगल करना चाहता हूं। टैगलिस्ट या एनईआरडीटी जैसे एक वर्टप्लिट टॉगल।
  • मैं चाहता हूं कि चीटशीट फ़ाइल प्रकार विशिष्ट हो। इसलिए जब मैंने एक .cpp फ़ाइल खोली है तो मैंने अपनी सी ++ चीटशीट टॉगल की है।
  • मैं चाहता हूं कि चीटशीट क्षैतिज रूप से विभाजित हो। तो यह दो फाइलें दिखाता है, मेरी सिंटैक्स धोखा शीट और मेरी स्निपेट ट्रिगर धोखा शीट।

मेरे पास पहले से ही इन चीटशीट्स का संग्रह है, विमहेल्प प्रारूप में, लेकिन अब मुझे उन्हें मैन्युअल रूप से खोलना है।

मैंने वास्तव में कोई भी विम स्क्रिप्टिंग नहीं किया है, लेकिन मुझे लगता है कि यह एक साथ रखना वास्तव में आसान होगा। मैं असंबंधित codesnippets googling के sorta बीमार हूँ, तो क्या मैं यहाँ पूछ रहा हूँ है:

  1. किसी को भी मुझे क्या मैं इस एक साथ टुकड़ा करने vim पटकथा के संबंध में सीखने की जरूरत है की एक छोटी राशि-हार कर सके । मुझे जो मुश्किल समय मिल रहा है वह बफर विंडो को टॉगल करना है।

  2. यदि आप सामग्री को शामिल करने वाले किसी भी परिचय ट्यूटोरियल को जानते हैं तो मुझे इसे प्राप्त करने और चलाने की आवश्यकता है, कृपया एक लिंक प्रदान करें।

tx,

aktivb

उत्तर

2

मैं इस बारे में भूल गया था जब तक मुझे एडुआन के उत्तर के बारे में कोई सूचना नहीं मिली। चूंकि मैंने इस सवाल को पोस्ट किया है, मैंने काम करने के लिए इसे प्राप्त करने सहित बहुत कुछ विम स्क्रिप्टिंग किया है:

let g:cheatsheet_dir = "~/.vim/bundle/cheatsheet/doc/"                  
let g:cheatsheet_ext = ".cs.txt" 

command! -nargs=? -complete=customlist,CheatSheetComplete CS call ToggleCheatSheet(<f-args>)   
nmap <F5> :CS<CR> 

" strip extension from complete list  
function! CheatSheetComplete(A,L,P) 
    return map(split(globpath(g:cheatsheet_dir, a:A.'*'.g:cheatsheet_ext)),       
     \ "v:val[".strlen(expand(g:cheatsheet_dir)).              
     \ ":-".(strlen(g:cheatsheet_ext) + 1)."]")                
endfun 

" specify cheatsheet or use filetype of open buffer as default 
" instead of saving window status in a boolean variable, 
" test if the file is open (by name). If a boolean is used, 
" you'll run into trouble if you close the window manually with :wq etc       
function! ToggleCheatSheet(...) 
    if a:0  
    let s:file = g:cheatsheet_dir.a:1.g:cheatsheet_ext 
    else          
    if !exists("s:file") || bufwinnr(s:file) == -1                     
     let s:file = g:cheatsheet_dir.&ft.g:cheatsheet_ext 
    endif 
    endif          
    if bufwinnr(s:file) != -1 
    call ToggleWindowClose(s:file) 
    else 
    call ToggleWindowOpen(s:file) 
    endif     
endfun    


" stateless open and close so it can be used with other plugins    
function! ToggleWindowOpen(file)   
    let splitr = &splitright 
    set splitright       
    exe ":vsp ".a:file 
    exe ":vertical resize 84" 
    if !splitr  
    set splitright 
    endif       
endfun 

function! ToggleWindowClose(file)  
    let w_orig = bufwinnr('%') 
    let w = bufwinnr(a:file) 
    exe w.'wincmd w' 
    exe ':silent wq!'  
    if w != w_orig   
    exe w_orig.'wincmd w' 
    endif 
endfun            
2

नीचे समारोह वास्तव में ऐसा कर सकते हैं नहीं आप क्या चाहते हैं, और मैं इसे परीक्षण नहीं किया है, लेकिन यह आप कुछ विचार देना चाहिए।

मुख्य विचार यह है कि फ़ंक्शन वर्तमान बफर की फ़ाइल प्रकार पढ़ता है (आप :echo &ft टाइप करके इसका परीक्षण कर सकते हैं) और उसके बाद उचित धोखा शीट का मार्ग सेट कर सकते हैं। यदि यह अस्तित्व में है, तो इस पथ को तब विभाजित विंडो में (केवल-पढ़ने और गैर-संशोधित) खोला जाता है। फिर आप इस फ़ंक्शन को अपनी इच्छानुसार किसी भी तरह से कॉल कर सकते हैं, उदाहरण के लिए इसे दिखाए गए {F5} कुंजी पर मैप करके।

मुझे टॉगलिंग संभावनाओं के बारे में निश्चित नहीं है (क्या यह सिर्फ विभाजित विंडो को बंद करने से वास्तव में आसान है?) लेकिन आप bufloaded() फ़ंक्शन को देख सकते हैं, जो लौटाता है कि वर्तमान में किसी दिए गए फ़ाइल को एक्सेस किया जा रहा है या नहीं।

function! Load_Cheat_Sheet() 
    let l:ft = &ft 

    if l:ft == 'html' 
     let l:path = 'path/to/html/cheat/sheet' 
    elseif l:ft == 'c' 
     let l:path = 'path/to/c/cheat/sheet' 
    elseif l:ft == 'tex' 
     let l:path = 'path/to/tex/cheat/sheet' 
    endif 

    if l:path != '' && filereadable(l:path) 
     execute ':split +setlocal\ noma\ ro ' l:path 
    endif 
endfunction 

map <F5> :call Load_Cheat_Sheet()<CR> 

उम्मीद है कि इससे मदद मिलती है। अगर कुछ अस्पष्ट है, तो बस चिल्लाओ, या आप और जानना चाहते हैं।

+0

धन्यवाद, यह काफी नहीं है जो मैं ढूंढ रहा हूं, लेकिन यह मुझे शुरू कर दिया।लेकिन हाँ, मैं टॉगल चाहता हूँ। मुझे इसकी आवश्यकता होगी कि अन्य स्क्रिप्ट के लिए मैंने भी योजना बनाई है। – aktivb

+0

@aktivb क्या आपको कभी यह काम मिल रहा है? मैं बिल्कुल वही काम करना चाहता हूं –

1

सोचा कि मैं गौलाश के जवाब में जोड़ूंगा।

मुझे लगता है कि टॉगल को लागू करने के लिए आप बस कुछ बयान और वैश्विक चर का उपयोग करेंगे।

let g:cheatsheet_toggle_on=0 

if (g:cheatsheet_toggle_on == 0) 
    " Turn the cheatsheet on 
    " Also make sure to know that the toggle is on: 
    let g:cheatsheet_toggle_on=1 
elseif (g:cheatsheet_toggle_on=1 
    " Do whatever you need to turn it off, here 
endif 

आशा है कि यह आंकड़े उस तर्क से बाहर निकलें। :)

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