Liệt kê các kiểu tệp đã biết


54

Làm cách nào tôi có thể nhận được danh sách tên của các loại tệp mà vim hiện đang biết?

Tôi muốn có thể làm điều này để khi vim không tự động phát hiện kiểu tệp, tôi có thể thử một số kiểu tệp vim biết về điều đó có thể tương tự và xem liệu chúng có cung cấp cú pháp tô sáng hợp lý không.

Tôi biết rằng các tệp vimscript xử lý các kiểu tệp được đặt trong ftpluginthư mục theo quy ước nhưng chúng không cần phải (tôi không chắc, nhưng tôi không nghĩ các tệp vimscript trong ftpluginthư mục là đặc biệt) vì vậy tôi chỉ muốn hỏi vim những kiểu tệp mà nó biết, bất kể nó học về chúng như thế nào.


1
Bạn có thể xem danh sách khi bạn cố gắng tự động hoàn thành :setfiletype (nghĩa là Tabsau một khoảng trắng). Không chắc chắn nếu đó là danh sách đầy đủ, hoặc làm thế nào để ghi nó vào một số bộ đệm / tập tin.
VanLaser

1
Sử dụng <c-d>thay vì <tab>để liệt kê hoàn thành.
Peter Rincker

Nhập một chữ cái hoặc một vài để lọc danh sách và hiển thị các mục được bắt đầu bằng các chữ cái này.
ShamÓA

Câu trả lời:


63

Giải pháp đơn giản

Nhập :setfiletype (với một khoảng trắng sau đó) , sau đó nhấn Ctrl-d.

Xem :help cmdline-completionđể biết thêm về tự động hoàn thành trong dòng lệnh của vim.

Giải pháp phức tạp

Giải pháp này sử dụng 'runtimepath'tùy chọn để nhận tất cả các thư mục cú pháp có sẵn, sau đó tìm nạp danh sách các tệp vimscript trong các thư mục đó với phần mở rộng của chúng bị xóa. Đây có thể không phải là cách an toàn nhất để làm điều đó, vì vậy những cải tiến được hoan nghênh:

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

Sau đó, bạn có thể sử dụng chức năng này theo bất kỳ cách nào bạn muốn, chẳng hạn như in tất cả các giá trị trong danh sách. Bạn có thể thực hiện điều đó như vậy:

for f in GetFiletypes() | echo f | endfor

Lưu ý rằng điều này có thể có thể được nén khá nhiều, nó giống như thế này để dễ đọc. Tôi sẽ không giải thích mọi chức năng và lệnh được sử dụng ở đây, nhưng đây là tất cả các trang trợ giúp cho chúng:

  • :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
Khi tôi gõ set filetype<space><c d>, nó hiển thị cho tôi một danh sách, nhưng html không có trong danh sách. Java không có trong danh sách. Làm cách nào để hiển thị tên filetype theo nghĩa của kiểu tệp tương ứng với cấu hình định dạng cú pháp?
John Meyer

6
@JohnMeyer: Tôi cũng mắc lỗi tương tự. Lệnh thực sự :setfiletypekhông có khoảng trắng điển hình giữa "set" và "filetype". Bạn có thể tìm thêm thông tin với :help :setfiletype:help ftdetect.
sanscore

Tôi đã thử điều này, và nó hoạt động! btw, tôi có thể sử dụng :setfiletype ht<Ctrl+D>để liệt kê filetype bắt đầu bằng ht, giúp lọc các kết quả không mong muốn. :)
pimgeek

18

Nếu phiên bản vim của bạn đủ gần đây (v7.4.2011 +), bạn có thể yêu cầu các kiểu tệp đã biết với chức năng hiện có thể sử dụng để giúp xác định tự động hoàn thành thủ công: getcompletion()

:echo getcompletion('', 'filetype')

Nếu bạn muốn giới hạn danh sách ở dạng tệp bắt đầu bằng một 'c', bạn sẽ gọi

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

vân vân

Lưu ý: không giống như các giải pháp phân tích tên tệp và tên thư mục $VIMRUNTIME/{syntax,filetype}/, giải pháp này 'runtimepath'cũng phân tích . Theo như tôi hiểu, nó không thấy các kiểu tệp mới được xác định / đăng ký khi đang di chuyển set ft=foobar, cũng không phải sau chế độ tự động.


3

Bạn cũng có thể in tất cả các loại tệp trong thiết bị đầu cuối bằng cách chạy 2 lệnh sau:

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 '.'

Lệnh đầu tiên chỉ đơn giản là điều hướng đến đường dẫn thời gian chạy vim của bạn (đối với tôi đó là / usr / share / vim / vim80 ).

Lệnh thứ hai liệt kê tất cả các tên loại tệp trong hai thư mục nơi vim lưu trữ các định nghĩa loại tệp.

Cập nhật

Đề xuất cải tiến cho hai lệnh của muru cung cấp:

1.

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

2.

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

3
Đó là waaaay quá phức tạp một đường ống. Sử dụng trđể chuyển đổi dòng mới thành null chỉ để chuyển đổi nó trở lại lệnh tiếp theo, thay thế quá trình khi nhóm lệnh đơn giản sẽ làm. Tôi muốn đề xuất một cái gì đó như:find syntax ftplugin -iname '*.vim' -exec basename -s .vim {} + | sort -u
muru

Đẹp, cách cô đọng hơn. Còn giải pháp nào tốt hơn để tìm giá trị VIMRUNTIME từ thiết bị đầu cuối không?
Samir Alajmovic

1
vim -Nesc '!echo $VIMRUNTIME' -c qa, Tôi nghĩ.
muru

Rất tiếc. Lệnh thứ hai đó thật đáng sợ. Lấy làm tiếc. Tôi không được tốt đẹp. ;) Để giải trí, đây là một thay thế Bash cho đề xuất của muru chỉ sử dụng một lệnh bên ngoài (giả sử printflà một nội dung) : f=({ftplugin,syntax}/*.vim) && f=(${f[@]##*/}) && printf "%s\n" "${f[@]%%.*}" | sort -u. Xem "Mở rộng tham số" trong trang Bash của người đàn ông để biết giải thích về chữ tượng hình.
Lớp B

Điều này sẽ cung cấp cho bạn các plugin filetype psuedo bash, đó là 'không phải là một plugin filetype thực sự ... và có được hiệu ứng của filetype "sh"'
jeremysprofile
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.