क्या एक एकल विम बफर में दो अलग-अलग रंग पृष्ठभूमि का उपयोग करना संभव है?


20

मैं इस उदात्त पाठ उदाहरण में संदर्भ के आधार पर एक एकल बफर के अंदर दो अलग-अलग पृष्ठभूमि रंगों को लागू करने के लिए एक संभावित समाधान की तलाश कर रहा हूं ।

इसका एक उपयोग मामला मार्कअप फ़ाइलों के अंदर कोड स्निपेट को अलग-अलग तरीके से रंगना है ताकि वे अधिक बाहर खड़े रहें।

हालाँकि मैंने कभी भी इस तरह के सेटअप के साथ एक उदाहरण नहीं देखा है।

क्या यह सब संभव है?


2
वास्तव में इसका उत्तर जानना चाहते हैं, तो मैं सुझाव दूंगा कि एसओ पर इस पोस्ट को हाइलाइट करने के साथ यह संभव होगा। प्रासंगिक stackoverflow.com/questions/7033310/…
निक जे एडम्स

जवाबों:


9

क्योंकि मैं उत्सुक था कि यह कितना अच्छा काम करेगा, मैंने एक साथ कुछ हैक किया है जो काम करता है।

यहां छवि विवरण दर्ज करें

जैसा कि पहले उत्तर में टिप्पणियों में उल्लेख किया गया है, ऐसा करने का एकमात्र तरीका रिक्त स्थान वाले क्षेत्रों को भरना है; हम जैसा करते हैं वैसा ही है; लिखने से पहले, हम इन रिक्त स्थान को हटा देते हैं, इसलिए आपको इसके साथ किसी और को परेशान नहीं करना चाहिए।

ध्यान दें कि यह उदाहरण मार्कडाउन फिलाटाइप के लिए बहुत विशिष्ट है!

दुष्प्रभाव :

  • पाठ को कॉपी करना बहुत सारे रिक्त स्थान की प्रतिलिपि भी बनाएगा
  • उपयोग करना $और Endअपेक्षा के अनुरूप काम नहीं करना (यह कॉलम 80 तक जाता है), और कुंजी जैसे कि jऔर kअलग व्यवहार भी करते हैं।
  • 'list'सक्षम होने पर पृष्ठभूमि प्रदर्शित नहीं होती है
  • पूरी तरह से खाली लाइनें काम नहीं करती हैं, आपको मैन्युअल रूप से एक टैब या 4 रिक्त स्थान जोड़ने की आवश्यकता है
  • ... शायद अधिक?

सबसे पहले, आपको इसे अपने साथ जोड़ना होगा ~/.vim/after/syntax/markdown.vim:

syn clear markdownCodeBlock                                                 
syn region markdownCodeBlock start="    \|\t" end="$"                       
hi def markdownCodeBlock ctermbg=230 guibg=lightyellow                      

आप अपनी पसंद के अनुसार रंगों को समायोजित कर सकते हैं;

फिर, इसे अपने vimrc में जोड़ें:

fun! MarkdownBlocks()                                                       
    fun! s:fill(line)                                                       
        " Remove all trailing whitespace                                    
        let l:line = substitute(a:line, " *$", "", "")                      

        " Add trailing whitespace up to 'textwidth' length                  
        return l:line . repeat(' ', (&tw > 0 ? &tw : 80) - strdisplaywidth(l:line))
    endfun                                                                  

    " Get all lines in a list                                               
    let l:lines = getline(1, line('$'))                                     

    " Map s:fill() to the lines that are a code block                       
    call map(l:lines, 'v:val[0] == "\t" || v:val[:3] == "    " ? s:fill(v:val) : v:val')

    " Reset the buffer to the lines                                         
    call setline(1, l:lines)                                                
endfun                                                                      

" Remove all the trailing spaces                                            
fun! MarkdownBlocksClean()                                                  
    let l:save_cursor = getpos(".")                                         
    silent %s/^\(    \|\t\)\(.\{-}\)\( *\)$/\1\2/e                          
    call setpos('.', l:save_cursor)                                         
endfun                                                                      
au BufWritePre *.markdown call MarkdownBlocksClean()                        

" Set spaces on loading the file, leaving insert mode, and after writing it 
au FileType markdown call MarkdownBlocks()                                  
au InsertLeave *.markdown call MarkdownBlocks()                             
au BufWritePost *.markdown call MarkdownBlocks()                            

मैं कोड लाइन-बाय-लाइन की व्याख्या नहीं करने जा रहा हूं, टिप्पणियों को इसे स्पष्ट करना चाहिए;;


इस उत्तर के लिए धन्यवाद। मैंने @Rich द्वारा दिए गए प्रारंभिक उत्तर के बजाय इसे स्वीकार कर लिया क्योंकि यह अधिक पूर्ण लग रहा था। मैं इसे आज़माऊंगा, लेकिन यकीन नहीं कि अगर मैं इसका उपयोग सभी दुष्प्रभावों के कारण करूंगा, तो यहां कोई वादा नहीं है :) सभी प्रयासों के लिए बहुत धन्यवाद!
करोलिस कोनसेविसियस

1
@ KarolisKoncevičius धन्यवाद। मैंने इसे अपने vimrc aswell में जोड़ा। यह अच्छा लगता है :-) यदि आप समस्याओं का सामना करते हैं तो मुझे बताएं।
मार्टिन टूरनोइज

Hahaha। वैसे मुझे लगता है कि यह हैकी के रूप में योग्य है, लेकिन यह उतना भयानक नहीं है जितना मुझे उम्मीद थी। अच्छी नौकरी। बेशक, अब जब आप यह बहुत दूर चले गए हैं, तो क्या आप जे, के, $ इत्यादि के साथ समस्याओं को ठीक करने, और उन्हें हटाने से पहले सफेद स्थान को हटाने के लिए मजबूर महसूस नहीं करते हैं? ;)
रिच

2
@Rich हाँ, यह एक हैक है। कि ऐसा करने में मज़ा आया;; यह भी पसंद है, उस पर और भी अधिक समय बिताने से पहले :-)
मार्टिन टूरनोइज

2
@Carpetsmoker पिछली बार जब मैंने अस्पष्ट रूप से संकेत दिया था कि कुछ संभव हो सकता है कि आप चले गए और इसे बनाया, तो मैं एक और दो सप्ताह में आपके मजबूत बहु भाषा समाधान को देखने के लिए उत्सुक हूं।
रिच

13

सिंटैक्स-हाइलाइट किए गए तत्वों के लिए एक अलग पृष्ठभूमि रंग का उपयोग करना निश्चित रूप से संभव है। बस guibgऔर ctermbgरंग को अपनी hilightकमांड में परिभाषित करें । पूर्व जीयूआई विम के लिए पृष्ठभूमि रंग सेट करता है, और टर्मिनल विम के लिए उत्तरार्द्ध।

हालांकि, यह महत्वपूर्ण सीमा है कि यह केवल उन पात्रों के लिए पृष्ठभूमि रंग निर्धारित कर सकता है जो वास्तव में फ़ाइल में मौजूद हैं।

इसका नतीजा यह है कि पृष्ठभूमि का रंग खिड़की के किनारे तक एक पंक्ति में पाठ के अंत को आगे नहीं बढ़ा सकता है, इसलिए आपके उदाहरण में दिखाए गए कोड ब्लॉक का रंग संभव नहीं है:

विम में संभव रंग पृष्ठभूमि का एक उदाहरण

आप साइन सुविधा का उपयोग करके संपूर्ण लाइनों की पृष्ठभूमि का रंग भी बदल सकते हैं। (देखें linehlमें :help sign.txt)

संकेतों के साथ पृष्ठभूमि को रंग देने का एक उदाहरण

हालाँकि, ध्यान दें कि:

  1. ऐसा करने के लिए प्रत्येक लाइन पर संकेतों को रखने के लिए कोड लिखने की आवश्यकता होती है, जिसे रंगीन करने की आवश्यकता होती है और इन्हें फ़ाइल की सामग्री के परिवर्तन के रूप में अपडेट किया जाता है,

  2. डिफ़ॉल्ट रूप से, साइन करते समय, साइन कॉलम को विंडो के बाईं ओर प्रदर्शित किया जाएगा। SignColumnहाइलाइट समूह के साथ साइन कॉलम के रंग को बदलना संभव है , और विम के अधिक हाल के संस्करणों में इसे पूरी तरह से हटाया जा सकता है। (देखें :help 'signcolumn'।)

उदाहरण के लिए, (अधिक मजबूत) साइन मैकेनिज्म का उपयोग करने के लिए कार्पेटस्मोकर के समाधान को अनुकूलित करने के लिए , आप निम्नलिखित कार्य कर सकते हैं:

" Define a highlight group and a sign that uses it
highlight default markdownCodeBlock ctermbg=230 guibg=lightyellow
sign define codeblock linehl=markdownCodeBlock

" Use signs to highlight code blocks
function! MarkdownBlocks()
    function! s:applySign(idx, val)
        if a:val[0] == "\t" || a:val[:3] == "    "
            let l = a:idx + 1
            execute "sign place " . l . " line=" . l . " name=codeblock file=" . expand("%:p")
        endif
    endfunction

    " Remove old signs
    execute "sign unplace * file=" . expand("%:p")

    " Get all lines in a list
    let l:lines = getline(1, line('$'))
    " Add new signs
    call map(l:lines, function('s:applySign'))
endfunction

" Set signs on loading the file, leaving insert mode, and after writing it
au FileType markdown call MarkdownBlocks()
au InsertLeave *.markdown call MarkdownBlocks()
au BufWritePost *.markdown call MarkdownBlocks()

यह कुछ हद तक कोड को सरल करता है, और कार्पेटस्मोकर के संस्करण की तुलना में बहुत कम है।

@ChristianBrabandt का डायनामिकसाइनस प्लगइन इस उद्देश्य के लिए साइन सुविधा का उपयोग करना आसान बनाता है: वह बताता है कि इस उत्तर में ऐसा करने के लिए इसका उपयोग कैसे करें ।


1
एक जवाब के लिए +1। हालाँकि (अगर मैं गलत हूँ तो मुझे सुधारें) लेकिन guibgकेवल gvim के लिए काम करता है, क्या यह सही है?
करोलिस कोन्सेविअस

1
@ करोलिस हां। टर्मिनल विम के लिए आपको उपयोग करने की आवश्यकता है ctermbg, जैसा कि कहा गया है।
अमीर

1
यदि आप सिलवटों का उपयोग करते हैं, तो आपको वह मिलता है जो आप चाहते हैं: सिलवटों का एक अलग बीजी रंग है, हालांकि, यह अंतरिक्ष वर्णों के साथ पृष्ठभूमि को भरने के द्वारा पूरा किया जाता है, जिसमें एक अलग बीजी रंग सेट होता है ... यह कुछ दुष्प्रभाव का कारण बनता है: प्रतिलिपि / पेस्ट अब ठीक से काम नहीं करेगा (क्योंकि यह बहुत सारे अंतरिक्ष वर्णों को भी कॉपी करेगा, यह भी है कि आप इसे अपने लिए कैसे सत्यापित कर सकते हैं)।
मार्टिन टूरनोइज

@ रीच, उत्तर के लिए धन्यवाद। हालांकि, यह एक सही समाधान नहीं है (हाइलाइटिंग ब्लॉकों की अवधि में) यह पूरी तरह से इस सवाल का जवाब देता है कि यह संभव है। उत्तर स्वीकृत।
करोलिस कोनसेविसियस

3
किसी को इस तरह स्क्रिप्ट लिखने के लिए वास्तव में पागल होना होगा ।
joeytwiddle
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.