รายการประเภทไฟล์ที่รู้จัก


54

ฉันจะได้รับรายชื่อของประเภทไฟล์ที่กลุ่มในปัจจุบันรู้ได้อย่างไร

ฉันต้องการที่จะสามารถทำเช่นนี้เพื่อให้เมื่อ vim ไม่ได้ตรวจสอบชนิดของไฟล์โดยอัตโนมัติฉันสามารถลองประเภทของไฟล์ที่ vim รู้เกี่ยวกับสิ่งนั้นอาจคล้ายกันและดูว่าพวกเขามีการเน้นไวยากรณ์ที่เหมาะสมหรือไม่

ฉันรู้ว่าไฟล์ vimscript ที่เกี่ยวข้องกับ filetypes ถูกวางไว้ในftpluginไดเรกทอรีโดยการประชุม แต่พวกเขาไม่จำเป็นต้อง (ฉันไม่แน่ใจ แต่ฉันไม่คิดว่าไฟล์ vimscript ในftpluginไดเรกทอรีนั้นพิเศษ) ดังนั้นฉันต้องการเพียงแค่ ถามเป็นกลุ่มว่าไฟล์ชนิดใดที่รู้เกี่ยวกับว่ามันเรียนรู้เกี่ยวกับพวกเขาอย่างไร


1
คุณสามารถดูรายการเมื่อคุณพยายามเติมข้อความอัตโนมัติใน:setfiletype (เช่นด้วยTabหลังจากช่องว่าง) ไม่แน่ใจว่าเป็นรายการที่สมบูรณ์หรือวิธีจับภาพไปยังบัฟเฟอร์ / ไฟล์
VanLaser

1
ใช้<c-d>แทน<tab>เพื่อแสดงรายการความสำเร็จ
Peter Rincker

พิมพ์ตัวอักษรหรือสองสามตัวเพื่อกรองรายการและแสดงรายการที่เริ่มต้นด้วยตัวอักษรเหล่านี้
Shamaoke

คำตอบ:


63

ทางออกที่ง่าย

พิมพ์:setfiletype (มีพื้นที่หลังจากนั้น)Ctrl-dจากนั้นกดปุ่ม

ดู:help cmdline-completionข้อมูลเพิ่มเติมเกี่ยวกับการเติมข้อความอัตโนมัติในบรรทัดคำสั่งของ vim

โซลูชั่นที่ซับซ้อน

วิธีการแก้ปัญหานี้ใช้'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 ไม่อยู่ในรายการ Java ไม่อยู่ในรายการ ฉันจะแสดงชื่อประเภทไฟล์ในแง่ของประเภทไฟล์ที่สอดคล้องกับการกำหนดค่าการจัดรูปแบบไวยากรณ์ได้อย่างไร
John Meyer

6
@ JohnMeyer: ฉันทำผิดพลาดเหมือนกัน คำสั่งนั้น:setfiletypeไม่มีช่องว่างปกติระหว่าง "set" และ "filetype" คุณสามารถค้นหาข้อมูลเพิ่มเติมด้วยและ:help :setfiletype :help ftdetect
sanscore

ฉันเคยลองแล้วมันใช้งานได้! btw ฉันสามารถใช้:setfiletype ht<Ctrl+D>แสดงรายการประเภทไฟล์ที่ขึ้นต้นด้วย ht ซึ่งกรองผลลัพธ์ที่ไม่ต้องการ :)
pimgeek

18

หากเวอร์ชัน vim ของคุณเร็วพอ (v7.4.2011 +) คุณสามารถขอประเภทไฟล์ที่ทราบพร้อมฟังก์ชันที่เราสามารถใช้เพื่อช่วยกำหนดการเติมข้อความอัตโนมัติด้วยตนเอง: getcompletion()

:echo getcompletion('', 'filetype')

หากคุณต้องการ จำกัด รายการเป็นประเภทไฟล์ที่ขึ้นต้นด้วย a 'c'คุณจะต้องโทร

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

และอื่น ๆ

หมายเหตุ: ไม่เหมือนกับโซลูชันที่วิเคราะห์ชื่อไฟล์และชื่อไดเร็กทอรีใน$VIMRUNTIME/{syntax,filetype}/โซลูชันนี้จะวิเคราะห์'runtimepath'เช่นกัน เท่าที่ฉันเข้าใจมันจะไม่เห็นประเภทไฟล์ใหม่ที่กำหนด / ลงทะเบียนทันทีพร้อมกับset ft=foobarหรือหลังจาก autocommands


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 runtime path ของคุณ (สำหรับฉันมันคือ/ usr / share / vim / vim80 )

คำสั่งที่สองแสดงรายการชื่อไฟล์ทั้งหมดในสองโฟลเดอร์ที่ vim เก็บนิยามชนิดไฟล์

ปรับปรุง

การปรับปรุงที่แนะนำสำหรับสองคำสั่งโดย muru ซึ่งเสนอ:

1

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

2

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

3
นั่นคือ waaaay ซับซ้อนไปป์ไลน์ การใช้trเพื่อแปลงบรรทัดใหม่เป็นโมฆะเท่านั้นเพื่อแปลงกลับคำสั่งถัดไปมากการทดแทนกระบวนการเมื่อการจัดกลุ่มคำสั่งง่าย ๆ จะทำ ฉันขอแนะนำบางอย่างเช่น:find syntax ftplugin -iname '*.vim' -exec basename -s .vim {} + | sort -u
muru

ดีรวบรัดมากขึ้น มีวิธีใดที่ดีกว่าสำหรับการค้นหาค่า VIMRUNTIME จากเทอร์มินัลด้วย?
กลั้ว Alajmovic

1
vim -Nesc '!echo $VIMRUNTIME' -c qa, ฉันคิด.
muru

Yikes คำสั่งที่สองนั้นน่ากลัว ขอโทษ ฉันไม่สบาย ;) เพื่อความสนุกสนานที่นี่เป็นทางเลือกที่ทุบตีข้อเสนอแนะของ Muru ที่ใช้เพียงหนึ่งคำสั่งภายนอก (สมมติว่าprintfเป็น builtin f=({ftplugin,syntax}/*.vim) && f=(${f[@]##*/}) && printf "%s\n" "${f[@]%%.*}" | sort -ua): โปรดดู "การขยายพารามิเตอร์" ในหน้า Bash man สำหรับคำอธิบายเกี่ยวกับอักษรอียิปต์โบราณ
B Layer

สิ่งนี้จะให้ปลั๊กอินชนิดไฟล์ psuedo bashซึ่งเป็น 'ไม่ใช่ปลั๊กอินชนิดไฟล์จริง ... และได้รับผลกระทบของ filetype "sh"'
jeremysprofile
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.