سؤال

لدي ملف، يسمى خطأ في feeletypedetection.r، يحتوي على النص التالي:

# This file is sometimes wrongly detected as a conf file

لدي أيضا نسختين من _vimrc، كنت أعتقد أنها متطابقة للغاية. ومع ذلك، عندما أستخدم الإصدار الأول، تم اكتشاف الملف أعلاه بشكل غير صحيح كملف "Conf"، على الرغم من أنني طلبت خصيصا لجميع الملفات التي تنتهي ب .R ليتم تعيينها إلى FileType = R. عندما أغير الإصدار الثاني (نقل بناء الجملة "نقل" خلف تعريف Agroup)، فإن الكشف يعمل بشكل صحيح مرة أخرى. لاحظ أن هذا هو فقط التكوين لدي (لقد انتقلت vimrc القياسية أثناء تصحيح هذا).

الاصدار الاول:

syntax on
augroup filetypedetect
    autocmd! BufRead,BufNewFile *.r,*.R     setfiletype r
augroup END

الإصدار الثاني:

augroup filetypedetect
    autocmd! BufRead,BufNewFile *.r,*.R     setfiletype r
augroup END
syntax on

يبدو أن VIMRC حساس للغاية لطلب الملفين معينين. لماذا يكون هذا، بالنظر إلى أن أحد الخطوط هو أوتوكوماند سيتم تشغيله لاحقا على أي حال؟ هل هذا خطأ في VIM أو هي هذه ميزة أنني لا أفهمها؟

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

المحلول

الإجابة البسيطة لمشكلتك هي أن هذه الخطوط لا ينبغي أن تكون في vimrc الخاص بك على الإطلاق. الطريقة المدعومة رسميا للتعامل مع هذا هو إنشاء filetype.vim ملف في الخاص بك .vim الدليل الذي يحتوي على ما يلي:

" my filetype file
if exists("did_load_filetypes")
  finish
endif

augroup filetypedetect
  au! BufRead,BufNewFile *.r setfiletype r
augroup END

أما لماذا تصرف الكود الخاص بك كيف يفعل ذلك، فإنه في الواقع أكثر تعقيدا قليلا من تضمين التغريدة يدل.

في الإصدار الأول من الخاص بك vimrc, ، يتم تهيئة الكشف filetype بواسطة الخاص بك syntax on خط. يعمل هذا عن طريق إنشاء Autocmd لإطلاق النار عند وجود ملف مع .r يتم فتح التمديد، وهذا AutoCMD يدعو الوظيفة s:FTr() في filetype.vim.

ومع ذلك، الخاص بك autocmd! خط الكتابة فوق هذه autocmd الموجودة1, ، لذلك s:FTr() وظيفة لا تدير أبدا2. وبعد autocmd الخاص بك ثم حرائق، لكنها لا قم بتعيين FileType، لأن setfiletype يعتقد الأمر أن الملف قد تم تعيين بالفعل3.

بعد ذلك، نظرا لأن النمط لا يزال غير محدد، يحاول VIM تعيين واحد استنادا إلى محتويات الملف، وينتهي الأمر بتعيينه conf اكتب4.

أفضل مرجع لكل هذا هو :help filetype. وبعد وخاصة في قضيتك :help new-filetype و :help remove-filetype. وبعد ال :verbose الأمر مفيد أيضا لمعرفة الإعدادات التي تم تعيينها بواسطة البرنامج النصي.

1: بسبب !. وبعد إذا كنت لإزالة هذا !, ، ثم ستجد إعادة تعيين filetype بشكل صحيح. هذا ليس الحل الصحيح، لأنه عند ذلك، ستتيح تعيين الملف إلى نوع واحد (وتطبيق جميع الإعدادات لهذه الملفات النموذجية) ثم تغييره إلى آخر. إذا لم يتم الكتابة فوق الملف الثاني من هذه الإعدادات، فقد يبقى البعض، قد لا يكون ما تريد.

2: حاول تشغيل :set autocmd BufRead *.r عند استخدام ملفين VIMRC مختلفين. لاحظ الفرق في الإخراج المعطى.

3: انظر :help setfiletype. وبعد لاحظ أنه إذا قمت بتغيير الخط setfiletype r إلى set ft=r في الإصدار الأول من vimrc الخاص بك، الفيليت إرادة يتم تعيين إلى ص. ومع ذلك، انظر الحاشية 1 لماذا هذا ليس هو الحل الأفضل.

4: ... في خط التعليمات البرمجية والذي يتم تعليقه: "تحقق من هذا الأخير، إنه مجرد تخمين"

نصائح أخرى

في الإصدار الأول الخاص بك، بناء جملة على يسبب اكتشاف filetype قبل تمت إضافة أوتوكلاند الخاص بك.

وفقا لهذا الموقع

http://www.build-doctor.com/2008/06/04/how-to-set-the-filetype-in-vim-when-the-extensnt-match/

تحتاج فقط إلى إضافة سطرين من التعليمات البرمجية في ملف .vimrc.

au BufRead,BufNewFile *.R set filetype=r
au BufRead,BufNewFile *.r set filetype=r
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top