วิธีการเข้าร่วมสายโดยไม่ต้องผลิตพื้นที่?


72

Jคำสั่งมาตรฐานสำหรับการเข้าร่วมบรรทัดแทนที่อักขระขึ้นบรรทัดใหม่ด้วยช่องว่าง มันมีประโยชน์เมื่อแก้ไข 'วรรณคดี' แต่อาจลำบากถ้าฉันพูดแก้ไขฐานสิบหกด้วยมือถ้าฉันลืมลบพื้นที่ที่ไม่จำเป็นออก

มีวิธีที่ง่ายและรวดเร็วในการเข้าร่วมสองบรรทัดโดยไม่ต้องเว้นช่องว่างระหว่างพวกเขาหรือไม่?

คำตอบ:


86

การgJรวมกันทำสิ่งนี้; จาก:help gJ:

เข้าร่วม [count] บรรทัดอย่างน้อยสองบรรทัด อย่าแทรกหรือลบช่องว่างใด ๆ

คุณสามารถปฏิเสธได้Jหากคุณต้องการบันทึกการกดแป้น:

:nnoremap J gJ

โปรดทราบว่านี้ไม่ได้ลบช่องว่างใด ๆ ดังนั้นหากทั้งบรรทัดปัจจุบันจะสิ้นสุดลงด้วยช่องว่างหรือบรรทัดถัดไปเริ่มต้นด้วยหนึ่งหรือมากกว่าหนึ่งช่องว่างที่พวกเขาจะถูกทิ้งไว้ตามที่เป็นอยู่

ดังนั้น:

Hello
    world

กลายเป็น:

Hello    world

เราสามารถใช้Jxในกรณีนี้ได้Helloworldแต่จะไม่สามารถใช้ได้ในทุกกรณี จากความช่วยเหลือ:

เข้าร่วมบรรทัดที่เน้นด้วยอย่างน้อยสองบรรทัด ลบการเยื้องและแทรกสูงสุดสองช่องว่าง

[ ... ]

คำสั่งเหล่านี้ยกเว้น "gJ" แทรกหนึ่งช่องว่างแทนเว้นวรรคเว้นวรรคหรือบรรทัดถัดไปขึ้นต้นด้วย ')'

ดังนั้นในบางกรณีมากกว่าหนึ่งช่องว่างหรือไม่มีช่องว่างถูกแทรก เท่าที่ฉันเห็นไม่มีวิธีง่ายๆในการเปลี่ยนแปลงพฤติกรรมนี้ ฉันสร้างฟังก์ชันเพื่อปรับเปลี่ยนgJให้เข้าร่วมโดยไม่มีช่องว่างเสมอ:

" Like gJ, but always remove spaces
fun! JoinSpaceless()
    execute 'normal gJ'

    " Character under cursor is whitespace?
    if matchstr(getline('.'), '\%' . col('.') . 'c.') =~ '\s'
        " When remove it!
        execute 'normal dw'
    endif
endfun

" Map it to a key
nnoremap <Leader>J :call JoinSpaceless()<CR>

ดูเพิ่มเติมที่: :help J,:help 'joinspaces'


เป็นไปได้หรือไม่ที่จะใช้ฟังก์ชั่น "รักษา" เพื่อรักษาตำแหน่งเคอร์เซอร์เมื่อใช้งานฟังก์ชั่นนี้หรือฉันจะได้ผลลัพธ์นี้ได้อย่างไร?
SergioAraujo

8

เคล็ดลับอีกอย่างที่คุณอาจลองใช้คือแทนที่ บางครั้งสิ่งนี้อาจมีประโยชน์

%s/$\n//g

สถานการณ์จำลอง: ลบอักขระตัวสุดท้ายและเข้าร่วมกับบรรทัดถัดไป:

%s/=$\n\(.\)/\1/g

ตัวอย่างเช่น,

xxxx=
123

กลายเป็น:

xxxx123

3

สร้างแมโครและใช้ซ้ำ:

qaJxq

ตอนนี้เล่นแมโครอีกครั้งaโดยใช้@aทุกที่ที่คุณต้องการเข้าร่วมสองบรรทัดโดยไม่มีที่ว่าง

@@จะทำซ้ำแมโครก่อนหน้า ดังนั้นคุณสามารถกดค้าง@เพื่อเข้าร่วมหลายบรรทัด


1
ทำไมพิมพ์@aเมื่อคุณสามารถพิมพ์Jx? การกดปุ่มจำนวนเดียวกันและการกดแป้น SHIFT!
Shahbaz

2
@Shahbaz อาจเป็นเพราะในบรรทัดสุดท้าย: "คุณสามารถถือ @" ได้
muru

1
@muru นั่นจริง!
Shahbaz

4
นอกจากนี้ยังทำให้เป็นคำสั่งที่ทำซ้ำได้ดังนั้นคุณสามารถใช้3@aเพื่อรวม 3 บรรทัดในขณะที่การทำ3Jxจะรวม 3 บรรทัดด้วยช่องว่างแล้วลบช่องว่างระหว่างบรรทัดที่สองและสามออกจากช่องว่างระหว่างบรรทัดอื่น
Haegin

1

หากต้องการเข้าร่วมกับพื้นที่เดียวเสมอ:

nmap J gJi <ESC>ciW <ESC>

ในการเข้าร่วมโดยไม่ต้องเว้นวรรค (ลบส่วนต่อท้าย + นำพื้นที่):

nmap <C-J> gJi <ESC>diW

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

1

เลือกบรรทัดที่คุณต้องการรวมป้อนคำสั่งExโดยพิมพ์เครื่องหมายโคลอน:ในโหมดปกติ จากนั้นพิมพ์คำสั่งนี้:

s/$\n\s*//gc

คำสั่งทั้งหมดควรมีลักษณะเช่นเดียวกัน:

:'<,'>s/$\n\s*//gc

นี่เป็นเวอร์ชัน tweaked ของคำสั่ง @ insidepowerที่แทนที่การเว้นวรรคและอักขระขึ้นบรรทัดใหม่

คำอธิบาย:

  • '<,'> หมายความว่าเราปรับเปลี่ยนเฉพาะบรรทัดที่เลือกในโหมดภาพ

  • /$\n\s*เป็นรูปแบบregex เรากำลังมองหาคู่ที่ลงท้าย$ด้วยอักขระบรรทัดใหม่\nและมีจำนวน whitespaces ที่ไม่ได้กำหนด*หลังจากนั้น

  • s/pattern//gcเป็นคำสั่งแทนที่เพื่อค้นหาแต่ละรูปแบบและแทนที่ด้วยอักขระว่างในการยืนยัน

หากต้องการทราบเพิ่มเติมเกี่ยวกับธงและอักขระเมตาสำหรับการแสดงผลปกติใน Vim ลองดูที่บทการอ้างอิง Vim นี้


2
สวัสดี ubique ยินดีต้อนรับสู่Vi และกลุ่ม ! คุณมีคำตอบที่เขียนค่อนข้างดี รุ่งโรจน์สำหรับการที่ Nitpick หนึ่งอันของฉันคือนิพจน์ทั่วไปที่เป็นกลุ่ม = / = python นิพจน์ทั่วไปและบางครั้งอาจทำให้ผู้ใช้เกิดความสับสน อาจเชื่อมโยงไปยังเอกสารความช่วยเหลือสำหรับ Vim regex แทนใช่ไหม
D. Ben Knoble

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