ज्ञात फ़िलिपीस सूची


54

मैं उन फ़िल्टरों के नामों की सूची कैसे प्राप्त कर सकता हूं जिनके बारे में विम को वर्तमान में पता है?

मैं ऐसा करने में सक्षम होना चाहता हूं, ताकि जब विम स्वचालित रूप से एक फ़िलाटाइप का पता न लगा सके तो मैं कुछ फ़िलिप्टम्स विम के बारे में जान सकता हूं जो समान हो सकते हैं और देखें कि क्या वे उचित वाक्यविन्यास हाइलाइटिंग प्रदान करते हैं।

मुझे पता है कि फिल्म्स के साथ काम करने वाली विमस्क्रिप्ट फाइलें ftpluginकन्वेंशन द्वारा डायरेक्टरी में डाल दी जाती हैं, लेकिन उन्हें होने की जरूरत नहीं है (मुझे यकीन नहीं है, लेकिन मुझे नहीं लगता कि डाइरेक्टरी में वाइसस्क्रिप्ट फाइलें ftpluginखास हैं) इसलिए मैं बस चाहता हूं vim से पूछें कि इसके बारे में कैसे पता चलता है कि यह उनके बारे में कैसे सीखा, इसके बारे में क्या पता चलता है।


1
जब आप स्वत: पूर्ण होने का प्रयास करते हैं, तो आप एक सूची देख सकते हैं :setfiletype (यानी Tabकिसी स्थान के बाद)। सुनिश्चित नहीं है कि यह पूरी सूची है, या इसे कुछ बफर / फ़ाइल में कैसे कैप्चर करना है।
वनलेसर

1
सूची पूर्णताओं के <c-d>बजाय उपयोग करें <tab>
पीटर रिंकेर

सूची को फ़िल्टर करने के लिए एक पत्र या कुछ लिखें और प्रविष्टियाँ दिखाएँ जो इन पत्रों के साथ शुरू की गई है।
शामोके

जवाबों:


63

सरल उपाय

टाइप करें :setfiletype (बाद में एक जगह के साथ) , फिर दबाएं Ctrl-d

:help cmdline-completionविम की कमांड लाइन में स्वतः पूर्णता के बारे में अधिक जानकारी के लिए देखें ।

जटिल समाधान

यह समाधान 'runtimepath'सभी उपलब्ध सिंटैक्स निर्देशिकाओं को प्राप्त करने के लिए विकल्प का उपयोग करता है , और फिर उन निर्देशिकाओं में vimscript फाइलों की सूची निकालता है जिनके एक्सटेंशन हटा दिए गए हैं। यह ऐसा करने का सबसे सुरक्षित तरीका नहीं हो सकता है, इसलिए सुधारों का स्वागत है:

function! GetFiletypes()
    " Get a list of all the runtime directories by taking the value of that
    " option and splitting it using a comma as the separator.
    let rtps = split(&runtimepath, ",")
    " This will be the list of filetypes that the function returns
    let filetypes = []

    " Loop through each individual item in the list of runtime paths
    for rtp in rtps
        let syntax_dir = rtp . "/syntax"
        " Check to see if there is a syntax directory in this runtimepath.
        if (isdirectory(syntax_dir))
            " Loop through each vimscript file in the syntax directory
            for syntax_file in split(glob(syntax_dir . "/*.vim"), "\n")
                " Add this file to the filetypes list with its everything
                " except its name removed.
                call add(filetypes, fnamemodify(syntax_file, ":t:r"))
            endfor
        endif
    endfor

    " This removes any duplicates and returns the resulting list.
    " NOTE: This might not be the best way to do this, suggestions are welcome.
    return uniq(sort(filetypes))
endfunction

फिर आप इस फ़ंक्शन का उपयोग उस तरीके से कर सकते हैं जो आप चाहते हैं, जैसे कि सूची के सभी मानों को प्रिंट करना। आप ऐसा कर सकते हैं:

for f in GetFiletypes() | echo f | endfor

ध्यान दें कि यह संभवतः थोड़ा सा कॉम्पैक्ट किया जा सकता है, यह पठनीयता के लिए ऐसा ही है। मैं यहां उपयोग किए गए प्रत्येक फ़ंक्शन और कमांड की व्याख्या नहीं करूंगा, लेकिन यहां उनके लिए सभी सहायता पृष्ठ हैं:

  • :help 'runtimepath'
  • :help :let
  • :help :let-&
  • :help split()
  • :help :for
  • :help expr-.
  • :help :if
  • :help isdirectory()
  • :help glob()
  • :help fnamemodify()
  • :help add()
  • :help uniq()
  • :help sort()

1
जब मैं टाइप करता हूं set filetype<space><c d>, तो यह मुझे एक सूची दिखाता है, लेकिन HTML सूची में नहीं है। जावा सूची में नहीं है। मैं filetypes के अर्थ में filetype नाम कैसे दिखाता हूँ जो वाक्य रचना प्रारूपण विन्यास के अनुरूप है?
जॉन मेयर

6
@ जॉनमेयर: मैंने वही गलती की। कमांड वास्तव में :setfiletype"सेट" और "फाइलटाइप" के बीच विशिष्ट स्थान के बिना है। आप के साथ :help :setfiletypeऔर अधिक जानकारी पा सकते हैं :help ftdetect
sanscore

मैंने यह कोशिश की है, और यह काम करता है! btw, मैं :setfiletype ht<Ctrl+D>ht से शुरू होने वाले फिलाटाइप को सूचीबद्ध करने के लिए उपयोग कर सकता हूं , जो अवांछित परिणामों को फ़िल्टर करता है। :)
पिमजेक

18

यदि आपका vim का संस्करण हाल ही में पर्याप्त है (v7.4.2011 +), तो आप उस फ़ंक्शन के साथ ज्ञात फ़िलिपीसेस के लिए पूछ सकते हैं जिसका उपयोग हम अब मैनुअल ऑटोकोम्प्लीशन को परिभाषित करने में मदद करने के लिए कर सकते हैं: getcompletion()

:echo getcompletion('', 'filetype')

यदि आप सूची को फ़िलिपीज़ से प्रतिबंधित करना चाहते हैं 'c', तो आप कॉल करेंगे

:echo getcompletion('c', 'filetype')

और इसी तरह।

नोट: उन समाधानों के विपरीत जो फ़ाइल नामों और निर्देशिका नामों को पार्स करते हैं $VIMRUNTIME/{syntax,filetype}/, यह समाधान भी विश्लेषण 'runtimepath'करता है। जहां तक ​​मैं समझता हूं, यह न तो नए set ft=foobarफाइलपेट्स को मक्खी के साथ परिभाषित / पंजीकृत करता है , न ही ऑटोकेमैंड्स के बाद।


3

आप निम्नलिखित 2 कमांड चलाकर टर्मिनल में सभी फ़ाइल प्रकारों को भी प्रिंट कर सकते हैं:

1।

cd $(vim -e -T dumb --cmd 'exe "set t_cm=\<C-M>"|echo $VIMRUNTIME|quit' | tr -d '\015')

2।

cat <(ls -1 ftplugin/*.vim) <(ls -1 syntax/*.vim) | tr '\n' '\0' | xargs -0 -n 1 basename | sort | uniq | cut -f 1 -d '.'

पहला कमांड केवल आपके vim रनटाइम पथ पर जाता है (मेरे लिए यह / usr / share / vim / vim80 था )।

दूसरी कमांड उन दो फ़ोल्डरों में सभी फ़ाइल प्रकार के नामों को सूचीबद्ध करती है जहां विम फ़ाइल प्रकार की परिभाषाएँ संग्रहीत करते हैं।

अपडेट करें

मुरु द्वारा दो आदेशों में सुझाए गए सुधार:

1।

cd $(vim -Nesc '!echo $VIMRUNTIME' -c qa)

2।

find syntax ftplugin -iname '*.vim' -exec basename -s .vim {} + | sort -u

3
यह वायाए भी एक पाइपलाइन को जटिल करता है। trकेवल अगली कमांड को वापस लेने के लिए, इसे नई कमांड में बदलने के लिए उपयोग करने के लिए न्यूलाइन्स को कन्वर्ट करने के लिए, जब साधारण कमांड ग्रुपिंग करेंगे। मैं कुछ सुझाव देना चाहूँगा:find syntax ftplugin -iname '*.vim' -exec basename -s .vim {} + | sort -u
muru

अच्छा, रास्ता अधिक रसीला। टर्मिनल से VIMRUNTIME मान खोजने के लिए कोई बेहतर उपाय?
समीर अलजमोविक

1
vim -Nesc '!echo $VIMRUNTIME' -c qa, मुझे लगता है।
मुरु

ओह। वह दूसरी आज्ञा भयावह है। माफ़ करना। मैं अच्छा नहीं हो रहा हूँ। ;) मज़े के लिए, यहाँ मौर के सुझाव का एक बैश विकल्प है जो सिर्फ एक बाहरी आदेश का उपयोग करता है (यह printfएक बिलिन है) f=({ftplugin,syntax}/*.vim) && f=(${f[@]##*/}) && printf "%s\n" "${f[@]%%.*}" | sort -u। चित्रलिपि की व्याख्या के लिए बैश मैन पेज में "पैरामीटर विस्तार" देखें।
बी लेयर

यह आपको psuedo filetype प्लगइन्स देगा bash, जो कि 'वास्तविक फिलामेंट प्लग इन नहीं है ... और filetype "sh" का प्रभाव प्राप्त करता है
18
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.