هل هناك طريقة في Vim للحذف دون وضع نص في السجل؟

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

  •  09-06-2019
  •  | 
  •  

سؤال

باستخدام Vim، غالبًا ما أرغب في استبدال كتلة من التعليمات البرمجية بكتلة انتزعتها للتو.

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

إذن ما هي الطريقة الأسهل والأسرع لاستبدال النص في Vim؟

  • هل هناك طريقة لحذف النص دون وضعه في السجل؟
  • هل هناك طريقة للقول على سبيل المثال؟"استبدال الكلمة التالية" أو "استبدال ما يصل إلى الفقرة التالية"
  • أو هي أفضل طريقة لاستخدام ميزة التسجيل المتعدد بطريقة أو بأخرى؟
هل كانت مفيدة؟

المحلول

لحذف شيء ما دون حفظه في السجل، يمكنك استخدام "سجل الثقب الأسود":

"_d

بالطبع يمكنك أيضًا استخدام أي من السجلات الأخرى التي لا تحتوي على أي شيء يهمك.

نصائح أخرى

نعم.إنه أكثر تعقيدًا قليلاً من حذف النص "القديم" أولاً، ولكن:

أبدأ ب..

line1
line2
line3
line4

old1
old2
old3
old4

أنا يحول+الخامس حدد السطر 1 والسطر 2 و 3 و 4، ثم احذفهم باستخدام الملف د يأمر

ثم أحذف الأسطر 1-4 القديمة بنفس الطريقة.

ثم افعل

"2p

سيؤدي ذلك إلى لصق الأسطر الثانية الأخيرة (السطر 1-4). "3p سيفعل الثالث من الأخير، وهكذا..

لذلك انتهى بي الأمر

line1
line2
line3
line4

مرجع: وثائق Vim على السجل المرقّم

مستندات VIM: يحتوي التسجيل الرقمي 0 على النص من آخر أمر yank ، ما لم يحدد الأمر سجلًا آخر مع ["x].

على سبيل المثالنسحب "foo" ونحذف "bar" - لا يزال السجل 0 يحتوي على "foo"!ومن ثم يمكن لصق "foo" باستخدام "0p

من السهل أن يكون لديك تعيين سهل يتيح لك استبدال التحديد الحالي بالمخزن المؤقت.

على سبيل المثال عندما تضع هذا في ملف .vimrc الخاص بك

vmap r "_dP       // it's a capital 'p' on the end

ثم، بعد نسخ شيء ما في التسجيل (أي.باستخدام "y")، يمكنك فقط تحديد النص الذي تريد استبداله، والضغط ببساطة على "r" على لوحة المفاتيح.سيتم استبدال الاختيار بالسجل الحالي الخاص بك.

توضيح:

vmap - mapping for visual mode
"_d - delete current selection into "black hole register"
P - paste

لقد وضعت ما يلي في vimrc الخاص بي:

noremap  y "*y
noremap  Y "*Y
noremap  p "*p
noremap  P "*P
vnoremap y "*y
vnoremap Y "*Y
vnoremap p "*p
vnoremap P "*P

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

بالنسبة للمثال المحدد الذي قدمته، إذا فهمت السؤال، فقد ينجح هذا:

*Highlight what you want to put somewhere else
*delete (d)
*Highlight the code that you want it to replace
*paste (p)

تتم كتابة جميع عمليات السحب والحذف في السجل غير المسمى افتراضيًا.ومع ذلك، يتم دائمًا تخزين أحدث عملية سحب وأحدث عملية حذف (بشكل منفصل) في السجلات المرقمة.السجل 0 يحمل أحدث نثر.المسجلات 1-9 احتفظ بأحدث 9 عمليات حذف (مع 1 كونها الأحدث).

بعبارة أخرى، يؤدي الحذف إلى استبدال أحدث عملية سحب في السجل غير المسمى، ولكنه لا يزال موجودًا في ملف 0 يسجل. خدعة تسجيل الثقب الأسود ("_dd) المذكور في الإجابات الأخرى يعمل لأنه يمنع الكتابة فوق السجل غير المسمى، لكنه ليس ضروريًا.

يمكنك الرجوع إلى السجل باستخدام علامات الاقتباس المزدوجة، لذلك يمكن إجراء لصق النص الذي تم سحبه مؤخرًا على النحو التالي:

"0p

وهذا مرجع ممتاز:

للتأكيد على ما قال إي بي جرين:

إذا قمت باللصق أثناء تحديد النص، فسيتم لصق النص المحدد استبدال مع النص الملصق.

إذا كنت تريد نسخ بعض النص ثم لصقه في مواقع متعددة، فاستخدم "0p لصق.يحتوي السجل المرقم 0 على النص من أحدث أمر سحب.


يمكنك أيضًا إدراج محتويات جميع سجلاتك:

:registers

يسهل هذا الأمر معرفة السجل الذي تريده عند القيام بشيء مثل إجابة dbr.سترى أيضًا التسجيلات /،%،#.(أنظر أيضا :help registers)


وأخيرا، تحقق من cW و cW لتغيير كلمة بما في ذلك وليس بما في ذلك مسافة زائدة.(باستخدام رأس المال W يتضمن علامات الترقيم.)

إذا كنت تستخدم Vim، فسيكون لديك الوضع المرئي، الذي يشبه التحديد، ولكن مع أوضاع الفصل التي تمثل أساس vi/vim.

ما تريد القيام به هو استخدام الوضع المرئي لتحديد المصدر، ثم السحب، ثم استخدام الوضع المرئي مرة أخرى لتحديد نطاق الوجهة، ثم لصق النص من المخزن المؤقت الافتراضي.

مثال:

في ملف نصي يحتوي على:

1| qwer
2| asdf
3| zxcv
4| poiu

بالتسلسل التالي: ggVjyGVkp ستنتهي بـ:

1| qwer
2| asdf
3| qewr
4| asdf

شرح:

  • gg:انتقل إلى السطر الأول
  • V:ابدأ الوضع المرئي بخطوط كاملة
  • j:النزول سطرًا واحدًا (مع بدء التحديد في الأسطر السابقة يؤدي ذلك إلى زيادة التحديد سطرًا واحدًا لأسفل)
  • y:قم بالسحب إلى المخزن المؤقت الافتراضي (الخطين المحددين، وسيخرجك تلقائيًا من الوضع المرئي)
  • G:انتقل إلى السطر الأخير
  • V:بدء الوضع المرئي (كما كان من قبل)
  • k:انتقل لأعلى سطرًا واحدًا (كما كان من قبل، مع تمكين الوضع المرئي، يؤدي ذلك إلى تكبير التحديد سطرًا واحدًا لأعلى)
  • p:لصق (مع تحديد السطرين الأخيرين، سيتم استبدال تلك السطور بكل ما هو موجود في المخزن المؤقت - السطرين الأولين في هذه الحالة)

يحتوي هذا على بعض الإزعاج الذي يضع الكتلة الأخيرة في المخزن المؤقت، لذا فهو غير مرغوب فيه بطريقة ما لعمليات اللصق المتكررة لنفس الشيء، لذلك ستحتاج إلى حفظ المصدر في مخزن مؤقت مسمى بشيء مثل "ay (إلى مخزن مؤقت يسمى "a") والصق بشيء مثل "ap (ولكن بعد ذلك، إذا كنت تقوم بالبرمجة، فربما لا ترغب في اللصق عدة مرات ولكنك ترغب في إنشاء دالة واستدعائها، أليس كذلك؟ يمين?).

إذا كنت تستخدم vi فقط، فسيتعين عليك استخدام العلامات غير المرئية بدلاً من الوضع المرئي، :he mark لمعرفة المزيد عن هذا، أنا آسف ولكني لست جيدًا في التعامل مع العلامات غير المرئية، فأنا ملوث جدًا بالوضع البصري.

من أجل "استبدال الكلمة"، حاول cw في الوضع العادي.

بالنسبة إلى "استبدال الفقرة"، حاول cap في الوضع العادي.

حل بسيط للكسالى:

يسجل 0 يحتوي دائمًا على آخر عملية سحب (مثل رافائيل, alex2k8 و com.idbrii سبق أن ذكرت).للأسف اختيار التسجيل 0 يمكن أن يكون الأمر مزعجًا طوال الوقت، لذلك سيكون من الرائع أن تفعل ذلك p الاستخدامات "0 بشكل افتراضي.يمكن تحقيق ذلك عن طريق وضع الأسطر التالية في ملفك .vimrc:

noremap p "0p
noremap P "0P
for s:i in ['"','*','+','-','.',':','%','/','=','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
    execute 'noremap "'.s:i.'p "'.s:i.'p'
    execute 'noremap "'.s:i.'P "'.s:i.'P'
endfor

يعين السطر الأول كل منهما p السكتة الدماغية ل "0p.ومع ذلك، هذا يمنع p من الوصول إلى أي سجلات أخرى.لذلك كل p يتم تعيين الحدود ذات السجل المحدد بشكل صريح إلى تعبير سطر الأوامر المكافئ داخل الحلقة.ويتم نفس الشيء من أجل P.

بهذه الطريقة يتم الحفاظ على السلوك القياسي، باستثناء الضمني p و P السكتات الدماغية، والتي تستخدم الآن التسجيل 0 بشكل افتراضي.

تلميح 1: أمر القطع الآن "0d بدلا من مجرد d.ولكن بما أنني كسول فهذا طويل جدًا بالنسبة لي؛) لذلك أستخدم التعيين التالي:

noremap <LEADER>d "0d
noremap <LEADER>D "0D

مفتاح القائد هو \ بشكل افتراضي، حتى تتمكن من قص النص بسهولة عن طريق الكتابة \d أو \D.

تلميح 2: المهلة الافتراضية لتعيينات المفاتيح المتعددة قصيرة جدًا.قد ترغب في زيادته للحصول على مزيد من الوقت عند اختيار السجل.يرى :help timeoutlen للتفاصيل أنا أستخدم:

set timeout timeoutlen=3000 ttimeoutlen=100

حسنًا، قم أولاً بتنفيذ هذا الأمر:

:h d

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

النص المحذوف، أثناء وجوده في وضع الإدراج، لا ينتقل إلى التسجيل الافتراضي.

الحلان اللذان أستخدمهما في السياقات الصحيحة هما؛

  • قم بتمييز ما تريد استبداله باستخدام Vims VISUAL الوضع ثم لصق السجل.

أستخدم هذا في الغالب بدافع العادة لأنني لم أجد الحل الثاني إلا في وقت لاحق، على سبيل المثال

yiw   " yank the whole word
viwp  " replace any word with the default register
  • يانكرينج.مع هذا البرنامج المساعد يمكنك استخدام ربط المفاتيح <ctrl>+<p> لاستبدال السجل المرقم السابق بالسجل الذي قمت بلصقه للتو.

في الأساس، تقوم باللصق كما تفعل، ولكن عندما تدرك أنك قمت بالكتابة فوق السجل الافتراضي وبالتالي تفقد ما تريد لصقه بالفعل، يمكنك ذلك <C-P> للعثور على واستبدال من التاريخ YankRing!

يجب أن يكون لدى أحد هؤلاء المكونات الإضافية ...

لقد وجدت خريطة مفيدة جدًا لغرضك:

xnoremap p "_dP

يتم وضع النص المحذوف في "سجل الثقب الأسود"، ويبقى النص المسحوب.

مصدر: http://vim.wikia.com/wiki/Replace_a_word_with_yanked_text

في إصدار Windows (ربما في Linux أيضًا)، يمكنك الوصول إلى مخزن النسخ/اللصق المؤقت للنظام باستخدام "*y (أي.يسبق أمر السحب الخاص بك بعلامتي اقتباس مزدوجتين وعلامة النجمة).

يمكنك بعد ذلك حذف الأسطر القابلة للاستبدال بشكل طبيعي ولصق النص المنسوخ باستخدامه "*p.

غالبًا ما أرتكب خطأً عند اتباع الأوامر "y'ank ثم"_d'elete في ثقب أسود ثم "p'aste".أفضّل "y'ank"، ثم الحذف كيفما أشاء، ثم ""0p" من السجل 0، وهو المكان الذي يتم دفع آخر نص منسوخ إليه.

حالتي:في Normal الوضع، عندما أقوم بحذف الأحرف باستخدام x عند الضغط على مفتاح، تؤدي عمليات الحذف هذه إلى استبدال السجل الأخير الخاص بي - مما يزيد من تعقيد عمليات التحرير حيث أريد حذف الأحرف باستخدام x وألصق شيئًا لدي في أحدث تسجيل لي (على سبيل المثال.لصق نفس النص في مكانين أو أكثر).

لقد جربت الاقتراح في الإجابة المقبولة ("_d)، ولكنها لم تعمل.

ومع ذلك، من الإجابة/التعليقات المقبولة في https://vi.stackexchange.com/questions/122/performing-certain-operations-without-clearing-register, ، أضفت هذا إلى بلدي ~/.vimrc, الذي يعمل (قد تضطر إلى إعادة تشغيل Vim):

nnoremap x "_x

وهذا يعني أنني أستطيع الآن أن أقوم بالشد العادي (y)، يمسح (d)، ثم الصق (p) الأوامر - والأحرف التي أحذفها باستخدام x لم تعد تملأ أحدث السجلات.

بالنسبة لمستخدمي دفوراك، إحدى الطرق المريحة للغاية هي حذف النص غير الضروري في سجل "1" بدلاً من سجل "_ الثقب الأسود"، فقط لأنه يمكنك الضغط على " + 1 بنفس ضغطة Shift وحركة الخنصر السريعة حيث أن 1 هو المفتاح الموجود أعلى " مباشرة في دفوراك (يوجد بالإضافة إلى d في اليد الأخرى، مما يجعل الأمر بأكمله سريعًا للغاية).

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

لأولئك منكم المهتمين بشكل أساسي بعدم الكتابة فوق السجل غير المسمى عند استبدال النص عبر التحديد واللصق الافتراضي.

يمكنك استخدام الحل التالي وهو سهل ويعمل بشكل أفضل بالنسبة لي:

xnoremap <expr> p 'pgv"'.v:register.'y'

إنها من الإجابات (والتعليقات) هنا:كيفية لصق دون الكتابة فوق التسجيل

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

ملاحظة:إذا كنت بحاجة إلى متغير أبسط يعمل أيضًا مع محاكاة intellj idea plugin vim-simulation، فيمكنك استخدام هذا الخيار (الجانب السلبي:الكتابة فوق السجل غير المسمى حتى لو تم إعطاء سجل آخر للصق):

vnoremap p pgvy

بالنسبة لمستخدمي emacs-evil، فإن الوظيفة (evil-paste-pop) يمكن تشغيله بعد اللصق، والتنقل خلال الإدخالات السابقة في حلقة القتل.على افتراض أنك ملزمة به <C-p> (الافتراضي في Spacemacs)، ستضغط على p تليها أكبر عدد ممكن <C-p> كما هو مطلوب.

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