Làm thế nào để tôi nói với vim rằng một số phần mở rộng tập tin là đồng nghĩa?


21

Tôi chỉnh sửa mã C ++ trong .cpptệp, trong khi mã mẫu đi vào .tcctệp. Khi tôi mở một tập tin như vậy, không có đánh dấu cú pháp có sẵn. Tôi đã thử set syntax=cpptrong một tpp.vimtệp aa ~/.vim/ftplugin/, nhưng nó không làm gì cả, trong khi trong trình chỉnh sửa, nó hoạt động. Có cách nào để vim coi các phần mở rộng cụ thể là đồng nghĩa với các phần mở rộng khác không?

Câu trả lời:


19

Cách tiếp cận ưa thích là tạo một ~/.vim/filetype.vim, như đã đề cập :help 43.2và giải thích trong Câu hỏi thường gặp Vim 26.8 :

Một cách khác tốt hơn cho cách tiếp cận ở trên là tạo tệp filetype.vim trong thư mục ~ / .vim (hoặc trong một trong các thư mục được chỉ định trong tùy chọn 'runtimepath') và thêm các dòng sau:

" my filetype file
if exists("did_load_filetypes")
    finish
endif
augroup filetypedetect
    au! BufRead,BufNewFile *.x       setfiletype c
augroup END

Chỉnh sửa:

Không did_load_filetypesnên gây ra cho bạn bất kỳ vấn đề; nó sẽ chỉ yêu cầu khởi động lại Vim sau khi nó được thay đổi.

Điều này là cần thiết để tránh tải tệp này nhiều và không cần thiết, và nó được kế thừa từ tệp cơ sở ($ VIMRUNTIME / filetype.vim):

" Vim support file to detect file types
"
" Maintainer:   Bram Moolenaar <Bram@vim.org>
" Last Change:  2014 Jun 12

" Listen very carefully, I will say this only once
if exists("did_load_filetypes")
  finish
endif
let did_load_filetypes = 1

Để biết thêm thông tin kiểm tra :help new-filetype.


Tại sao iftuyên bố? Nếu tôi để nó vào, autocmds sẽ không được thực thi cho tôi.
oarfish

@oarfish ngay cả khi bạn khởi động lại Vim?
mMontu

Ok, điều này thật kỳ lạ. Tôi phải au!báo cáo trong nhóm, cụ thể au! BufRead,BufNewFile *.py setfiletype pythonvà trong dòng dưới đây au! BufRead,BufNewFile *.tpp setfiletype cpp. Nhưng chỉ có cái thứ hai thực sự hoạt động. Chỉnh sửa .pytệp không đặt loại tệp thành python. Tôi không chính xác là một vim-guru nên có lẽ tôi đang thiếu một cái gì đó.
oarfish

@oarfish nếu bạn kiểm tra tệp tôi đã đề cập trong bản chỉnh sửa, bạn sẽ thấy rằng nó đã chứa một dòng với au BufNewFile,BufRead *.py,*.pyw setf python, vì vậy dòng đầu tiên của bạn không liên quan. Vấn đề của bạn có lẽ là ở nơi khác.
mMontu

"Editing .py files does not set the file type to python"- đầu ra của :set fttrường hợp đó là gì? Nếu đó không phải là python, hãy thử làm theo quy trình trong Vim-FAQ 2.5 - Tôi gặp vấn đề "xyz" (một số) với Vim
mMontu

14

Bạn có thể làm (trong toàn cầu của bạn .vimrc):

autocmd BufEnter *.tpp :setlocal filetype=cpp

autocmd BufEnter *.cuf :setlocal filetype=fortranđể coi các tệp CUDA Fortran là Fortran
khaverim

1

Người ta cũng có thể có: au BufRead,BufNewFile *.tpp setlocal filetype=cpptheo cách .vimrcmà khi mở tệp có .tppphần mở rộng, filetype được đặt cho C ++


1
Điều này về cơ bản là giống hệt với câu trả lời của @ edi9999. Bạn có thể giải thích tại sao để sử dụng BufRead,BufNewFilethay vì BufEnter?
oarfish

@oarfish Tôi nghĩ nó không quá quan trọng, nhưng tôi thích BufRead,BufNewFiletrước BufEntervì trong tài liệu ( :help BufEnter) có ghi: "Buf Entry: .... Cũng được thực thi khi bắt đầu chỉnh sửa bộ đệm, sau chế độ tự động BufReadPost." trong đó BufReadPost đồng nghĩa với BufRead . Ngoài ra, tôi không tin :là bắt buộc trước đây setlocalnên tôi cũng bỏ qua điều đó trong câu trả lời của mình. (Tôi có thể đã giải thích điều này hoàn toàn sai, rất vui khi nghe thảo luận thêm)
Tallamjr
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.