اجعل Vim أكثر ذكاءً باستخدام Ctrlp و Ctags

أنا أحب Vim تمامًا ، وأستخدم Vim لجميع عمليات الترميز والكتابة من سنة إلى أخرى. على الرغم من أن المزيد من الأشخاص ، خاصة بالنسبة لأولئك الذين يعملون مع JavaScript ، يفضلون محررات الأكواد الحديثة مثل Sublime Text أو VSCode ، إلا أنني أفضل قضاء بعض الوقت في محاولة جعل لعبتي أكثر ذكاءً.

السيطرة

إذا كنت شخصًا Sublime Text أو Atom أو VSCode ، فيجب عليك استخدام ctrl + pآلاف المرات لتحسين الإنتاجية. حسنًا ، لا تغار إذا كنت من رجال Vim لأن هذا المكون الإضافي الرائع CtrlP سيوفر لك كل ما تحتاجه.

تحقق من هذا المستند الرسمي للتثبيت والإعداد.

Ctags

Ctags هي أداة ستفحص الكود الخاص بك ، وطرق الفهرسة ، والفئات ، والمتغيرات ، والمعرفات الأخرى ، وتخزين الفهرس في ملف العلامات. يحتوي ملف العلامات على علامة واحدة لكل سطر. اعتمادًا على وسيطات سطر الأوامر وتشغيل علامات ctags للغة ، يمكن الحصول على الكثير من المعلومات من هذا الفهرس.

يدعم Ctags حاليًا 41 لغة برمجة ، ومن السهل نسبيًا إضافة تعريفات للمزيد.

تسهل Ctags التنقل في مشروع أكبر ، خاصة إذا كانت الشفرة التي تعمل بها غير مألوفة. إذا لم تكن متأكدًا مما تفعله الطريقة أو كيف يُفترض أن تُسمى ، فيمكنك الانتقال مباشرةً إلى تعريفها. إذا كنت في دوامة لولبية من أكثر من 500 سطر من نصوص Perl وتريد معرفة مكان تحديد المتغير قبل ثلاث ساعات ، يمكنك العودة إليه مباشرة. وبعد ذلك ، يمكنك العودة إلى المكان الذي كنت تعمل فيه.

يمكنك تثبيت Ctags باستخدام Homebrew في OSX:

brew install ctags

يرجى ملاحظة أن OS X يأتي مع Ctags قابل للتنفيذ ، لكنه ليس Ctags غزير ويفتقد معظم الميزات المفيدة. إذا رأيت خطأً مثل Invalid Parameterعند التشغيل ctags، فهذا يعني أن النظام لا يستخدم النظام الذي قمت بتثبيته مع Homebrew. لحل هذا:

$ alias ctags="`brew --prefix`/bin/ctags"

عندما تكون جالسًا في الدليل الذي تريد فهرسته ، ما عليك سوى تشغيل:

ctags -R.

سيتنقل Ctags عبر الدليل بشكل متكرر ، مع وضع علامات على جميع الملفات المصدر التي يواجهها. بالنسبة للمشاريع الكبيرة جدًا ، قد يستغرق هذا بعض الوقت ، لكنه سريع جدًا في العادة.

قد تحتاج أيضًا إلى بعض التهيئة الإضافية لـ Ctags ، أدناه هو ~/.ctagsأنا أستخدم:

--langmap=javascript:.js.es6.es.jsx--javascript-kinds=-c-f-m-p-v
--regex-javascript=/^[ \t]*(var|let|const)[ \t]+([A-Za-z0-9_$]+)[ \t]*=[ \t]*\[/\2/A,Array,Arrays/
--regex-javascript=/^[ \t]*(var|let|const)[ \t]+([A-Z][A-Za-z0-9_$]+)[ \t]*=[ \t]*function/\2/C,Class,Classes/--regex-javascript=/^[ \t]*class[ \t]+([A-Za-z0-9_$]+)/\1/C,Class,Classes/
--regex-javascript=/^[ \t]*export[ \t]?({[ \t]*)*([A-Za-z0-9_\*]*[ \t]as[ \t])([A-Za-z0-9_]+)/\3/E,Export,Exports/--regex-javascript=/^[ \t]*export[ \t]?({[ \t]*)*([A-Za-z0-9_\*]*[ \t]as[ \t])*([A-Za-z0-9_]+),[ \t]*([A-Za-z0-9_\*]*[ \t]as[ \t])([A-Za-z0-9_]+)/\5/E,export,Exports/--regex-javascript=/^[ \t]*export[ \t]?({[ \t]*)*([A-Za-z0-9_\*]*[ \t]as[ \t])*([A-Za-z0-9_]+),[ \t]*([A-Za-z0-9_\*]*[ \t]as[ \t])*([A-Za-z0-9_]+),[ \t]*([A-Za-z0-9_\*]*[ \t]as[ \t])([A-Za-z0-9_]+)/\7/E,Export,Exports/--regex-javascript=/^[ \t]*export[ \t]?(var|let|const)[ \t]+([A_Za-z0-9_$]+)/\2/E,Export,Exports/--regex-javascript=/^[ \t]*export[ \t]?(var|let|const)[ \t]+([A_Za-z0-9_$]+)[ \t]*[^,]+,[ \t]*([A_Za-z0-9_$]+)/\3/E,Export,Exports/--regex-javascript=/^[ \t]*export[ \t]?(var|let|const)[ \t]+([A_Za-z0-9_$]+)[ \t]*[^,]+,[ \t]*([A_Za-z0-9_$]+)[ \t]*[^,]+,[ \t]*([A_Za-z0-9_$]+)/\4/E,Export,Exports/
--regex-javascript=/^[ \t]*function[ \t]*([A-Za-z0-9_$]+)[ \t\(]/\1/F,Function,Functions/--regex-javascript=/^[ \t]*[\(]function[ \t]*([A-Za-z0-9_$]+)[ \t\(]/\1/F,Function,Functions/--regex-javascript=/^[ \t]*(var|let|const)[ \t]+([a-z][A-Za-z0-9_$]+)[ \t]*=[ \t]*function[^\*][^\*]/\2/F,Function,Functions/--regex-javascript=/^[ \t]*(var|let|const)[ \t]+([a-z][A-Za-z0-9_$]+)[ \t]*=[ \t]*\([^\*]/\2/F,Function,Functions/
--regex-javascript=/^[ \t]*function[ \t]*\*[ \t]*([A-Za-z0-9_$]+)/\1/G,Generator,Generators/--regex-javascript=/^[ \t]*(var|let|const)[ \t]+([a-z][A-Za-z0-9_$]+)[ \t]*=[ \t]*function([ \t]*\*)/\2/G,Generator,Genrators/--regex-javascript=/^[ \t]*(\*[ \t])([A-Za-z0-9_$]+)[ \t]*\(.*\)[ \t]*{/\2/G,Generator,Generators/
--regex-javascript=/^[ \t]*import[ \t]?({[ \t]*)*([A-Za-z0-9_\*]*[ \t]as[ \t])([A-Za-z0-9_]+)/\3/I,Import,Imports/--regex-javascript=/^[ \t]*import[ \t]?({[ \t]*)*([A-Za-z0-9_\*]*[ \t]as[ \t])*([A-Za-z0-9_]+),[ \t]*([A-Za-z0-9_\*]*[ \t]as[ \t])([A-Za-z0-9_]+)/\5/I,Import,Imports/--regex-javascript=/^[ \t]*import[ \t]?({[ \t]*)*([A-Za-z0-9_\*]*[ \t]as[ \t])*([A-Za-z0-9_]+),[ \t]*([A-Za-z0-9_\*]*[ \t]as[ \t])*([A-Za-z0-9_]+),[ \t]*([A-Za-z0-9_\*]*[ \t]as[ \t])([A-Za-z0-9_]+)/\7/I,Import,Imports/
--regex-javascript=/^[ \t]*this\.([A-Za-z0-9_$]+)[ \t]*=.*{$/\1/M,Method,Methods/--regex-javascript=/^[ \t]*([A-Za-z0-9_$]+)[ \t]*[:=][ \t]*[\(]*function[ \t]*\(/\1/M,Method,Methods/--regex-javascript=/^[ \t]*static[ \t]+([A-Za-z0-9_$]+)[ \t]*\(/\1/M,Method,Methods/--regex-javascript=/^[ \t]*([A-Za-z0-9_$]+)\(.*\)[ \t]*{/\1/M,Method,Methods/
--regex-javascript=/^[ \t]*(this\.)*([A-Za-z0-9_$]+)[ \t]*[:=].*[,;]*[^{]$/\2/P,Property,Properties/
--regex-javascript=/^[ \t]*(var|let|const)[ \t]+([A-Za-z0-9_$]+)[ \t]*=[ \t]*{/\2/O,Object,Objects/
--regex-javascript=/\/\/[ \t]*(FIXME|TODO|BUG|NOBUG|\?\?\?|\!\!\!|HACK|XXX)[ \t]*\:*(.*)/\1/T,Tag,Tags/
--regex-javascript=/^[ \t]*(var|let|const)[ \t]+([A-Za-z0-9_$]+)[ \t]*=[ \t]*[^\[{]*;$/\2/V,Variable,Variables/
--exclude=min--exclude=vendor--exclude=\*.min.\*--exclude=\*.map--exclude=\*.swp--exclude=\*.bak--exclude=tags--exclude=node_modules--exclude=bower_components--exclude=test--exclude=__test__--exclude=build--exclude=dist--exclude=*.bundle.*

إليك كيف يبدو الأمر وكأنه يعمل على تعريف:

كما يمكنك استخدام Ctrlp للبحث عن العلامات بدلاً من الملفات. للقيام بذلك ، تحتاج أولاً إلى تعيين اختصار في .vimrc:

nnoremap . :CtrlPTag

إليك كيف يعمل:

أتمنى أن يساعد :)

أكتب كودًا للصوت والويب ، وأعزف على الجيتار على YouTube إذا كنت تريد رؤية المزيد من الأشياء مني أو معرفة المزيد عني ، فيمكنك دائمًا العثور علي في:

موقع الكتروني:

//haochuan.io/

جيثب:

//github.com/haochuan

متوسط:

//medium.com/@haochuan

يوتيوب: //www.youtube.com/channel/UCNESazgvF_NtDAOJrJMNw0g