ฉันจะสลับลำดับบรรทัดที่เลือกเป็นกลุ่มได้อย่างไร?


94

ตัวอย่างเช่นถ้าฉันมีสี่บรรทัดดังนี้

บรรทัดแรกบรรทัด
ที่สองบรรทัด
ที่สามบรรทัด
ที่สี่

ฉันต้องการกลับพวกเขาไป

บรรทัดที่สี่บรรทัด
ที่สามบรรทัด
ที่สองบรรทัด
แรก

ฉันจะทำสิ่งนี้ใน Vim ได้อย่างไร



1
ที่เกี่ยวข้อง: Reverse all lines @ Vim Wikia
Palec

1
:command! -bar -range=% Reverse <line1>,<line2>global/^/m<line1>-1 vi.stackexchange.com/a/2107/10254
qeatzy

คำตอบ:


86

ในการย้อนกลับบรรทัดทั้งหมดในไฟล์

:g/^/m0

สำหรับคำอธิบายดู

:help 12.4

ซึ่งยังแสดงวิธีการย้อนกลับเพียงช่วงของเส้น


12
สุดยอดเคล็ดลับในส่วนช่วยเหลือที่แน่นอน! เพื่อสรุป: 1. ตั้งเครื่องหมายที่บรรทัดสุดท้ายที่คุณต้องการย้อนกลับ (ฉันชื่อเครื่องหมาย 'ใช้' ma) 2. เลื่อนเคอร์เซอร์ไปที่บรรทัดแรกของบล็อก 3. พิมพ์:'a,.g/^/m 'a
Brent Faust

68

เลือกสายที่ต้องการตี!และในท่อพรอมต์ส่งผลให้เส้นผ่านลาtac :'<,'>!tacดูman tacรายละเอียดเพิ่มเติมได้ที่


4
ในการเลือกเส้นให้ใช้shift+vเพื่อเข้าสู่โหมดเส้นสายตาแล้วjเพื่อเพิ่มเส้นในการเลือก
wisbucky

ฉันสามารถยืนยันได้ว่าสิ่งนี้ทำงานได้ในหน้าต่างด้วยgvimเช่นกัน! มิฉะนั้นคุณต้องใช้หมายเลขบรรทัดสัมบูรณ์ (บางทีคุณสามารถใช้ญาติ แต่คุณต้องระวัง) ด้วย:g/^/m0(ซึ่งก็ยากที่จะจำได้จริงๆ) ... ดังนั้นโดยพื้นฐานแล้วแทคควรจะเป็นกลุ่มไม่ว่าแพลตฟอร์มใด คุณอยู่ แต่ไม่ได้เป็น vimscript 100% แต่ใครสนใจ: P
dylnmc

tac ไม่ได้จัดการ vim แบบเนทีฟอย่างสมบูรณ์ แต่คำสั่ง 'm'ove ใช้หมายเลขบรรทัดและนั่นไม่สมเหตุสมผลเสมอไป ฉันมักจะใช้เครื่องหมายเป็นส่วนหนึ่งของช่วงดังนั้น:.,'a!tacทำงานด้วยความพยายามน้อยที่สุด
studog

หลังจากใช้shift+vคุณสามารถใช้}เพื่อเข้าถึงย่อหน้าถัดไปหรือพื้นที่แนวตั้งว่าง นอกจากนี้, man tac: concatenate and print files in reverse.
nilon

33

บน Mac OS X tacไม่มีอยู่ แต่คุณสามารถใช้เอtail -rฟเฟกต์เดียวกันได้:

:%!tail -r

สิ่งนี้ยังใช้งานได้ดีสำหรับโหมดภาพ:

:'<,'>!tail -r

ตัดตอนมาจากtail(1)manpage ของ:

อ็อพชัน -r ทำให้อินพุตถูกแสดงในลำดับย้อนกลับตามบรรทัด นอกจากนี้ตัวเลือกนี้จะเปลี่ยนความหมายของตัวเลือก -b, -c และ -n เมื่อระบุอ็อพชัน -r ตัวเลือกเหล่านี้จะระบุจำนวนไบต์บรรทัดหรือบล็อก 512- ไบต์ที่จะแสดงแทนไบต์บรรทัดหรือบล็อกจากจุดเริ่มต้นหรือจุดสิ้นสุดของอินพุตที่จะเริ่มต้นแสดงผล ค่าดีฟอลต์สำหรับอ็อพชัน -r คือการแสดงอินพุตทั้งหมด


3
ยอดเยี่ยม! ดังนั้นเพื่อให้ 'tac' ภายใต้ OS X:alias tac='tail -r'
Brent Faust

4
คุณยังสามารถและการใช้งานbrew install coreutils gtac
Andrew Marshall

1
อัจฉริยภาพ ไม่เคยคิดจะใช้! คำสั่งสำหรับการจัดการสายภาพประเภทนี้
Charlie Dalsass

3

สำหรับผู้ที่สะดวกสบายมากขึ้นด้วยโหมดภาพ:
1. :set nuระบุหมายเลขบรรทัดข้างต้นตัวเลือกที่คุณต้องการพลิกใช้
2. Shift-Vเพื่อไฮไลต์การเลือกที่คุณต้องการพลิก (โหมดภาพ)
3 :g/^/m <Line number from step 1>.

โปรดทราบว่าในโหมดภาพมันจะปรากฏขึ้นโดยอัตโนมัติ :'<,'>g/^/m <Line number>เมื่อคุณพิมพ์คำสั่งจาก 3

คำสั่งนี้ทำงานโดยย้ายการเลือกทีละหนึ่งบรรทัดไปยังหมายเลขบรรทัดที่คุณกำหนด เมื่อรายการที่สองถูกผลักเข้าไปในหมายเลขบรรทัดที่กำหนดรายการนั้นจะถูกผลักลงไปที่หมายเลขบรรทัดแรก + 1 จากนั้นรายการที่สามจะผลักดันรายการแรกและรายการที่สองลงเรื่อย ๆ จนกว่ารายการทั้งหมดจะถูกผลักเข้าสู่หมายเลขบรรทัดเดียว ย้อนกลับรายการสั่งซื้อ


4
คุณสามารถใช้'<แทนการป้อนหมายเลขบรรทัดด้วยตนเอง :'<,'>g/^/m'<เพียงแค่เริ่มต้นการเลือกหนึ่งบรรทัดก่อนหน้านี้และดำเนินการ
Palec

3

คำสั่ง: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 )


นี่ควรเป็นคำตอบที่ IMO ยอมรับ มีประโยชน์มากที่สุดโดยทั่วไปและฉันไม่ต้องจำ:'<,'>g/^/m'<:)
เอเลียต

1
@Eliot ขอบคุณ! :) (ฉันเพิ่ม 'เนื้อหาโบนัส' เล็กน้อย).)
Aaron Thoma

ฉันจะบอกว่าการเลือกเริ่มต้น -1 ในกรณีนี้ได้อย่างไร เพราะการย้ายเริ่มต้นที่จุดนี้
SergioAraujo

@SergioAraujo: เป็นสิ่ง:-1,+1Revที่คุณกำลังมองหา? รู้ว่าคุณสามารถเลือกช่วงที่คุณต้องการย้อนกลับได้เช่น: V7j:Rev. หากนั่นไม่ได้ตอบคำถามของคุณฉันไม่เข้าใจดังนั้นคุณต้องอธิบายให้ละเอียดหรือใช้ถ้อยคำใหม่แทนฉัน
Aaron Thoma

1

สมมติว่าคุณอยู่ที่บรรทัดที่ 3 ดังนั้นเราจึงมีช่วง 3 ถึง 6 เพียงพิมพ์

:3,6g/^/m2

1
คุณสามารถปล่อยให้หมายเลขบรรทัดปัจจุบันโดยนัย: ด้วยเคอร์เซอร์บนบรรทัดแรกของช่วงคุณสามารถย่อให้เป็น:,6g/^/m2; หรือเมื่ออยู่ในบรรทัดสุดท้ายของช่วง: :3,g/^/m2; และ:3,6g/^/m2ทำงานได้จากทุกที่ในไฟล์
Aaron Thoma
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.