วิธีการกลับรายการที่เลือกในกลุ่ม?


12

หลังจากเลือกช่วงของบรรทัดด้วยVคำสั่งฉันต้องการลบทุกบรรทัดของไฟล์ที่ไม่ได้เลือกดังนั้นวิธีที่จะกลับการเลือก - เลือกทุกบรรทัดที่ไม่ได้เลือก?

ชอบอย่างไร

:g!/FOO/d

ลบเส้นที่ไม่ทุกไม่ประกอบด้วยFOO

หากฉันมีช่วงในใจและต้องการที่จะใช้อินเวอร์สของมัน:

'a,'b

ฉันจะต้องใช้ช่วงสองช่วง:

1,'a-1

และ

'b+1,$

ฉันสงสัยว่าสิ่งนี้ไม่สามารถทำได้ในขั้นตอนเดียว - แต่มันจะดีมาก!


คุณต้องการการทำงานแบบ "ครอบตัด" หรือไม่
ต้มตุ๋น Quixote

คำตอบ:


7

ขั้นแรกสร้างการแมปต่อไปนี้ (ตัวอย่างเช่นผูกไว้กับ<F4>คีย์)

map <F4> :<C-U>1,'<-1:delete<CR>:'>+1,$:delete<CR>

จากนั้นหลังจากเลือกช่วงในโหมดภาพให้กด<F4>เพื่อเรียกคำสั่งที่เกี่ยวข้อง คำสั่งสามารถอธิบายได้อย่างง่ายดายในส่วนต่าง ๆ :

  • " :" เข้าสู่โหมดบรรทัดคำสั่ง
  • " <C-U>" ลบอักขระทั้งหมดระหว่างตำแหน่งเคอร์เซอร์และจุดเริ่มต้นของบรรทัด
  • " 1,'<-1" ระบุช่วงจากบรรทัดแรกของไฟล์ไปยังบรรทัดก่อนเริ่มการเลือกปัจจุบัน
  • " :delete<CR>" ลบ (ช่วงของบรรทัดที่ระบุไว้ก่อนหน้านี้)
  • " :'>+1,$:delete<CR>" ลบบรรทัดในช่วง " '>+1,$" คือจากบรรทัดหลังจากสิ้นสุดการเลือกไปยังจุดสิ้นสุดของไฟล์

2
เพื่ออธิบาย: 1, '<- 1 คือช่วงจากบรรทัดที่ 1 จนถึงจุดเริ่มต้นของการเลือก '> + 1, $ เป็นช่วงตั้งแต่วันที่ 1 สายหลังจากที่เลือกได้ไม่เกินสิ้นที่ ...
อากิระ

มีวิธีที่จะทำเช่นนั้นด้วยคำสั่ง "ลบ" เดียวเท่านั้น?
Kevin Panko

1
@Kevin Panko: คุณต้องรวมช่วงเป็นนิพจน์เดียว ฉันได้ดูเอกสารแล้วและฉันไม่คิดว่าไวยากรณ์ของช่วงรองรับสิ่งนั้น vimdoc.sourceforge.net/htmldoc/cmdline.html#cmdline-ranges ,,, vim.wikia.com/wiki/Ranges
quack quixote

15
  1. เลือกข้อความของคุณ
  2. "*yggdG"*p ซึ่งหมายความว่า ...

    "*y    " yank it to the selection register
    ggdG   " delete everything
    "*p    " and paste the selection again 
    

9
ygg "_dGP เหมือนกัน แต่ก็สั้นกว่านี้
Kevin Panko

1
ในที่สุดคุณจะได้รับข้อความเดียวกันจริง :)
akira

ฉันแค่อ้างถึงคำตอบของ Akira และ Kevin Panko (ฉันไม่สามารถเพิ่มความคิดเห็นได้) "[o] pposite [d] elete in (v) โหมด isual vmap กับ ygg" _dGP
Marcin Rogacki

ปลั๊กอินเช่นgithub.com/maxbrunsfeld/vim-yankstackทำให้วิธีการนี้ง่ายขึ้น คุณไม่ต้องกังวลมากนักเกี่ยวกับการลบข้อมูลลงทะเบียนของคุณเพราะการถูกลบ
Jack O'Connor

สามารถเพิ่มสิ่งนี้เป็นการจับคู่แป้นพิมพ์ได้.vimrcอย่างไร ฉันลองมาหลายครั้งแล้ว แต่ยังไม่ได้รับ ความพยายามของฉันเป็นmap <F4> n"*yggdG"*p และnmap <F4> "*yggdG"*p
แบรดพาร์

7

สำหรับลูกหลาน:

:v/\%V/d

นั่นคืออินเวิร์สโกลบอลบนบรรทัดที่ไม่ได้เป็นส่วนหนึ่งของการเลือก โปรดทราบว่า: v เป็นโครงสร้างที่อิงตามบรรทัดดังนั้นบรรทัดใด ๆ ที่มีการเลือกใด ๆ ไม่ว่าจะเป็นไลน์การสตรีมหรือการเลือกบล็อกจะเป็นการลบอย่างไม่เหมาะสม


1

ตั้งแต่ 'กลับหัว' หมายถึงโดยทั่วไปในการสร้าง 'multiselections' (พื้นที่ก่อนและหลังการเลือกเดิม) i สืบค้น vimscripts อีกครั้งhttp://www.vim.org/scripts/script.php?script_id=953 ลองนี้

 There are a number of operations to very
 easily manipulate selections such as modifying 
 the regions (add/delete/inverte/clear), hiding, 
 refreshing, saving and restoring etc."
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.