تسليط الضوء على Vim Markdown (عناصر القائمة وتعارضات كتلة التعليمات البرمجية)

StackOverflow https://stackoverflow.com/questions/137952

سؤال

قررت أن أتعلم المزيد عن vim وإبراز تركيبه.باستخدام أمثلة للآخرين، أقوم بإنشاء ملف بناء الجملة الخاص بي لـ Markdown.لقد رأيت mkd.vim ولها هذه المشكلة أيضا.مشكلتي تكمن بين عناصر القائمة وتسليط الضوء على كتلة التعليمات البرمجية.

كتلة الكود تعريف:

  • السطر الأول فارغ
  • يبدأ السطر الثاني بما لا يقل عن 4 مسافات أو علامة تبويب واحدة
  • يتم الانتهاء من الكتلة بخط فارغ

مثال:

Regular text

    this is code, monospaced and left untouched by markdown
    another line of code

Regular Text

بناء جملة Vim الخاص بي لكتلة التعليمات البرمجية:

syn match mkdCodeBlock   /\(\s\{4,}\|\t\{1,}\).*\n/ contained nextgroup=mkdCodeBlock  

hi link mkdCodeBlock  comment

ترتيب عنصر القائمة تعريف:

  • السطر الأول فارغ
  • السطر الثاني يبدأ بـ [-+*] متبوعا بمسافة
  • تنتهي القائمة بسطر فارغ ثم بخط عادي (غير مدرج في القائمة).
  • بين البنود يمكن إضافة أي عدد من الأسطر الفارغة
  • يتم تحديد قائمة فرعية عن طريق المسافة البادئة (4 مسافات أو علامة تبويب واحدة)
  • سطر من النص العادي بعد تضمين عنصر القائمة كاستمرار لعنصر القائمة هذا

مثال:

Regular text

- item 1

    - sub item 1
    - sub item 2
- item 2
this is part of item 2
so is this


- item 3, still in the same list
    - sub item 1
    - sub item 2

Regular text, list ends above

بناء جملة Vim الخاص بي لتعريف عنصر القائمة غير المنظم (أبرز فقط [-+*]):

syn region  mkdListItem start=/\s*[-*+]\s\+/ matchgroup=pdcListText end=".*" contained nextgroup=mkdListItem,mkdListSkipNL contains=@Spell skipnl 
syn match mkdListSkipNL /\s*\n/ contained nextgroup=mkdListItem,mkdListSkipNL skipnl

hi link mkdListItem  operator

لا يمكنني جعل التمييز يعمل مع القاعدتين الأخيرتين للقائمة ومع كتلة التعليمات البرمجية.

هذا مثال يكسر تسليط الضوء على بناء الجملة الخاص بي:

Regular text

- Item 1
- Item 2
part of item 2

    - these 2 line should be highlighted as a list item
    - but they are highlighted as a code block

لا أستطيع حاليًا معرفة كيفية جعل التمييز يعمل بالطريقة التي أريدها أيضًا


نسيت إضافة قاعدة بناء الجملة "العالمية" المستخدمة في كلتا القاعدتين المذكورتين أدناه.إنه للتأكد من أنها تبدأ بسطر فارغ.

syn match mkdBlankLine   /^\s*\n/    nextgroup=mkdCodeBlock,mkdListItem transparent

ملاحظة أخرى:كان ينبغي أن يكون أكثر وضوحا.في ملف بناء الجملة الخاص بي، تظهر قواعد القائمة قبل قواعد الاقتباس


هل كانت مفيدة؟

المحلول

فقط تأكد من أن تعريف mkdListItem يقع بعد تعريف mkdCodeBlock، مثل هذا:

syn match mkdCodeBlock   /\(\s\{4,}\|\t\{1,}\).*\n/ contained nextgroup=mkdCodeBlock  
hi link mkdCodeBlock  comment

syn region  mkdListItem start=/\s*[-*+]\s\+/ matchgroup=pdcListText end=".*" contained nextgroup=mkdListItem,mkdListSkipNL contains=@Spell skipnl 
syn match mkdListSkipNL /\s*\n/ contained nextgroup=mkdListItem,mkdListSkipNL skipnl
hi link mkdListItem  operator

syn match mkdBlankLine   /^\s*\n/    nextgroup=mkdCodeBlock,mkdListItem transparent

تقول وثائق Vim في :help :syn-define:

"في حالة تطابق أكثر من عنصر في نفس الموقف ، فإن العنصر الذي تم تعريفه في الماضي.وبالتالي ، يمكنك تجاوز عناصر بناء الجملة المحددة مسبقًا باستخدام عنصر يطابق نفس النص.لكن الكلمة الرئيسية تذهب دائمًا قبل المباراة أو المنطقة.وتذهب كلمة رئيسية مع حالة مطابقة دائمًا قبل كلمة رئيسية مع تجاهل الحالة. "

نصائح أخرى

كان hcs42 صحيحًا.أتذكر قراءة هذا القسم الآن، لكنني نسيته حتى ذكرني به hcs24.

إليك بناء الجملة المحدث (بعض التعديلات الأخرى) الذي يعمل:

"""""""""""""""""""""""""""""""""""""""
" Code Blocks:

"   Indent with at least 4 space or 1 tab
"   This rule must appear for mkdListItem, or highlighting gets messed up
syn match mkdCodeBlock   /\(\s\{4,}\|\t\{1,}\).*\n/ contained nextgroup=mkdCodeBlock  

"""""""""""""""""""""""""""""""""""""""
" Lists:

"   These first two rules need to be first or the highlighting will be
"   incorrect

"   Continue a list on the current line or next line
syn match mkdListCont /\s*[^-+*].*/ contained nextgroup=mkdListCont,mkdListItem,mkdListSkipNL contains=@Spell skipnl transparent

"   Skip empty lines
syn match mkdListSkipNL /\s*\n/ contained nextgroup=mkdListItem,mkdListSkipNL 

"   Unorder list
syn match  mkdListItem /\s*[-*+]\s\+/ contained nextgroup=mkdListSkipNL,mkdListCont  skipnl 

Tao Zhyn، ربما يغطي هذا حالات الاستخدام الخاصة بك ولكنه لا يغطي بناء جملة Markdown.في تخفيض السعر عنصر القائمة استطاع تحتوي على كتلة التعليمات البرمجية.يمكنك إلقاء نظرة على الحل الخاص بي هنا

ليرة تركية؛دكتور؛المشكلة هي أن vim لا يسمح لك بقول شيء مثل: كتلة لها نفس المسافة البادئة للحاوية + 4 مسافات.الحل الوحيد الذي وجدته هو إنشاء قواعد لكل نوع من الكتل التي يمكن تضمينها في عناصر القائمة لكل مستوى من المسافة البادئة (في الواقع أنا أدعم 42 مستوى من المسافة البادئة ولكنه رقم عشوائي)

لذلك لدي markdownCodeBlockInListItemAtLevel1 ذلك يجب يجب تضمينها في markdownListItemAtLevel1 ويجب أن تحتوي على 8 مسافات بادئة على الأقل، ومن ثم markdownCodeBlockInListItemAtLevel2 يجب يجب أن تكون موجودة في markdownListItemAtLevel2 التي يجب أن تكون موجودة في markdownListItemAtLevel1 تحتاج النملة إلى 10 مسافات بادئة على الأقل، إلخ...

أعلم أنه قد مرت بضع سنوات ولكن ربما يعتبر شخص ما هذه الإجابة مفيدة نظرًا لأن كل بناء الجملة المبني على المسافة البادئة يعاني من نفس المشكلة

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top