خدعة Vim واحدة على الأقل لم تكن تعرفها

لقد عملت في فيم منذ ثماني سنوات واكتشف باستمرار شيئًا جديدًا. ويعتبر فضيلة فيم. بالنسبة لي ، هذا الافتقار إلى الانفتاح: مجموعة من الوظائف المخفية مخفية بعمق كبير.

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

في الأنظمة التي تفتقر إلى الانفتاح ، يتعين على المرء أن يعتمد على القيادة. لكن فيم لا يوجد الكثير منهم. هناك مقالات للمبتدئين ، مثل ciw (يجب عدم الخلط بينها وبين CIA ودليل CIA الخاص بـ Vim ) وما شابه. وهناك مقالات من الخبراء الذين غمروا في النظم الفرعية. لكن لا أحد يتحدث عن هذه الحيل الخاصة التي تجعلك تصرخ: لعنة ، كما كنت في حاجة إليها على مدى السنوات الست الماضية!

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

هيكل المادة


وقح جدا ، والمستخدمين فيم تندرج في فئتين. يقدّر الأصوليون صغر الحجم والانتشار. كقاعدة عامة ، فإنها تقلل من التكوين في حال كان عليك العمل على جهاز كمبيوتر غير مألوف (على سبيل المثال ، عبر ssh). على الجانب الآخر ، تقوم أجهزة الامتداد بتعبئة Vim باستخدام الإضافات والوظائف والتعيينات المحلية في محاولة عقيمة للتظاهر باستخدام Emacs. إذا أخذت vimrc منهم ، فسيبقى الرجال عاجزين تمامًا.

كما تخمين ربما ، أنا أقرب بكثير من المتوسع من الأصوليين. لقد قسمت الحيل إلى قسمين اعتمادًا على ما إذا كانت التغييرات مطلوبة في قاعدة Vim.

الأصوليون


بالنسبة لأوامر الوسائط ، يتم استخدام طرق عرض التعليمات القياسية ، أي <cr> يعني الضغط على المفتاح Enter. عندما تحتاج إلى مساعدة :h لخط معين ، على سبيل المثال :h E676 ، سيكون الخط بين قوسين.

أوامر مختلفة في الوضع العادي


": و @:


": سجل يحمل آخر أمر تم تنفيذه. يمكنك كتابة ":p لطباعته إلى المخزن المؤقت. @: يكرر الأمر الأخير.

"=


سجل للحصول على "التعبيرات". هنا يمكنك إدخال أي تعبير vimL وإدخاله ، واستخدامه مع ctrl-R ، إلخ. وهكذا ، على سبيل المثال ، يتم إدراج الطابع الزمني المحلي بكتابة "=strftime("%c")<cr>p .

مللي أمبير ، 'أ


يضع m{letter} العلامة في موضع المؤشر. ثم '{letter} سوف ينتقل إلى هذا السطر. بالنسبة للأحرف الصغيرة ، يعمل على المخزن المؤقت ، لذا فهو مناسب للتنقل. إنه يعمل على مستوى العالم للأحرف الكبيرة: حتى إذا كنت في ملف آخر ، فستنتقل 'A إلى الملف المسمى تستطيع أن ترى كل ما تبذلونه من العلامات مع الأمر :marks:

CTRL-A و CTRL-X


يزيد وينقص الرقم التالي في السطر في موقع المؤشر أو إلى يمينه. نظرًا لأنه يذهب فورًا إلى الرقم ، يمكن استخدام المجموعة من أي مكان. 10c-A أبسط بكثير من wwwwwciw20 .

س:


يفتح تاريخ الفرق السابقة. يمكنك العمل معها كما هو الحال مع أي نص Vim ، ولكن لا يتم حفظ التغييرات. ومع ذلك ، يمكنك تشغيل الأمر المعدل باستخدام <CR> . يتيح لك ذلك تغيير الأوامر وإعادة تشغيلها بسرعة أو البحث عن الأوامر القديمة لإعادة استخدامها.

ف / ، ف؟


مثل q: باستثناء البحث.

CTRL-I ، CTRL-O


ينتقل إلى الموقع التالي أو السابق في jumplist. مفيدة لفحص سريع ثم التراجع. انه لطيف جدا لقراءة ملفات المساعدة.

وحدات الماكرو


راجع هذا المنشور للحصول على نظرة أعمق لاستخدام وحدات الماكرو.

الوضع البصري


GV


تحديد العنصر المرئي السابق.

v_o


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

g ctrl-A / ctrl-X


في الوضع المرئي ، يزيد ctrl-A ببساطة الرقم الأول في كل سطر. من ناحية أخرى ، ستزيد g ctrl-A بسطر واحد مع كل سطر. هذا أسهل في التوضيح في الجدول:

مختارctrl-Ag ctrl-A2 g ctrl-A
  0
 ب 0
 ج
 د 0 
  1
 ب 1
 ج
 د 1 
  1
 ب 2
 ج
 د 3 
  2
 ب 4
 ج
 د 6 

المشغلون: v ، V ، cv (: h o_v)


ربما تعلم أنه في الوضع المرئي ، يمكنك تحديد الأحرف (v) والخطوط (V) والكتل (ctrl-V). ولكن هذه المجموعات الثلاث يمكن استخدامها كمشغلين للحركة للجزء المقابل. على سبيل المثال ، لديك النص التالي:

abc
abc
abc


إذا وضعت المؤشر في أعلى b d2j ، d2j كل الخطوط الثلاثة ، لأن j يتحرك سطراً سطراً. إذا d<cV>2j الضغط على d<cV>2j بدلاً من ذلك ، تصبح الحركة كتلة تلو الأخرى ويتم حذف العمود الأوسط الذي d<cV>2j ثلاثة أحرف b .

حالة استخدام واحدة هي حذف في البحث. d/ العادي d/ يتحرك حرف بحرف. لذلك ، أنا استخدم dV/ للحركة سطرا مع الحذف. هناك طريقة أخرى للقيام بذلك:

/ regex / {n}


حرك خطوط n أسفل التطابق ، أو أكبر عدد من الخطوط إذا كانت القيمة سالبة. كتأثير جانبي ، تحدث الحركة سطراً تلو الآخر. وبالتالي ، إذا كنت ترغب في حذف السطر الأول المقابل لـ regex ، يمكنك إدخال d/regex//0 .

السابق فريق


يمكنك إدخال أوامر سابقة في وضع الأوامر ، على سبيل المثال ، الأمر :s . بالإضافة إلى الاستبدال ، هناك العديد من الأوامر المفيدة الأخرى. كل هذه الأمثلة تتطلب نطاقًا ، مثل % .

: ز / ريجكس / السابقين


يقوم بتشغيل الأمر فقط على خطوط مطابقة للتعبير العادي. على سبيل المثال ، يمكنك إدخال g/regex/d لحذف جميع الأسطر المطابقة لـ regex. يشبه الأمر v الأمر g ، ولكنه يعمل على جميع الخطوط التي لا تتطابق مع التعبير العادي.

الحيل تصبح أكثر قوة مع القاعدة وبعض الآخرين.

: norm {Vim}


يتصرف كما لو كنت تدير {Vim} على كل سطر من النطاق. على سبيل المثال ، سيحذف g/regex/norm f dw الكلمة الأولى بعد المسافة الأولى في كل سطر المقابلة لتعبير regex العادي. هذا غالبًا ما يكون أبسط من الماكرو.

يطيع norm كل المقارنات الخاصة بك. على سبيل المثال ، إذا قمت بتعيين jk على <esc> في وضع الإدراج ، فإن norm I jk$diw ستضيف مسافة إلى بداية السطر ، وترك وضع الإدراج ، ثم احذف الكلمة الأخيرة في السطر. تعجبني هذه الوظيفة حقًا ، ولكن إذا كنت تفضل عدم استخدام تعييناتك ، فيمكنك تطبيق norm! .

: المشترك.


نسخ نطاق إلى السطر الحالي. يمكنك أيضًا تحديد قيم عشوائية بدلاً من فترة ، على سبيل المثال ، +3 أو 'a. mv 'a. mv في التحرك.

: y {reg}


لنسخ النطاق إلى سجل {reg} . إذا تم {reg} ، فسيتم إضافته إلى الحالة الحالية. مثل هذا الفريق

let @a = '' | %g/regex/y A

سيتم نسخ إلى جميع الأسطر المقابلة لـ regex في الملف بأكمله. يساعد هذا في استخراج النص المعطوب من الملف ونسخه إلى حافظة النظام (باستخدام let @+ = @a ).

: windo {ex}


يدير الأوامر في جميع النوافذ. على سبيل المثال :windo $ جميع النوافذ إلى أسفل. هناك bufdo ، cdo ، tabdo وغيرها.

يعمل بشكل جيد للغاية مع g و s . لاستبدال جميع مجموعات AA بـ BB مع معاينة vimgrep AA ، يمكنك إدخال vimgrep AA عن طريق تحميل جميع التطابقات في quickfix ثم cdo s/AA/BB/cge للبحث / استبدال جميع التطابقات.

فيم للموسعات


المدرجة هنا هي الحيل التي تتطلب الحفظ في الإعدادات أو تغيير جلسة Vim. من الناحية الافتراضية ، يمكن استخدامها في الوضع "المتشدد" ، وذلك ببساطة عن طريق إدخال الأوامر ، ولكن بعضها ينطوي على تغييرات خطيرة للغاية تتعارض مع روح التطهير.

هنا فقط الأكثر غرابة. كثير من الناس يعينون H إلى الحد الأقصى ، لذلك فإن هذه الأشياء لا تستحق الذكر. أيضًا ، ليس من المنطقي التحدث عن vim-sensible أو vim-surround ، ولكن فقط عن الإضافات الأكثر غرابة.

إذا كنت تقوم باستمرار بتكوين vimrc الخاص بك ، فالرجاء نفسك وإضافة أمر منفصل لهذا:

command! Vimrc :vs $MYVIMRC

إعدادات


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

معظم الإعدادات ليست في الحقيقة أي "حيل". من الأفضل إلقاء نظرة على vim-sensible : ستناسب جميع الإعدادات تقريبًا من vimrc.

ضبط lazyredraw


لا تعيد رسم الشاشة في منتصف الماكرو (لتحسين الأداء).

تعيين smartcase / جاهل


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

تعيين undofile


حفظ الإجراءات ، حتى إذا قمت بإغلاق Vim وفتحته ، بحيث تكون إجراءات التراجع متاحة دائمًا. مفيد جدا في تركيبة مع البرنامج المساعد undotree.

تعيين foldcolumn = {n}


العمود الجانبي مع كتل انهارت. أكبر n ، يتم إظهار كتل أكثر انهار في العمود ، والباقي يشار إلى الرقم.

تعيين لاحقات = {str}


عادةً ما يعني " gf " الانتقال إلى الملف أسفل المؤشر "، لكن يتطلب امتداد الملف في السطر. يضيف suffixesadd التمديد المحدد. إذا suffixesadd=.md ، suffixesadd=.md الأمر gf على السطر 'foo' عن الملفات foo و foo.md

تعيين inccommand = nosplit


فقط من أجل Neovim. يوضح incommand في الوقت الحقيقي التغييرات التي incommand الفريق. فقط s معتمد حاليًا ، لكن حتى هذا مفيد بشكل لا يصدق. إذا قمت بإدخال :s/regex ، :s/regex تمييز جميع التطابقات. إذا قمت بإضافة /change ، فسوف تظهر جميع البدائل. يعمل مع جميع خصائص regex ، بما في ذلك backlinks والمجموعات.

تعيين سطر الحالة (: سطر الحالة)


يحدد ما سيتم عرضه في اللوحة في أسفل كل نافذة. التنسيق هنا أكثر تعقيدًا وصعبًا منه في الإعدادات الأخرى ، لذلك عليك قضاء بعض الوقت في شرحه. هناك بعض الحيل البسيطة. أولاً ، انظر إلى شريط حالة Vim الافتراضي:

:set statusline=%<%f\ %h%m%r%=%-14.(%l,%c%V%)\ %P

من الأسهل استبدال %P (النسبة المئوية للملف عبر المؤشر). تنسيق شريط الحالة هو القيمة بعد علامة النسبة المئوية في الأقواس. لذلك ، لملفات Markdown ، يمكنك كتابة هذا:

:set statusline=%<%f\ %h%m%r%=%-14.(%l,%c%V%)\ %{wordcount()[\"words\"]}

واستبدل النسبة المئوية للملف بعدد الكلمات في المستند.

أو تثبيت tabline . إذا لم تستخدم علامات التبويب ، يمكن جعل هذا السطر "سطر حالة عام". على سبيل المثال

set tabline=%{strftime('%c')}

سوف تظهر دائما التاريخ على القمة.

الارتباطات الرئيسية


لدي الكثير من الارتباطات.

يتم تعيين الكثير من المفاتيح المناسبة في Vim بغباء بشكل افتراضي. على سبيل المثال ، حفظ ضغط المفاتيح مرادف لـ cl (حفظ ضغطة مفتاح واحدة) ، و U هو نفسه u ، باستثناء كتابة التراجع عن تغيير جديد ، وهو عديم الفائدة وظيفيًا. Q مماثلة لـ gQ وهي في أي حال فخ كبير. يستخدم Z فقط من أجل ZZ و ZQ . Gosh ، حتى دليل Vim يوصي بإعادة تعيين _ ومفاتيح بعض الوظائف ، لأنك "ربما لن تستخدمها أبدًا". أفضل عدم حفظ نقرة واحدة ، ولكن لإضافة وظائف جديدة تمامًا إلى لوحة المفاتيح. فيما يلي بعض الارتباطات الخاصة بي:

nnoremap Q


دون إبطاء الانتقال إلى الوضع السابق ، يكرر الماكرو الأخير.

nnoremap s "_d


يجعل مفتاح s (مع الإعدادات المناسبة لـ ss و S ) يعمل مثل d ، فقط دون حفظ النص المحذوف في السجل. مفيدة حتى لا تسد السجل.

nnoremap <cj> <cw> j


انتقل إلى النافذة أدناه. التخصيصات المناسبة لـ h ، k ، l . العمل مع النوافذ أسهل بكثير.

nnoremap <leader> e: getline exe (line ('.')) <cr>


قم بتشغيل السطر الحالي كما لو كان أمرًا. في التجارب ، غالبًا ما يكون أكثر ملاءمة من q:

الوسائط الخاصة (: h map-arguments)


يعمل أمر map <buffer> lhs rhs تنشيط تعيين المفاتيح لهذا المخزن المؤقت فقط. إنه يعمل بشكل ملائم مع أوامر تلقائية كتركيبة مفاتيح مؤقتة أو عند تحديد المهام من خلال دالة. تكون للواجبات العازلة الأسبقية على الواجبات العامة ، أي أنه يمكنك تخطي الأمر العام أكثر فائدة في موقف معين.

يقوم أمر map <expr> {lhs} {expr} بالتحقق من {expr} ويستخدم قيمة الإرجاع كرمز إعادة تعيين نهائي للمفاتيح. حالة استخدام واحدة بسيطة ملزمة بناءً على الظروف. لدي هذه:

nnoremap <expr> k (v:count == 0 ? 'gk' : 'k')
nnoremap <expr> j (v:count == 0 ? 'gj' : 'j')


مما يجعل j و k يتحرك على طول الخط حتى يتم العثور على رقم ، وبعد ذلك يتم إلغاء المفتاح. لذلك ، يمكنني التنقل بين الفقرات الطويلة من النثر بدون كسر مجموعات مثل 10j .

تساعد الوسيطة <silent> حالة تشغيل أي روابط أوامر ex.

inoremaps


بفضل inoremap تعمل الروابط في وضع الإدراج. هناك يبدأون العمل ، لذلك inoremap ;a aaaa ستقدم aaaa "aaaa" بدلاً من "؛ a". إذا كنت تريد القيام بشيء ما في الوضع العادي ، فاستخدم <cO> . على سبيل المثال ، إذا كان لدينا

inoremap ;1 <co>ma

ثم ;1 تعيين 'a .

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

autocmd


أوامر السيارات كبيرة للتكوين. عادة ما تقوم بتكوينها مثل هذا:

 augroup {name} autocmd! " Prevents duplicate autocommands au {events} {file regex} {command} augroup END 

ثم ، في حالة حدوث أي من الأحداث {الأحداث} في ملف {file regex} ، سيتم إطلاق الأمر {command}. يتم سرد الأحداث :h event . على سبيل المثال ، إذا كنت تكتب

 augroup every autocmd! au InsertEnter * set norelativenumber au InsertLeave * set relativenumber augroup END 

ثم سوف vim تعطيل relativenumber لوضع الإدراج فقط.

يطبق الأمر au {event} <buffer> {ex} الأمر التلقائي فقط على المخزن المؤقت الحالي. أحيانًا أستخدم هذا لإضافة معالجات الأحداث قصيرة الأجل إلى ملف معين.

BufNewFile ، BufRead


يبدأ BufnewFile عند إنشاء ملف جديد ، BufRead - عند فتح المخزن المؤقت لأول مرة. وعادة ما تستخدم لإضافة المعلمات و remaps لأنواع ملفات محددة. لدي واحدة مثل:

 augroup md autocmd! au BufNewFile,BufRead *.md syntax keyword todo TODO au BufNewFile,BufRead *.md inoremap <buffer> ;` ```<cr><cr>```<Up><Up> augroup END 

فقط في ملفات Markdown يتم تمييز سطر TODO ، والحروف ;` في وضع الإدراج يضيف تدوينًا رمزًا.

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

الإضافات


يعرف معظم الناس الإضافات الشائعة مثل NERDtree vim-surround و NERDtree . فيما يلي قائمة ببعض الأشياء غير المعروفة التي أجدها مفيدة للغاية.

Undotree


في معظم برامج تحرير النصوص ، تحدث إجراءات التراجع خطيًا. إذا قمت بإجراء تغيير على A ، قم بالتراجع عنه ، ثم قمت بإجراء تغيير على B ، فسيضيع A إلى الأبد. ومع ذلك ، يخزن Vim الشجرة بأكملها من الإجراءات التراجع. يسترجع الأمر u الإجراء في فرع الشجرة الحالي ، ويذهب g إلى الإصدار الزمني السابق. يمكنك عرض قائمة الإجراءات الملغاة باستخدام الأمر :undolist .

لكن هذا التنسيق ليس واضحا جدا. من الأفضل رؤية الشجرة الفعلية. هذا هو بالضبط ما يفعله Undotree : إنه يعرض تمثيل ASCII جيدًا لشجرة الإجراءات الملغاة مع التنقل المريح.

vim.swap


يوفر المكون الإضافي أوامر لتبادل الوسائط ، بحيث يمكنك استبدال (a, f(b, c)) بـ (f(b, c), a) في بضع ضغطات المفاتيح. يجب عليّ بانتظام إجراء مثل هذه التعديلات ، لذلك يعد هذا تحسينًا كبيرًا في نوعية الحياة.

Neoterm


يربط API المستوى الأعلى إلى محطة النيو / فيم المضمنة. على سبيل المثال :T {text} يرسل :T {text} {text} إلى وحدة التحكم. جيد لخلق بيئة تفاعلية.

"TODO {{{


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

معاينة ، Quickfix ، وقائمة النوافذ


أحيانًا أستخدم أدوات مع هذه النوافذ ، لكنني لا أعرف كيفية معالجتها. أرغب في إضافة أخطاء سريعة إلى ملحق TLA + الخاص بي . أحب أيضًا فكرة وضع معلومات داعمة وأوامر رد الاتصال في نافذة المعاينة. هذا يفتح بعض الاحتمالات التي يصعب إعادة إنتاجها في IDE.

Neovim API


يوفر Neovim واجهة برمجة تطبيقات متقدمة لدمج Vim مع البرامج الخارجية. يمكن لبرنامج Python إرسال أوامر إلى مثيل Neovim ، ويمكنك التحكم في المحرر من خلال الخادم ، على سبيل المثال. رأيت بعض العروض التوضيحية الرائعة حيث يحدث الإكمال التلقائي استنادًا إلى المعلومات الموجودة في المستعرض. يبدو أن يكون رائعا جدا!

كائنات النص


لم يخلق مثل هذا.



لذلك ، كانت هذه لمحة موجزة عن بعض الوظائف الضمنية لفيم. أتمنى أن تكتشف شيئًا مفيدًا!

Source: https://habr.com/ru/post/ar454742/


All Articles