ไฮไลต์เลิกทำในกลุ่ม


12

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

ไฮไลต์เลิกทำ

ใครมีความคิดวิธีการทำเช่นนี้ในกลุ่ม?

(ฉันมีปลั๊กอิน Gundo อยู่แล้วฉันต้องการทำให้การยกเลิกเริ่มต้นราบรื่นยิ่งขึ้น)

แก้ไข : ปลั๊กอินundotreeใช้งานได้ ( Gundoไม่เน้นการเปลี่ยนแปลง) เพียงใช้UndotreeToggleคำสั่งและการเปลี่ยนแปลงในอนาคตทั้งหมดในไฟล์จะถูกเน้น


ความคิดดี. คุณสามารถสร้างไฮไลต์ด้วยmatchadd()แต่มีความยุ่งยากเล็กน้อยที่จะทำการเปลี่ยนแปลงส่วนของไฟล์
joeytwiddle

อาจบันทึกลงในบัฟเฟอร์ชั่วคราว / ไฟล์ก่อนเลิกทำจากนั้นไปยังบัฟเฟอร์ที่สอง / ไฟล์หลังจากเลิกทำและไฮไลต์ diffs ใหม่หลังจากทำความสะอาด (หรือเปลี่ยนสีของ) รายการก่อนหน้า อาจช้าสำหรับไฟล์ขนาดใหญ่
VanLaser

UndoTreeจะเน้นการเปลี่ยนบรรทัดจริง ๆแต่จะไม่ทำในเรียลไทม์ ฉันคิดว่ามันใช้ GNU ต่างกัน ได้รับเมล็ดคำจะเป็นขั้นตอนพิเศษ (เช่นสายแยกที่แบ่งคำ , diff เส้น recombine)
joeytwiddle

ปลั๊กอินเหล่านี้เข้ามาใกล้ แต่ก็ยังเป็นแบบบรรทัด: smeargleสามารถเน้นบรรทัดที่เปลี่ยนไปนับตั้งแต่การบันทึกครั้งล่าสุด การเปลี่ยนแปลงปลั๊กอินทำเครื่องหมายบรรทัดที่เปลี่ยนแปลง (รวมถึงการลบ) ในรางน้ำด้านซ้าย
joeytwiddle

1
@jotwiddle การเปลี่ยนแปลงปลั๊กอินยังสามารถเน้นภูมิภาคการเปลี่ยนแปลงล่าสุด
Christian Brabandt

คำตอบ:


6

โซลูชั่นใหม่

คุณสามารถดูการเปลี่ยนแปลงล่าสุดของคุณด้วย:changesคำสั่ง ดังนั้นคุณสามารถ fecth การเปลี่ยนแปลงบรรทัดล่าสุดของคุณด้วย regex จากนั้นใช้บรรทัดกับmatchadd()@joeytwiddle ที่แนะนำ

นี่คือรหัส:

function! DiffWithPrevious()
  call clearmatches()
  redir => message
  silent changes
  redir END
  let line = matchstr(message, '\v\n\s{4}1[^0-9]*\zs\d+\ze')
  highlight TemporalDiff ctermbg=green guibg=green
  let m = matchadd('TemporalDiff', '\%'.line.'l')
endfunction

หมายเหตุ :

  • ฟังก์ชั่นนี้เพิ่มเฉพาะไฮไลท์ใหม่โดยไม่ต้องลบอันเก่าดังนั้นคุณต้องลบอันเก่าออกก่อน ด้วยclearmatchesฟังก์ชั่นที่คุณสามารถลบการแข่งขันก่อนที่จะเพิ่มใหม่ ระวังจะลบการแข่งขันทั้งหมด หากคุณต้องการความละเอียดมากขึ้นคุณสามารถบันทึกการจับคู่และลบออกด้วยตนเอง:

เช่น

function! DiffWithPrevious()
  call matchdelete(m)
  ... 
  let m = matchadd('TemporalDiff', '\%'.line.'l')
endfunction
  • หลังจากการทดสอบบางอย่างฉันพบว่ามันใช้ได้กับการเปลี่ยนแปลงในบรรทัดเดียวเท่านั้น

การอ้างอิง:


วิธีการแก้ปัญหาเก่า

นี่เป็นวิธีแก้ปัญหาที่เป็นไปได้ส่วนใหญ่ได้แรงบันดาลใจจากบัฟเฟอร์ปัจจุบันและไฟล์ต้นฉบับ :

function! DiffWithPrevious()
  undo
  write
  redo
  let filetype=&ft
  diffthis
  vnew | r # | normal! 1Gdd
  diffthis
  exe "setlocal bt=nofile bh=wipe nobl noswf ro ft=" . filetype
endfunction

แนวคิดคือการ diff ไฟล์ด้วยไฟล์บนระบบดังนั้นคุณสามารถเลิกทำการเปลี่ยนแปลงครั้งล่าสุดเขียนมันทำซ้ำการเปลี่ยนแปลง las และดำเนินการ diff

ฉันคิดว่าสิ่งนี้ควรทำงานเพื่อให้เห็นภาพชั่วขณะชั่วขณะ


มีวิธีการล้างข้อความ "บัฟเฟอร์" ใน DiffWithPrevious () หรือไม่ ฉันต้องการฟังก์ชั่นที่เน้นเพียงการเปลี่ยนแปลงครั้งล่าสุด แต่ไฮไลต์กำลังสะสมอยู่ตลอดเวลาฉันลองทำอะไรบางอย่างเช่น message = 0 หรือ message = "" แต่ไม่มีความสำเร็จ
tjbrn

ใช่แน่นอนขอให้ฉันอัปเดตคำตอบของฉัน
nobe4


2

สำหรับใครบางคนที่พยายามแบบเดียวกันกับฉันนั่นคือสิ่งที่ใกล้เคียงที่สุดที่ฉันไปถึงต้องขอบคุณคำตอบ

function! DiffWithPrevious()
  call clearmatches()
  undo
  redir => message
  silent changes
  redir END
  let line = matchstr(message, '\v\n\s{4}1[^0-9]*\zs\d+\ze')
  highlight TemporalDiff ctermbg=black guibg=black
  let m = matchadd('TemporalDiff', '\%'.line.'l')
  redraw
  let gchar = getchar()
  highlight TemporalDiff ctermbg=none guibg=none
  let m = matchadd('TemporalDiff', '\%'.line.'l')
endfunction
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.