วิธีลบบรรทัดด้านบน / ล่างเคอร์เซอร์ แต่ไม่ใช่บรรทัดปัจจุบัน


11

มีคำสั่งสำหรับการลบบรรทัด (หรือ n บรรทัด) เหนือบรรทัดปัจจุบันหรือไม่? ดังกล่าวข้างต้น = ปัจจุบันไม่รวม

คือมีทางเลือกอื่นdkที่จะไม่ลบบรรทัดปัจจุบันหรือไม่ คล้ายกับวิธีo/ Oและp/ Pทำงาน แต่มีการลบ

ขณะนี้ฉันกำลังทำอยู่kddซึ่งย้ายเคอร์เซอร์หนึ่งบรรทัดขึ้นและลบออก ฉันสามารถทำได้nnoremap <Leader>d kddและnnoremap <Leader>D jdd-แต่มีทางเลือกที่ไม่ย้ายเคอร์เซอร์ดูเหมือนว่าเป็นตัวเลือกที่ดีกว่า มีแบบนี้เหรอ?


หากปัญหาของคุณคือการแมปของคุณเลื่อนเคอร์เซอร์ทำไมคุณไม่ทำnnoremap <Leader>d kddjและnnoremap <Leader>D jddk?
statox

ใช้อย่างใดอย่างหนึ่งkddjหรือjddkตำแหน่งคอลัมน์ไม่ได้เก็บรักษาไว้ ฉันไม่ได้บอกว่ามันเป็นปัญหาใหญ่ แต่ก็น่ารำคาญ สำหรับระเบียนให้kddjเลื่อนเคอร์เซอร์ 1 บรรทัดด้านล่างตำแหน่งเดิม และjdd-ดูเหมือนเป็นทางเลือกที่ดีกว่าjddkเพราะอย่างน้อยฉันก็กลับไปที่ตัวละครที่ไม่ใช่ white space ตัวแรก หากบรรทัดด้านล่างบรรทัดที่ฉันต้องการลบว่างเปล่าฉันจะอยู่ที่จุดเริ่มต้นของบรรทัด
Martin Tóth

วิธีการเกี่ยวกับการใช้ makdd`a สำหรับแผนที่ของคุณ? ตั้งเครื่องหมายและกลับไปที่มันในภายหลัง ... คุณอาจต้องการเปลี่ยนเป็นอักขระที่ใช้น้อยกว่า
PhilippFrank

@PhilippFrank หรือฉันสามารถใช้ `` เพื่อให้เคอร์เซอร์กลับมาและไม่ใช้การลงทะเบียน (ไม่ใช่ฉันใช้ :))
Martin Tóth

ไม่นั่นไม่ได้ผล k ไม่ใช่การกระโดดดังนั้นคุณไม่สามารถกลับไปใช้ `` ได้
PhilippFrank

คำตอบ:


30
:-d

ตัดบรรทัดด้านบนบรรทัดปัจจุบัน


:-5d

ตัดบรรทัดที่ 5 เหนือบรรทัดปัจจุบัน (แต่ย้ายเคอร์เซอร์)


:-5,-d

ตัด 5 บรรทัดเหนือบรรทัดปัจจุบัน


:+,+5d

ตัด 5 บรรทัดด้านล่างบรรทัดปัจจุบัน


2
ที่ยังคงเลื่อนเคอร์เซอร์แม้ว่า
PhilippFrank

1
คุณไม่สามารถหลีกเลี่ยงการเลื่อนเคอร์เซอร์ ดีที่สุดที่คุณสามารถทำได้คือการเลื่อนเคอร์เซอร์และย้ายกลับ
romainl

ขอบคุณ! "วิธีที่เป็นกลุ่ม" แบบนี้เป็นสิ่งที่ฉันกำลังมองหา ฉันจะใช้สิ่งนี้ร่วมกับ `` เพื่อให้เคอร์เซอร์กลับมาที่เดิม
Martin Tóth

6

หากเราใช้การลบการลงทะเบียนขนาดเล็ก "- เราสามารถคืนค่าตำแหน่งเคอร์เซอร์หลังจากลบเหนือบรรทัด n

ตัวอย่างเช่นd0dgk"-Pลบด้านบน 1 บรรทัดและกู้คืนเคอร์เซอร์กลับไปที่เดิม

  1. d0ลบอักขระจากเคอร์เซอร์ไปที่อักขระตัวแรกของบรรทัด เนื่องจาก0เป็นการเคลื่อนไหวแบบเอกสิทธิ์เฉพาะบุคคลอักขระใต้เคอร์เซอร์จึงไม่ถูกลบ และตัวละครที่ถูกลบจะถูกใส่ลงในตัวลบขนาดเล็ก "-

  2. dgkลบด้านบน 1 บรรทัด สิ่งนี้จะออกจากบรรทัดปัจจุบันเพราะgkไม่ใช่เส้นสายและเอกสิทธิ์

  3. "-P ทำให้ข้อความจากการลงทะเบียนลบขนาดเล็ก "-

มันเป็นแฮ็คชนิดหนึ่ง แต่ถ้าคุณกำลังมองหาคำสั่งที่ไม่ใช่ ex พิจารณาใช้มัน


เป็นทางออกที่ดี! ถึงแม้ว่าผมจะคิดว่าคุณต้องการไม่ได้"-P "-pหลังข้อความยุ่งเล็กน้อย
James

@DJMcMayhem คุณพูดถูก ฉันแก้ไขคำตอบ ขอบคุณสำหรับการชี้ให้เห็นมัน
MS.Kim

5

แก้ไขฉันไม่ทราบคุณสมบัติในตัวที่แนะนำโดย @Romainl ในคำตอบของเขา: แน่นอนว่าควรใช้วิธีการ-dและ+dวิธีการที่สะดวกกว่าการเพิ่มฟังก์ชั่นให้กับคุณ.vimrc

อาจเพิ่มสิ่งที่คุณต้องการ.vimrcเป็นสิ่งที่คุณต้องการ:

function! DeleteOver()
   let save_cursor = getpos(".")
   normal k
   normal dd
   call setpos(".", save_cursor)
   normal k
endfunction

function! DeleteUnder()
   let save_cursor = getpos(".")
   normal j
   normal dd
   call setpos(".", save_cursor)
endfunction

ฟังก์ชั่นเหล่านี้จะลบบรรทัดใต้หรือบรรทัดเหนือบรรทัดปัจจุบันและกลับไปที่ตำแหน่งก่อนการลบ

สำหรับฟังก์ชั่นที่DeleteOver()เราต้องขึ้นไปหนึ่งบรรทัดด้วยnormal kหลังจากการลบเพราะการลบเปลี่ยนจำนวนบรรทัดเดิมที่ไม่ได้เกิดขึ้นด้วยDeleteUnder()

คุณสามารถเพิ่มสิ่งนี้ลงใน .vimrc

nnoremap <Leader>d :call DeleteOver()<CR>
nnoremap <Leader>D :call DeleteUnder()<CR>

เพื่อสร้างการแมปที่เรียกใช้ฟังก์ชั่น


อีกทางเลือกหนึ่งในการบันทึก / เรียกคืนตำแหน่งเคอร์เซอร์คือการยกเลิกการตั้งค่า / กู้คืนnostartoflineตัวเลือก
Rich

2

บางทีคุณอาจปรับปรุงกระบวนการทำงานของคุณถ้าไม่กลัวที่จะ ... กระโดด :)

ตัวอย่าง:

This is where cursor initially is: _.

[Some other stuff you want to keep/skip ...]

I want to delete these lines.
I want to delete these lines.
I want to delete these lines.
I want to delete these lines.
I want to delete these lines.

การกระทำของคุณ (โหมดปกติเคอร์เซอร์อยู่บน):_ /I want Enter 5dd Ctrl-oแค่นั้นแหละ.

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

ตัวอย่างเช่นหากคุณใช้หมายเลขบรรทัดสัมบูรณ์คุณสามารถแทนที่/I want Enterด้วยสิ่งที่ต้องการ78ggหรือ78Gเพื่อกระโดดไปที่หมายเลขบรรทัดนั้นโดยตรง


0

จากวิธีการแก้ปัญหาของms-kimฉันได้พัฒนารูปแบบที่แตกต่างออกไปเล็กน้อยซึ่งจะช่วยประหยัดตำแหน่งของคุณ

function! DeleteLineAbove()
    if line('.') == 1
        echom "You are at the first line!"
        return
    endif
    let l:colsave = col(".")
    exec  "normal! kdd"
    call cursor(line("."), l:colsave)
endfunction
nnoremap <Leader>k :call DeleteLineAbove()<CR>

OBS: ฉันใช้โพสต์นี้เป็นข้อมูลอ้างอิงด้วย


คุณหมายถึง @statox มากกว่า @ MS.Kim หรือเปล่า
Rich

-1

หากคุณต้องการลบบรรทัดที่ซ้ำกันตลอดทั้งไฟล์ให้ทำดังต่อไปนี้:

:g/any part of the string/d

ตัวอย่าง:

ในโหมดคำสั่ง

:g/I want to delete/d

หากคุณต้องการรายการสตริงเริ่มต้น:

:g/I want to delete/p

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