يوفر Subversive حركتين جديدتين للمشغل لتسهيل إجراء عمليات الاستبدال السريعة. لا يحتوي على أي تعيينات افتراضية ولن يكون له أي تأثير حتى تقوم بإضافة خرائطك الخاصة إليه.
انظر أيضًا هنا إذا كنت تفضل مشاهدة شرح فيديو لهذا البرنامج المساعد بدلاً من النص أدناه.
مثال التكوين:
" s for substitute
nmap s <plug> (SubversiveSubstitute)
nmap ss <plug> (SubversiveSubstituteLine)
nmap S <plug> (SubversiveSubstituteToEndOfLine)
لاحظ أنه في هذه الحالة سوف تقوم بتظليل مفتاح تغيير الحرف s
لذا سيتعين عليك استخدام النموذج الأطول cl
بعد إضافة هذه الخرائط، يمكنك بعد ذلك تنفيذ s<motion>
لاستبدال كائن النص الذي توفره الحركة بمحتويات السجل الافتراضي (أو سجل صريح إذا تم توفيره). على سبيل المثال، يمكنك تنفيذ siw
لاستبدال الكلمة الحالية الموجودة أسفل المؤشر بالسحب الحالي، أو sip
لاستبدال الفقرة، وما إلى ذلك.
عامل تشغيل آخر مثير للاهتمام يوفره Subversive يسمح بتحديد كل من النص المراد استبداله ونطاق الخط الذي سيتم تطبيق التغيير عليه باستخدام حركات متتالية متعددة.
مثال التكوين:
nmap <leader> s <plug> (SubversiveSubstituteRange)
xmap <leader> s <plug> (SubversiveSubstituteRange)
nmap <leader> ss <plug> (SubversiveSubstituteWordRange)
بعد إضافة هذه الخريطة، إذا قمت بتنفيذ <leader>s<motion1><motion2>
ثم أدخلت بعض النص في الموجه في شريط الحالة، فيجب استبدال النص المقدم بواسطة motion1
بالنص الذي أدخلناه في الموجه لكل سطر المقدمة من motion2
. وبدلاً من ذلك، يمكننا أيضًا تحديد motion1
في الوضع المرئي ثم الضغط على <leader>s<motion2>
للحصول على نفس التأثير.
هذا يمكن أن يكون قويا جدا. على سبيل المثال، يمكنك تنفيذ <leader>siwip
لاستبدال كافة مثيلات الكلمة الحالية الموجودة أسفل المؤشر والموجودة داخل الفقرة أسفل المؤشر. أو <leader>sl_
لاستبدال كافة مثيلات الحرف الموجود أسفل المؤشر في السطر الحالي.
يتم استخدام تعيين <leader>ss
كاختصار لاستبدال الكلمة الحالية الموجودة أسفل المؤشر. يتيح لك هذا على سبيل المثال تنفيذ <leader>ssip
لاستبدال الكلمة الموجودة أسفل المؤشر في الفقرة الحالية. لاحظ أن هذا يطابق الكلمات الكاملة ، لذا فهو يختلف عن <leader>siwip
(والذي لن يتطلب وجود حدود للكلمات في كل مطابقة)
دعونا نرى ذلك في العمل:
في هذه الصورة المتحركة، قمنا أولاً بإعادة تسمية المعلمة foo
المحلية عن طريق تنفيذ <leader>ssom
ثم إدخال bar
في الموجه (لاحظ أن om
هي حركة مخصصة تمثل "طريقة c# الخارجية" ولا يتم توفيرها بواسطة هذا البرنامج الإضافي). لاحظ أيضًا أنه نظرًا لأننا نستخدم <leader>ss
، فإن النص _foos
لن يتأثر لأنه لا يطابق الكلمة الكاملة. إنه مفيد في هذه الحالة لأننا نريد فقط إعادة تسمية المعلمة داخل الوظيفة.
بعد ذلك ننتقل إلى الوضع المرئي ونختار الجزء foo
_foos
ثم ننفذ <leader>sie
وندخل bar
مرة أخرى في الموجه. على ie
هي مرة أخرى حركة مخصصة تمثل entire buffer
(راجع القسم التالي للحصول على التفاصيل)
بعد ذلك ننتقل إلى الجزء Foo
من AddFoo
وننفذ <leader>seie
وندخل مرة أخرى إلى Bar
. ثم أخيرًا افعل الشيء نفسه بالنسبة إلى FOOS
بالأحرف الكبيرة بالكامل.
لاحظ أنه إذا كنت تستخدم neovim، فيمكنك تمكين خيار inccommand
للحصول على معاينة في الوقت الفعلي للبديل أثناء كتابته (أي ما يعادل ضبط g:subversivePromptWithActualCommand
على 1
)
لاحظ أيضًا أن هذه الحركة قابلة للتكرار. إذا قمت بتشغيل <leader>siwip
في فقرة واحدة، ثم انتقل إلى فقرة مختلفة، ثم اضغط على .
ثم سيتم تطبيق نفس الاستبدال على الفقرة الجديدة تحت المؤشر.
لاحظ أنه للاستفادة حقًا من هذه التعيينات، من المفيد إضافة كائنات نصية مخصصة بالإضافة إلى الكائنات المضمنة فقط مثل الفقرة الحالية ( ip
) أو الجملة الحالية ( is
) أو السطر الحالي ( _
). يمكن لكائنات النص المخصصة مثل مستوى المسافة البادئة الحالي، والطريقة الحالية، والفئة الحالية، والمخزن المؤقت بأكمله، وصفحة التمرير الحالية، وما إلى ذلك أن تساعد كثيرًا هنا.
على سبيل المثال، هناك حركتان بسيطتان حقًا ومفيدتان للتخريب هما:
" ie = inner entire buffer
onoremap ie :exec "normal! ggVG" <cr>
" iv = current viewable text in the buffer
onoremap iv :exec "normal! HVL" <cr>
هناك أيضًا مكونات إضافية أخرى توفر الكثير من الكائنات النصية المخصصة التي أوصي بإلقاء نظرة عليها.
بالنسبة للعديد من البدائل، يمكنك الاعتماد على معاينة التمييز لفهم ما يتم استبداله. ولكن إذا كنت تقوم باستبدال أكبر عبر الملف بأكمله، فقد ترغب في تأكيد كل واحد. يمكنك القيام بذلك من خلال الخرائط التالية:
nmap <leader> cs <plug> (SubversiveSubstituteRangeConfirm)
xmap <leader> cs <plug> (SubversiveSubstituteRangeConfirm)
nmap <leader> css <plug> (SubversiveSubstituteWordRangeConfirm)
تعمل هذه بنفس الطريقة التي تعمل بها خرائط <leader>s
أعلاه باستثناء أنها ستنتقل خلال كل استبدال واحدة تلو الأخرى.
إذا قمت بتوفير سجل صريح لأي من الاقتراحات البديلة المذكورة أعلاه، فلن يتم المطالبة بذلك، بل سيستخدم محتويات السجل المحدد بدلاً من ذلك. على سبيل المثال، "a<leader>siwip
على الفور باستبدال كافة مثيلات الكلمة الحالية الموجودة أسفل المؤشر بمحتويات السجل a
الموجود داخل الفقرة الحالية.
إذا لم يكن هذا كافيًا، يمكنك أيضًا استخدام المقابس التالية بدلاً من ذلك:
nmap <leader> s <plug> (SubversiveSubstituteRangeNoPrompt)
xmap <leader> s <plug> (SubversiveSubstituteRangeNoPrompt)
nmap <leader> ss <plug> (SubversiveSubstituteWordRangeNoPrompt)
والذي سيعمل بشكل مماثل للمقابس السابقة باستثناء أنه بدلاً من المطالبة، سيستخدم السجل الافتراضي.
يمكنك القيام بذلك عن طريق تمرير سجل الثقب الأسود إلى أحد الأوامر البديلة فوق النطاق. على سبيل المثال: "_<leader>siwip
أو "_<leader>csiwip
إذا كنت تريد تأكيد كل عملية حذف.
لسوء الحظ، لا يمكنك فقط إدخال قيمة فارغة في الموجه لأنه لا توجد طريقة لتمييز هذا الإدخال عن الإلغاء عبر الهروب (إلا إذا قمت بتعيين g:subversivePromptWithActualCommand
على 1
وفي هذه الحالة سيعمل ذلك بشكل جيد)
g:subversivePromptWithCurrent
- عند التعيين على 1
، سيتضمن الموجه النص الذي يتم استبداله. يمكن أن يكون هذا مفيدًا إذا كنت تريد فقط إجراء تعديل عليه. الافتراضي: 0
g:subversiveCurrentTextRegister
- عند التعيين، سيتم ملء السجل المحدد بالنص الذي يتم استبداله. يمكن أن يكون هذا مفيدًا كبديل لـ g:subversivePromptWithCurrent
، بحيث يمكنك الضغط على <cr>r
في الموجه (على افتراض أنك قمت بتعيينه على 'r'
) عندما تريد تحريره وإلا فاكتب مباشرة عندما تريد القيام بذلك استبدال كامل.g:subversivePromptWithActualCommand
- عند التعيين على 1
، بدلاً من المطالبة بالنص البديل فقط، سيتم المطالبة باستخدام الأمر البديل vim الأصلي. قد يفضل مستخدمو vim المخضرمين هذا حتى يتمكنوا من ضبط أعلام الاستبدال المختلفة بأنفسهم. الافتراضي: 0
g:subversivePreserveCursorPosition
- عند التعيين على 1
، لن يتحرك المؤشر عند تطبيق البدائل. الافتراضي هو 0
لمطابقة سلوك vim العادي. إذا قمت أيضًا بتثبيت vim-abolish، فقد تفكر في إضافة شيء مشابه للتعيين التالي أيضًا:
nmap <leader> <leader> s <plug> (SubversiveSubvertRange)
xmap <leader> <leader> s <plug> (SubversiveSubvertRange)
nmap <leader> <leader> ss <plug> (SubversiveSubvertWordRange)
سيتصرف هذا بنفس الطريقة التي يتصرف <leader>s
باستثناء أنه سيؤدي إلى إلغاء "subvert" بدلاً من استخدام الأمر البديل المدمج في vim. سيؤدي هذا إلى تطبيق الاستبدال وكذلك الحفاظ على الحالة التي تحتوي عليها الكلمة الأصلية. على سبيل المثال:
في هذه الحالة، نحرك المؤشر فوق foo
ثم ننفذ <leader><leader>seie
ثم أدخل bar
، الذي يستبدل جميع مثيلات foo
بغض النظر عن الحالة.
يمكن أن تكون هذه طريقة ملائمة جدًا لإجراء عمليات إعادة تسمية سريعة.
كما هو متوقع، يعمل تعيين <leader><leader>ss
بشكل مشابه باستثناء مطابقة الكلمات الكاملة التي تتضمن حدود الكلمات فقط.
ومرة أخرى، هناك أيضًا مقابس بديلة تستخدم التسجيل الافتراضي بدلاً من المطالبة إذا كنت تفضل ذلك:
nmap <leader> <leader> s <plug> (SubversiveSubvertRangeNoPrompt)
xmap <leader> <leader> s <plug> (SubversiveSubvertRangeNoPrompt)
nmap <leader> <leader> ss <plug> (SubversiveSubvertWordRangeNoPrompt)
لاحظ أنه إذا قمت بتثبيت vim-yoink جنبًا إلى جنب مع vim-subversive، فستعمل ميزة تبديل yoink بعد اللصق تلقائيًا مع البدائل التخريبية (الحركة الفردية) أيضًا. بمعنى آخر، بافتراض التعيينات الافتراضية، يمكنك تنفيذ siw
ثم الضغط على <cn>
/ <cp>
للتبديل بين عمليات سحب مختلفة من سجل yoink.
يوفر Subversive أيضًا مكونًا لاستبدال لصق الوضع المرئي لتوفير تبادل لصق ما بعد هناك أيضًا:
xmap s <plug> (SubversiveSubstitute)
xmap p <plug> (SubversiveSubstitute)
xmap P <plug> (SubversiveSubstitute)
الآن، إذا قمت بالضغط على p
أثناء وجودك في الوضع المرئي، فيمكنك التبديل بين عمليات السحب تمامًا كما هو الحال عند اللصق في الوضع العادي.