2011-09-08 10 views
5

के भीतर सीएससीओपी आउटपुट को फ़िल्टर करने के लिए कैसे करें मैं विम से cscope क्वेरी के आउटपुट को grep करने का एक तरीका ढूंढ रहा हूं।विम

निम्नलिखित मेरे लिए काम नहीं किया:

:cs f s symbol !grep pattern 

यह दिया:

E259: no matches found for cscope query s symbol !grep pattern ... 

पुनश्च:
मैं redir विधि पता है, मैं एक सरल तरीका फिल्टर करने के लिए
रहा हूँ यूनिक्स कमांड के माध्यम से पूर्व कमांड का आउटपुट।

उत्तर

6

आप रजिस्टर या फ़ाइल में संदेश आउटपुट भेजने के लिए :redir का उपयोग कर सकते हैं।

redir @c 
cs f s symbol 
redir END 

अब आप एक फ़ाइल में c रजिस्टर रखा है और उसे फ़िल्टर कर सकते हैं।

मुझे cscope से बहुत अधिक आउटपुट नहीं मिलता है (यह सब क्विकफ़िक्स में है), लेकिन यह वही करेगा जो आप वर्णन कर रहे हैं।


सामान्य तौर पर, आप खोल आदेश (:help :!cmd देखें) | (बार) के साथ फ़िल्टर कर सकते हैं:

:!echo 0updateView | cscope -dl | grep global 

लेकिन पूर्व आदेशों एक कमांड विभाजक (ताकि आप एक पर एक से अधिक आदेशों रख सकते हैं के रूप में बार व्याख्या लाइन):

:if &ft != 'help' | silent! cd %:p:h | endif 

मुझे नहीं लगता कि आप उत्पादन फ़िल्टर कर सकते हैं के पूर्व redir का उपयोग करने से एक तरफ आदेश है। हालांकि, आप Quickfix को फ़िल्टर करने के लिए बेनोइट के उत्तर का उपयोग कर सकते हैं।

0

यहाँ मेरी कार्यों और मैक्रो QuickFix सूची फ़िल्टर कर सकते हैं:

उपयोग:

  • _qf, _qF, _qp और _qP एक संवाद शीघ्र खोलने
  • आप में एक विम पैटर्न टाइप होगा वह संवाद संकेत
  • _qf और _qF फ़ाइल नामों पर फ़िल्टर करेगा, _qp ए contents _qP लाइन सामग्री पर
  • पूंजीकृत संस्करणों में :v प्रभाव (लाइनों को मेल नहीं रखना) है, सामान्य संस्करण आपके पैटर्न से मेल खाने वाली रेखाएं रखते हैं।
  • :colder और :cnewer के साथ यदि आप संतुष्ट नहीं होते हैं तो आप पुराने और नई Quickfix सूचियों के माध्यम से कूद सकते हैं। मेरे पास उन आदेशों को भी कॉल करने के लिए मैपिंग है।

कोड:

" Filter Quickfix list 
function! FilterQFList(type, action, pattern) 
    let s:curList = getqflist() 
    let s:newList = [] 
    for item in s:curList 
     if a:type == 'f'  " filter on file names 
      let s:cmpPat = bufname(item.bufnr) 
     elseif a:type == 'p' " filter on line content (pattern) 
      let s:cmpPat = item.text . item.pattern 
     endif 
     if item.valid 
      if a:action == '-' 
       " Delete matching lines 
       if s:cmpPat !~ a:pattern 
        let s:newList += [item] 
       endif 
      elseif a:action == '+' 
       " Keep matching lines 
       if s:cmpPat =~ a:pattern 
        let s:newList += [item] 
       endif 
      endif 
     endif 
    endfor 
    " Assing as new quickfix list 
    call setqflist(s:newList) 
endfunction 

nnoremap _qF   :call FilterQFList('f', '-', inputdialog('Delete from quickfix files matching: ', ''))<CR> 
nnoremap _qf   :call FilterQFList('f', '+', inputdialog('Keep only quickfix files matching: ', ''))<CR> 
nnoremap _qP   :call FilterQFList('p', '-', inputdialog('Delete from quickfix lines matching: ', ''))<CR> 
nnoremap _qp   :call FilterQFList('p', '+', inputdialog('Keep only quickfix lines matching: ', ''))<CR> 
+0

मेरे लिए काम नहीं किया था। मेरे पास भी है: सेट cscopequickfix = s-, c-, d-, i-, t-, e-, a- '। दरअसल मैं इस फ़ंक्शन को 'कॉल फ़िल्टरफ्लिस्ट' के साथ कॉल कर सकता हूं, लेकिन कुंजी मैपिंग बस काम नहीं करती है।मेरा मतलब है कि यह मैपिंग सामान्य मोड पर काम कर सकती है इससे पहले कि मैं सीस्कोप के साथ कुछ भी खोजूं। इसके अलावा मैं 'विशाल' सुविधा के साथ अपना विम बना देता हूं। – VicX