سؤال كيف عكس ترتيب خطوط محددة في vim؟


على سبيل المثال ، إذا كان لدي أربعة أسطر على النحو التالي:

السطر الأول
  الخط الثاني
  السطر الثالث
  السطر الرابع

اريد ان اعكسها

السطر الرابع
  السطر الثالث
  الخط الثاني
  السطر الأول

كيف يمكن أن أفعل هذا في vim؟


84
2017-09-17 23:57


الأصل


مكرر على Stack Overflow: كيفية قلب التحديد البصري في vim؟ - Palec
ذات صلة: عكس جميع الخطوط @ فيم ويكيا - Palec
:command! -bar -range=% Reverse <line1>,<line2>global/^/m<line1>-1  vi.stackexchange.com/a/2107/10254 - qeatzy


الأجوبة:


لعكس كل الخطوط في ملف ،

:g/^/m0

للحصول على تفسير انظر

:help 12.4

والذي يوضح أيضًا كيفية عكس مجموعة من الخطوط فقط.


82
2017-09-18 00:35



نصيحة رائعة على قسم المساعدة الدقيقة! لتلخيص: 1. تعيين علامة في السطر الأخير تريد عكس (أنا اسم علامة "أ" باستخدام ma) ، 2. حرك المؤشر إلى السطر الأول من الكتلة ، 3. اكتب :'a,.g/^/m 'a - Brent Faust
نعم ، بما في ذلك الجواب الفعلي هنا في مواقع Stack Exchange أمر لا بد منه ؛ الإشارة إلى مصدر خارجي لا يكفي. (نقلا عن ذلك ، على الرغم من الدعائم.) - ELLIOTTCABLE


حدد الخطوط المطلوبة ، ضرب !، وفي الأنابيب موجه الناتج الخطوط من خلال tac لا :'<,'>!tac. نرى man tac لمزيد من التفاصيل.


62
2017-08-16 14:01



لتحديد الخطوط ، استخدم shift+v للدخول إلى وضع الخط المرئي ، ثم j لإضافة خطوط إلى التحديد. - wisbucky
أستطيع أن أؤكد أن هذا يعمل في ويندوز مع gvim، كذلك! خلاف ذلك ، يجب عليك استخدام أرقام الخط المطلق (ربما يمكنك استخدام النسبية ، ولكن عليك أن تكون حذرا) مع :g/^/m0 (وهو أمر يصعب تذكره أيضًا) ... لذا ، أساسًا ، يجب أن يكون tac مع vim بغض النظر عن النظام الأساسي الذي تستخدمه ، ولكن ليس vimscript 100٪ ، ولكن من يهتم: P - dylnmc
هذا مذهل !!!! - itzjustricky
tac ليس التعامل مع vim الأصلي بالكامل ، ولكن ، الأمر 'm'ove يأخذ رقم سطر وهذا ليس دائماً معقولة. أنا غالبا ما تستخدم علامة كجزء من مجموعة ، لذلك :.,'a!tac يعمل بأقل جهد ممكن. - studog


على نظام التشغيل Mac OS X ، tac غير موجود ، ولكن يمكنك استخدامه tail -r لنفس التأثير:

:%!tail -r

هذا أيضا يعمل بشكل رائع مع الوضع المرئي:

:'<,'>!tail -r

مقتطفات من tail(1)صفحة manpage:

يتسبب الخيار -r في عرض الإدخال بترتيب عكسي ، بواسطة   خط. بالإضافة إلى ذلك ، يقوم هذا الخيار بتغيير معنى -b و -c و   خيارات -n. عندما يتم تحديد الخيار -r ، تحدد هذه الخيارات عدد البايتات أو الخطوط أو كتل 512 بايت المراد عرضها ، بدلاً من   البايتات أو الخطوط أو الكتل من بداية الإدخال أو نهايته   والتي تبدأ العرض. الافتراضي للخيار - r هو   عرض كل المدخلات.


29
2018-06-03 17:18



ممتاز! لتوفير "tac" ضمن نظام التشغيل OS X: alias tac='tail -r' - Brent Faust
بامكانك ايضا brew install coreutils والاستخدام gtac. - Andrew Marshall


لأولئك الأكثر راحة مع وضع المرئي:
 1. حدد رقم السطر الموجود فوق التحديد الذي تريد عكسه باستخدام :set nu.
 2. Shift-V لتسليط الضوء على الاختيار الذي تريد عكسه (الوضع المرئي).
 3. :g/^/m <Line number from step 1>.

لاحظ أنه في الوضع المرئي سيتم عرضه تلقائيًا      :'<,'>g/^/m <Line number> عندما تكتب في الأمر من 3.

يعمل هذا الأمر عن طريق نقل التحديد سطر واحد في كل مرة إلى رقم السطر الذي تقوم بإعطائه. عندما يتم دفع العنصر الثاني إلى رقم السطر المعطى ، فإنه يدفع أول رقم لأسفل إلى رقم الخط + 1. ثم يدفع الثالث الأول والثاني لأسفل وهكذا حتى يتم دفع القائمة بأكملها إلى رقم السطر الواحد مما يؤدي إلى عكس قائمة مرتبة.


3
2018-06-13 20:52



يمكنك استعمال ال '< بدلاً من إدخال رقم السطر يدويًا. ما عليك سوى بدء الاختيار سطر واحد سابقًا وتنفيذها :'<,'>g/^/m'<. - Palec
Palec آه ، نصيحة مفيدة للغاية. شكرا لكم! - horta


أمر :Rev[erse] والتعيينات الاختيارية الخاصة بك vimrc، لذلك لا يجب عليك تذكر وتنفيذ الخطوات غير الواضحة لهذه الوصفة:

" Reverse the lines of the whole file or a visually highlighted block.
    " :Rev is a shorter prefix you can use.
    " Adapted from http://tech.groups.yahoo.com/group/vim/message/34305
command! -nargs=0 -bar -range=% Reverse
    \       let save_mark_t = getpos("'t")
    \<bar>      <line2>kt
    \<bar>      exe "<line1>,<line2>g/^/m't"
    \<bar>  call setpos("'t", save_mark_t)

nmap <Leader>r :Reverse<CR>
xmap <Leader>r :Reverse<CR>

(:xmap خرائط لوضع Visual ولكن لا حدد ، مثل :help mapmode-x ينصح بتعيين أحرف قابلة للطباعة.)

(مرتكز على: http://tech.groups.yahoo.com/group/vim/message/34305 )


2
2018-02-09 11:10



هذا يجب أن يكون الجواب المقبول IMO. الأكثر فائدة عموما وليس لدي لتذكر :'<,'>g/^/m'< :) - Eliot
Eliot ، شكرًا! :) (أضفت قليلاً من "محتوى إضافي".))) - Aaron Thoma
كيف يمكنني أن أقول بداية الاختيار -1 في هذه الحالة؟ لأن التحرك يبدأ عند هذه النقطة. - SergioAraujo
SergioAraujo: شيء من هذا القبيل :-1,+1Rev ما الذي تبحث عنه؟ اعرف أنه يمكنك تحديد النطاق الذي تريد عكسه بصريًا ، على سبيل المثال: V7j:Rev. إذا كان هذا لا يجيب على سؤالك ، فأنا لم أفهمه ، لذا يجب عليك وضعه أو إعادة صياغته لي. - Aaron Thoma


دعنا نقول أنك في الخط 3 ، وبالتالي لدينا مجموعة من 3 إلى 6. اكتب فقط.

:3,6g/^/m2

1
2018-02-17 10:25



يمكنك ترك رقم السطر الحالي ضمنيًا: باستخدام المؤشر في السطر الأول من نطاقك ، يمكنك اختصاره إلى :,6g/^/m2. أو في السطر الأخير من النطاق: :3,g/^/m2. و :3,6g/^/m2 يعمل من أي مكان في الملف. - Aaron Thoma