একক ভিমে বাফারে দুটি ভিন্ন রঙের ব্যাকগ্রাউন্ড ব্যবহার করা কি সম্ভব?


20

আমি এই উত্সাহী পাঠ্য উদাহরণের মতো প্রসঙ্গের উপর নির্ভর করে একটি একক ভিম বাফারের ভিতরে দুটি পৃথক ব্যাকগ্রাউন্ড রঙ প্রয়োগ করার একটি সম্ভাব্য সমাধান খুঁজছি ।

এর একটি ব্যবহারের ক্ষেত্রে হ'ল মার্কআপ ফাইলগুলির মধ্যে কোড স্নিপেটগুলি আলাদাভাবে রঙ করা যাতে তারা আরও দাঁড়ায়।

যাইহোক আমি সেটআপের মতো উদাহরণটি কখনও দেখিনি।

এটি কি ভিএম-তে আদৌ সম্ভব?


2
এর উত্তরটি সত্যিই জানতে চাই, আমি প্রস্তাব দেব যে এসটিওতে
নিক জে অ্যাডামস

উত্তর:


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                      

আপনি অবশ্যই রঙগুলি আপনার পছন্দ অনুযায়ী সামঞ্জস্য করতে পারেন ;-)

তারপরে, এটি আপনার ভিআমআরসি-তে যুক্ত করুন:

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()                            

আমি কোড লাইন বাই লাইন ব্যাখ্যা করতে যাচ্ছি না, মন্তব্যগুলি এর সাধারণ বক্তব্যটি পরিষ্কার করে দেওয়া উচিত ;-)


এই উত্তরের জন্য ধন্যবাদ। @ রিচের দেওয়া প্রাথমিক উত্তরের পরিবর্তে আমি এটি গ্রহণ করেছি কারণ এটি আরও সম্পূর্ণ বলে মনে হয়েছে। আমি এটি চেষ্টা করে দেখব তবে নিশ্চিত নয় যে আমি এটি ব্যবহার করব কিনা সমস্ত পার্শ্ব প্রতিক্রিয়াগুলির কারণে তাই এখানে কোনও প্রতিশ্রুতি নেই :) বিগ সমস্ত প্রচেষ্টা করার জন্য আপনাকে ধন্যবাদ!
করোলিস কনসেভিয়াস

1
@ ক্যারোলিসকনসেভিয়াস ধন্যবাদ আমি আমার vimrc হিসাবে এটি যুক্ত করেছিলাম। এটি দুর্দান্ত বলে মনে হচ্ছে :-) আপনার যদি সমস্যা হয় তবে আমাকে জানান।
মার্টিন টর্নয়েজ

Hahaha। ঠিক আছে আমি মনে করি এটি হ্যাকির মতো যোগ্যতা অর্জন করেছে, তবে এটি আমার প্রত্যাশার মতো ভয়াবহ নয়। সুন্দর কাজ. অবশ্যই, এখন আপনি যে এতদূর চলে গেছেন, আপনি কি জে, কে, $ ইত্যাদির সাথে রিম্যাপ করে সমস্যাগুলি ঠিক করতে এবং ইয়ঙ্কিংয়ের আগে সাদা স্থান অপসারণ করতে বাধ্য হন না? ;)
ধনী

2
রিচ হ্যাঁ, এটি হ্যাক। এটি করতে মজাদার করেছে ;-) কিছু কীগুলি (কোনওভাবে) ঠিক করার সাথে সাথে আমার মনও অতিক্রম করেছে, তবে আমি ইতিমধ্যে এই বিষয়ে বেশ কিছুটা সময় ব্যয় করেছি এবং প্রথমে দেখতে চাই যে এটি আদৌ কার্যকর হয় কিনা, এবং যদি আমি এমনকি এটির মতো আরও বেশি সময় ব্যয় করার আগে এটি পছন্দ করুন :-)
মার্টিন টর্নয়েজ

2
@ কারপেটসমোকার ওয়েল শেষবারের মতো আমি অস্পষ্টভাবে ইঙ্গিত দিয়েছিলাম যে কোনও কিছু সম্ভব হতে পারে আপনি চলে গিয়েছিলেন এবং তৈরি করেছেন, তাই আমি কয়েক সপ্তাহের মধ্যে আপনার দৃ multi় বহু-ভাষা সমাধান দেখার অপেক্ষায় রয়েছি।
ধনী

13

সিনট্যাক্স-হাইলাইট উপাদানগুলির জন্য পৃথক পটভূমির রঙ ব্যবহার করা অবশ্যই সম্ভব। আপনার কমান্ডের রং guibgএবং ctermbgবর্ণগুলি কেবল সংজ্ঞায়িত করুন hilight। প্রাক্তনটি জিইউআই ভিমের জন্য পটভূমি রঙ এবং টার্মিনাল ভিমের জন্য দ্বিতীয় সেট করে।

তবে, এটির গুরুত্বপূর্ণ সীমাবদ্ধতা রয়েছে যে এটি কেবলমাত্র ফাইলগুলিতে বিদ্যমান অক্ষরগুলির জন্য পটভূমি রঙ সেট করতে পারে।

এর ফলাফলটি হ'ল ব্যাকগ্রাউন্ডের রঙটি উইন্ডোর প্রান্তে কোনও লাইনের পাঠের শেষের প্রান্তে প্রসারিত করতে পারে না, সুতরাং আপনার উদাহরণে প্রদর্শিত কোড ব্লকের রঙিনকরণ সম্ভব নয়:

ভিমে ব্যাকগ্রাউন্ড কালারিংয়ের একটি উদাহরণ

আপনি সাইন বৈশিষ্ট্যটি ব্যবহার করে পুরো লাইনের পটভূমি রঙ পরিবর্তন করতে পারেন। (দেখুন linehl:help sign.txt)

লক্ষণগুলি সহ পটভূমি রঙ করার একটি উদাহরণ

তবে, নোট করুন:

  1. এটি করার জন্য প্রতিটি লাইনে চিহ্নের জন্য লিখিত কোডের প্রয়োজন যা রঙিন হওয়া দরকার এবং এগুলি ফাইলের বিষয়বস্তু পরিবর্তনের হিসাবে আপডেট করা থাকে,

  2. ডিফল্টরূপে, একটি চিহ্ন রাখার সময়, সাইন কলামটি উইন্ডোটির বাম দিকে প্রদর্শিত হবে। SignColumnহাইলাইট গোষ্ঠীর সাথে সাইন কলামের রঙ পরিবর্তন করা সম্ভব এবং ভিমের আরও সাম্প্রতিক সংস্করণগুলিতে এটি সম্পূর্ণরূপে মুছে ফেলা যায়। (দেখুন :help 'signcolumn'।)

উদাহরণস্বরূপ, (আরও দৃust় ) চিহ্ন চিহ্নটি ব্যবহার করার জন্য কার্পেটস্মোকারের সমাধানটি মানিয়ে নিতে , আপনি নিম্নলিখিতগুলি করতে পারেন:

" 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 এর DynamicSigns প্লাগইন এই উদ্দেশ্যে সহজ জন্য সাইন ফিচার ব্যবহার করে তোলে: তিনি বর্ণনা কিভাবে তা করতে এটি ব্যবহার এই উত্তর


1
একটি উত্তর জন্য +1। তবে (এবং আমি ভুল হলে আমাকে সংশোধন করি) তবে guibgকেবল জিভিমের পক্ষে কাজ করে, এটি কি ঠিক?
ক্যারোলিস কনসেভিয়াস

1
@ কারোলিস হ্যাঁ টার্মিনালের জন্য ভিম আপনাকে ব্যবহার করা দরকার ctermbg, যেমনটি বলা হয়েছে।
ধনী

1
আপনি যদি ভাঁজ ব্যবহার করেন, তবে আপনি যা চান তা পাবেন: ভাঁজগুলির আলাদা আলাদা বিজি রঙ থাকে তবে, স্পেস অক্ষরগুলির সাথে ব্যাকগ্রাউন্ডটি পূরণ করে এটি সম্পন্ন হয় যার আলাদা বিগ রঙ সেট রয়েছে ... এটি কিছু পার্শ্ব-প্রতিক্রিয়া সৃষ্টি করে: অনুলিপি / পেস্ট সঠিকভাবে আর কাজ করবে না (যেহেতু এটি অনেকগুলি স্পেস ক্যারেক্টারও অনুলিপি করবে, এটি আপনি নিজের জন্য যাচাই করতে পারেন)।
মার্টিন টর্নয়েজ

@ ধনী, উত্তরের জন্য ধন্যবাদ। যদিও এটি কোনও নিখুঁত সমাধান নয় (ব্লকগুলি হাইলাইট করার শর্তে) এটি সম্পূর্ণরূপে প্রশ্নের উত্তর দেয় যে এটি সম্ভব। উত্তর গৃহীত হয়েছে।
কারোলিস কনসেভিয়াস

3
কেউ এরকম স্ক্রিপ্ট লিখতে সত্যিই পাগল হতে হবে ।
জোয়েটউইল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.