VIM: كيف تتعامل مع الخطوط الجديدة عند تخزين أوامر متعددة في السجلات؟

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

  •  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) داخل البرامج النصية.

حظا طيبا وفقك الله!

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