วิธีการแบ่งบรรทัดเป็นหลายบรรทัดอย่างมีประสิทธิภาพ


11

ฉันได้รับข้อมูลเข้าสู่ระบบในไฟล์ข้อความที่มีความยาวหนึ่งบรรทัดโดยแต่ละค่าคั่นด้วยช่องว่าง มีคำสั่งหรือชุดคำสั่งที่จะแบ่งหนึ่งบรรทัดเป็นหลายบรรทัดหรือไม่?

คำตอบ:


21

:s/\s\+/\r/gคุณก็สามารถใช้ทดแทนพื้นที่ใดต่อเนื่องสอดคล้องกับการขึ้นบรรทัดใหม่โดยใช้คำสั่ง \s\+หมายถึงอักขระช่องว่างอย่างน้อยหนึ่งตัวและ\rเป็นบรรทัดใหม่ให้ดู:help :substituteและดู:help regexpรายละเอียด หากคุณเรียกใช้คำสั่งในบรรทัดเช่น:

foo bar baz

คุณได้รับ:

foo
bar
baz

หากคุณhlsearchเปิดใช้งานและไม่ต้องการถ่วงหน้าจอของคุณด้วยช่องว่างที่ไฮไลต์อยู่ทุกที่คุณสามารถเขียนฟังก์ชั่นเล็ก ๆ น้อย ๆ ดังต่อไปนี้เพื่อหลีกเลี่ยง:

function! SplitLineNicely()
    " Save previous value of last search register
    let saved_last_search_pattern = @/

    " :substitute replaces the content of the search register with the `\s\+` 
    " pattern highlighting all whitespaces in the file
    substitute /\s\+/\r/g

    " Restore previous search register
    let @/ = saved_last_search_pattern
endfunction

"หากคุณไม่ต้องการถ่วงหน้าจอของคุณด้วยช่องว่างที่ไฮไลต์อยู่ทุกหนทุกแห่ง" นี่ถือว่ามากเกินไปเกี่ยวกับการตั้งค่าของ OP
romainl

@ ฉีดดีขึ้นหรือไม่
toro2k

1
ใช่มันจะดีกว่า IMO
romainl

2
มันเป็นเรื่องที่ดู\r มันอาจจะถูกแทนที่ด้วยการพิมพ์ตัวอักษรขึ้นบรรทัดใหม่:help s/\r <c-v><cr>ในบริบทนี้\nเป็นตัวละคร null :help s/\nดู
toro2k

1
replaces the content of the register- ที่ลงทะเบียน?
Stillanoob

5

การใช้การvimทดแทนอาจเป็นวิธีที่ดีกว่าในการทำงานให้สำเร็จ แต่คุณสามารถใช้มาโครได้เช่นกัน สมมติว่าเรามีข้อมูลต่อไปนี้โดยมีเคอร์เซอร์อยู่ที่บรรทัดที่ 1:

1 a b c d e f
~

เริ่มต้นในโหมดปกติชนqqจะเริ่มต้นการบันทึกแมโคร callable @qผ่าน สิ่งที่พิมพ์หลังจากนั้นqqจะสามารถทำซ้ำได้ผ่านการโทรดังกล่าว เป้าหมายของเราคือการบันทึกคำสั่งปกติที่จะเป็นทั่วไปพอที่จะอนุญาตให้ทำซ้ำได้อย่างราบรื่น

ดังนั้นเราอาจพิมพ์0เพื่อนำเคอร์เซอร์ไปที่จุดเริ่มต้นของบรรทัดจากนั้นfspaceเลื่อนเคอร์เซอร์ไปที่ช่องว่างแรก สิ่งนี้ทำให้เราสามารถพิมพ์renterผลลัพธ์ใน:

1 a
2 b c d e f
~

การกดปุ่มqเป็นความคิดที่ดีเนื่องจากแมโครที่สามารถใช้ซ้ำได้ของเราพร้อมสำหรับการทำซ้ำ ค่อนข้างโดยพลการเราทราบว่ามีช่องว่างเหลืออีก 4 ช่องเพื่อแทนที่ด้วยบรรทัดใหม่ ดังนั้นโดยการกดปุ่ม4@qเราจะทำซ้ำqแมโคร 4 ครั้งซึ่งจะทำให้:

1 a
2 b
3 c
4 d
5 e
6 f
~

โปรดทราบว่าเนื่องจากวิธีที่เราตั้งค่าแมโครมันจะปลอดภัยในการทำซ้ำคำสั่งมากกว่า 9000 ครั้งเนื่องจากจะมีผลกับบรรทัดปัจจุบันเท่านั้นและเนื่องจากไม่มีช่องว่างทางด้านขวาของการป้อนข้อมูลล่าสุดfspaceจะ 'nicely' ล้มเหลวป้องกันไม่ให้ข้อมูลถูกแทนที่ด้วยบรรทัดใหม่

ดังนั้นให้ทำซ้ำตั้งแต่ต้น:

qq0fspacerenterq9001@q

ให้ผลลัพธ์ของเรา


1
ฉันชอบที่คุณมี9001คีย์บนแป้นพิมพ์เพื่อพิมพ์ชื่อผู้ใช้ของคุณอย่างรวดเร็ว
รวย

5

วิธีที่ง่ายที่สุดที่ฉันพบในการแบ่งบรรทัดใน Vim คือคำสั่งโหมดปกติgq(พิมพ์ตัวอักษรทั้งสองอย่างต่อเนื่องอย่างรวดเร็วในโหมดปกติหรือโหมดภาพ)

ในโหมดภาพมันจะแยกสิ่งที่เลือกไว้ในโหมดปกติคุณตามgqด้วยการเคลื่อนไหว

ตัวอย่างเช่นgqlจะแบ่งหนึ่งบรรทัดเป็นความกว้างที่ตั้งไว้ในปัจจุบัน ในการตั้งค่าความกว้างของเส้นแบ่งที่จะแตกต่างจากการตั้งค่าปัจจุบันของคุณคุณสามารถใช้:set textwidth=nซึ่งnเป็นจำนวนตัวอักษรที่คุณต้องการในบรรทัดเช่น10และเปลี่ยนกลับเป็นความกว้างปกติของคุณเมื่อคุณทำเสร็จแล้ว

รับข้อมูลนี้จากวิดีโอ Youtube โดย Kholidfu ที่แสดงวิธีการเข้าร่วมและแยกบรรทัดในโหมดปกติโดยใช้การเคลื่อนไหว

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.