ভিম সিনট্যাক্স অঞ্চলগুলি কি স্পর্শ / ওভারল্যাপে তৈরি করা যায়?


13

তাই কিছুক্ষণ আগে আমি নিজের তৈরি করে ভিএম এর সিনট্যাক্স ফাইলগুলি কীভাবে কাজ করে সে সম্পর্কে আরও জানার সিদ্ধান্ত নিয়েছিলাম। আমার লক্ষ্যটি ছিল একটি সাধারণ সিনট্যাক্স ফাইল তৈরি করা যা ফাইলটিকে ডিলিমিটরের উপর ভিত্তি করে 3 ভাগে বিভক্ত করে এবং সেই তিনটি অংশের মধ্যে দুটির জন্য প্রাক-বিদ্যমান সিনট্যাক্স ফাইল অন্তর্ভুক্ত করে।

এটি একটি উদাহরণ ফাইল:

Some text, unstyled

==================== Log
(Output of git log)

==================== Diff
(Output of diff)

লক্ষ্যটি ছিল দুটি হেডার বাদ দিয়ে কেবল লগতে git.vimএবং diff.vimকেবলমাত্র ডিফের জন্য প্রয়োগ করা । 1 আমার সিনট্যাক্স ফাইলটি এমনভাবে দেখা শেষ হয়েছিল:

if exists("b:current_syntax")
    finish
endif

syntax include @gitlog $VIMRUNTIME/syntax/git.vim
syntax region GitLog
    \ start=/^===* Log/
    \ end=/^===* Diff/
    \ contains=@gitlog

syntax include @gitdiff $VIMRUNTIME/syntax/diff.vim
syntax region Diff
    \ start=/^===* Diff/
    \ end=/\n\n/
    \ contains=@gitdiff

let b:current_syntax = "logdiff"

endপ্রথম অঞ্চলে কীভাবে startদ্বিতীয় অঞ্চলের মতো একই তা লক্ষ্য করুন । এটি কাজ করে না; দ্বিতীয় অঞ্চলটি দৃশ্যত সনাক্ত করা যায় নি এবং সিনট্যাক্স হাইলাইটিং প্রয়োগ করা হয়নি।

আমি Regex স্খলন দ্বারা এটি কাজ করতে পারে end=/^===/এবং start=/=== Diff/যাতে অঞ্চলে স্পর্শ করবে না, কিন্তু বিশেষ করে যে মত করবেন না - এটি কম আবশ্যিক যে এক কোথা থেকে শুরু করার জন্য অন্য প্রান্ত অনুমিত হয় না।

দুটি অঞ্চলের সংজ্ঞা একই অক্ষরগুলিকে স্পর্শ করার অনুমতি দেওয়ার কোনও উপায় আছে (এবং / অথবা সমেতের পরিবর্তে ম্যাচিং এজগুলি একচেটিয়া করে তুলুন) অথবা আমি লুজ রেজেক্সের সাথে আটকে আছি?

1 (হ্যাঁ, আমি জানি git.vimঅন্তর্ভুক্ত diff.vim, তবে এটি ছিল একটি শেখার অনুশীলন)


আমি মনে করি এটি প্রান্তকে একচেটিয়া (দেখুন :h :syn-pattern-offset) তৈরির জন্য "অঞ্চল শেষ" অফসেট ব্যবহার করে বা ফাইলের শেষ প্রান্তে গিটলগ অঞ্চল পরিবর্তন করে এবং ডিফ অঞ্চলটি সম্পূর্ণরূপে গিটলগ অঞ্চলে থাকতে পারে । যদিও আমি এই পদ্ধতির কোনওটিই কাজ করতে পারি না।
ধনী

এটি পরীক্ষা করা এই বিষয়টিকে কিছুটা শক্ত করে তুলেছিল - যেমন আপনি লক্ষ্য করেছেন - git.vim ইতিমধ্যে পৃথক আউটপুট হাইলাইট করে। সেই অনুসারে আপনার উদাহরণটি পাল্টানোর কোনও ধারণা হতে পারে!
ধনী

উত্তর:


4

পরের ম্যাচটি কোথায় শুরু করতে হবে তা আপনি ভিম রেজেক্স ইঞ্জিনকে বলতে পারেন।

এখনও অবধি আমি জানি 2 টি উপায় রয়েছে:

  1. \zeম্যাচের শেষ সেট করতে ব্যবহার করুন :

    syntax region GitLog
        \ start=/^===* Log/
        \ end=/\ze^===* Diff/
        \ contains=@gitlog
    
  2. ইতিবাচক চেহারাটি ব্যবহার করুন \@=, যাকে ভিমে শূন্য-প্রস্থের মিল বলে:

    syntax region GitLog
        \ start=/^===* Log/
        \ end=/\(^===* Diff\)\@=/
        \ contains=@gitlog
    

তাই শেষ অফ ম্যাচ "পয়েন্টার" শুরুতে rewinds ধরনের ^===* Diffলাইন, যেমন যে region Diffএর startতার ম্যাচিং শুরু হবে ^===* Diffআবার লাইন।

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