VIM: كيف تتعامل مع الخطوط الجديدة عند تخزين أوامر متعددة في السجلات؟
-
02-10-2019 - |
سؤال
لدي ملف حيث أقوم بتخزين قصاصات أوامر VIM. عندما أحتاج إلى مقتطف ، قمت بنقله ثم أقوم بتنفيذه به @"
. يتم تخزين المقتطفات كنصي ، خط واحد لكل أمر ، مثل هذا:
:s/foo/bar/g
:echo "hello"
:s/1/2/g
تحرير: لقد أزلت أوامر الوضع العادي من المثال ، لأنها لم تكن جزءًا من المشكلة.
الآن لم يعد هذا الإجراء يعمل: عند تنفيذ المقتطف ، يتوقف فقط في السطر الأول كما لو كان ينتظر خط جديد.
هل هناك خيار في مكان ما يؤثر على كيفية @
يتم تنفيذ؟ أنا متأكد من أنها كانت تعمل منذ بعض الوقت ...
استبدال الخط الجديد مع حرف ^M يعمل ولكن يجعل الملف أكثر صعوبة في التعامل معه.
معلومات إضافية:
إليك أحد أعراض أخرى: عندما أخرج مقتطفًا ، إذا قمت بتنفيذه @"
يتوقف عند السطر الأول كما أوضحت للتو. ولكن إذا قمت بتنفيذها مع :@
إنها تعمل. لكن يبدو أن ملف المساعدة لا يعني أي اختلاف في كيفية تعامل الأوامر مع محتوى السجل ...
المحلول 2
وجدت أخيرًا الجاني. بطريقة ما كان لدي قيادة على <C-J>
في ملف .VIMRC. عند القراءة مع الافتراضي cpoptions
, تحول هذا إلى رسم خرائط <NL>
.
كيف اكتشفت: لقد لاحظت ذلك عند البدء في Vim -u ~/.vimrc
, ، سوف ينفذ بالفعل قصاصات heanked. لقد أنشأت ملف جلسة مع خيار سطر الأوامر وبدونه وقارنه. بهذه الطريقة اكتشفت أن مجموعة مختلفة من cpoptions
حيث تم استخدامه لقراءة نفس ملف .VIMRC ، بحيث كان رسم الخرائط في حالة واحدة بالفعل <C-J>
, ، في الآخر تم تحويله إلى رسم خرائط <NL>
!
إذا كان لدى شخص ما مشكلة مماثلة ، أقترح أن ننظر بعناية في تعيينات الأوامر المحددة حاليًا ، مع :cmap
.
نصائح أخرى
لا أعتقد أن المشكلة ^M
ضد. ^J
. سوف تعامل وحدات الماكرو VIM إما واحدة كحرف نهائي صالح لسيارات الماكرو المسجلة. أعتقد أن المشكلة هي الخطوط الجديدة الإضافية.
في مثالك ، هناك سطر جديد على الأقل من جديد 2j
, ، وما لم تكن حذراً بشكل خاص عند نسخ المقتطف ، فمن المحتمل أن يكون هناك واحد آخر بعد 10k
كذلك. هذه الخطوط الجديدة الإضافية مثل الضغط <Enter>
في الوضع العادي - ينقلون المؤشر إلى أسفل سطر واحد.
هذا ما أعتقد أنك تريد أن تبدو المقتطفات:
:s/foo/bar/g
2j:s/1/2/g
10k
(حتى هذا مضللة بعض الشيء - لا يزال يتعين عليك أن تكون حريصًا على عدم نسخ الخط الجديد بعد 10k
.)
لماذا تحدث هذه الخطوط الجديدة الإضافية فرقًا كبيرًا؟ حسنًا ، بالنسبة لشيء واحد ، فهي تتسبب في أن تكون سطرًا واحدًا على الأقل بعيدًا عن المكان الذي تتوقع أن يكون فيه ، وهو ما يلقي أي شيء تريد القيام به على خط معين (مثل تنفيذ :s//
يأمر).
والأهم من ذلك ، ومع ذلك - وهذا ما أعتقد أنه يحدث في مثالك - هو أن Vim يتوقف <Enter>
على السطر الأخير من المخزن المؤقت. (أظن أن Vim يعتبره خطأ ، وأي خطأ يتسبب في توقف الماكرو.)
إليك مثال. لنفترض أنك حصلت على تخزين هذا المقتطف في السجل X:
4j
:echo "Done"
(لاحظ الخط الجديد بعد 4j
.)
علاوة على ذلك ، لنفترض أن لديك الأسطر الخمسة التالية (وهذه الأسطر الخمسة فقط) في المخزن المؤقت:
line 1
line 2
line 3
line 4
line 5
إذا ضغطت الآن @x
على line 1
, ، ال :echo "Done"
لا تنفذ أبدًا. ينقل Vim المؤشر إلى أسفل 4 خطوط إلى line 5
, ثم يحاول التحرك لأسفل خطًا آخر بسبب خط جديد إضافي ، لكنه لا يمكنه ذلك. يتوقف الماكرو عن التنفيذ في تلك المرحلة ، قبل :echo
يحصل الأمر على فرصة للركض.
ومع ذلك ، فهو يعمل إذا قمت بتغيير سجل X لهذا:
4j:echo "Done"
للعودة إلى مثالك الأصلي ، سأراهن على ما يحدث هو أن الخط الجديد الإضافي بعد 2j
تحاول تحريك المؤشر في مكان ما لا يمكن أن يذهب ، وهذا يتسبب في توقف الماكرو. يحتوي الخطوط النهائية من الشاشة على آخر الأمر الذي تم تنفيذه (:s/foo/bar/g
) ، مما يجعلها تبدو وكأن vim تنتظرك للضغط على العودة.
أخيرًا ، أوصي بشدة باستخدام طريقة أخرى لتخزين وتنفيذ تسلسل أوامر VIM. إن التقنية التي تستخدمها مقبولة للحالات البسيطة ، لكنها هشة ولا تتوسع جيدًا. لدى VIM لغة برمجة كاملة تتضمن وظائف وأوامر مخصصة ، ويمكن استخدامها للقيام بكل الأشياء التي تقوم بها الآن ، ولكن بطريقة أكثر قوة. يعد برنامج Vim Scripting موضوعًا كبيرًا ، لكنني سأبدأ هنا:
:help script
تأكد من قراءة عن :normal
الأمر ، الذي يتيح لك تنفيذ أوامر الوضع العادي (مثل 2j
و 10k
) داخل البرامج النصية.
حظا طيبا وفقك الله!