विम में हाइलाइट किए गए पूर्ववत


12

मैं Vim में एक हाइलाइटेड पूर्ववत् करने की कोशिश कर रहा हूं, जैसे स्पेसकम डिफ़ॉल्ट डिफ़ॉल्ट। कभी-कभी जब मैं त्वरित पूर्ववत चाहता हूं, तो मैं महसूस नहीं कर सकता कि क्या बदल गया क्योंकि यह तात्कालिक है। तो मैं कुछ ऐसा करने की कोशिश कर रहा हूँ जब कोई प्रेस पूर्ववत करता है:

पूर्ववत प्रकाश डाला

किसी को भी एक विचार है कि यह विम में कैसे करना है?

(मेरे पास पहले से ही गुंडो प्लगइन है, मैं बस डिफ़ॉल्ट को अधिक चिकनी बनाना चाहता हूं)

संपादित करें : undotree प्लगइन काम करता है ( Gundo परिवर्तनों को उजागर नहीं करता है), बस UndotreeToggleकमांड का उपयोग करें और फ़ाइल पर भविष्य के सभी परिवर्तनों को हाइलाइट किया जाएगा।


अछा सुझाव। आप के साथ एक हाइलाइट बना सकते हैं matchadd(), लेकिन थोड़ा और मुश्किल काम कर रहा है जो फ़ाइल के कुछ हिस्सों को बदल दिया है।
joeytwiddle

शायद पूर्ववत करने से पहले एक अस्थायी बफर / फ़ाइल को सहेजना, फिर पूर्ववत करने के बाद 2 बफ़र / फ़ाइल में, और पिछले को साफ करने (या रंग बदलने) के बाद नए को उजागर करना। बड़ी फ़ाइलों के लिए धीमा हो सकता है।
वैनलेजर

UndoTree वास्तव में बदली हुई रेखाओं को उजागर करता है , लेकिन यह वास्तविक समय में ऐसा नहीं करता है। मुझे लगता है कि यह GNU भिन्न का उपयोग करता है। शब्द ग्रैन्युलैरिटी प्राप्त करना एक अतिरिक्त कदम होगा (उदाहरण के लिए शब्द विराम पर विभाजन रेखाएं , अंतर, पुनः संयोजक रेखाएं)।
joeytwiddle

ये प्लगइन्स करीब आते हैं, लेकिन वे अभी भी लाइन-आधारित हैं: स्मियरल अंतिम सेव के बाद से लाइनों को बदल सकते हैं। परिवर्तनप्लगिन के निशान बाईं ओर नाली में लाइनों (विलोपन सहित) को बदल दिया।
joeytwiddle

1
@joeytwield, changesPlugin अंतिम परिवर्तन क्षेत्र को भी उजागर कर सकता है
क्रिश्चियन ब्रेन्डट

जवाबों:


6

नया समाधान

आप :changesकमांड के साथ अपने अंतिम बदलाव देख सकते हैं । तो आप एक 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

सिस्टम पर फ़ाइल के साथ फ़ाइल को अलग करना विचार है, इसलिए आप अपने अंतिम परिवर्तन को पूर्ववत करें, इसे लिखें, लास परिवर्तन को फिर से करें और अंतर को निष्पादित करें।

मुझे लगता है कि यह समय-समय पर अस्थायी रूप से भिन्न दृश्य के लिए काम करना चाहिए।


डिफ्विथप्रेग () पर संदेश "बफर" को साफ़ करने का एक तरीका है? काश, फ़ंक्शन केवल अंतिम परिवर्तनों को हाइलाइट करता है, लेकिन हाइलाइट समय के साथ जमा हो रहा है, IM कुछ संदेश की कोशिश कर रहा है = संदेश या "=" लेकिन कोई सक्सेज नहीं।
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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.