Usr_43

Nvim 的 :help 頁面,從 原始碼 使用 tree-sitter-vimdoc 解析器 產生


VIM 使用者手冊 - 作者:Bram Moolenaar
使用檔案類型
當您編輯特定類型的檔案時,例如 C 程式或 shell 腳本,您通常會使用相同的選項設定和對應。您很快就會厭倦每次都手動設定這些。本章說明如何自動執行此操作。
43.1 檔案類型外掛程式 43.2 新增檔案類型
下一章:usr_44.txt 您自己的語法高亮 前一章:usr_42.txt 新增選單 目錄:usr_toc.txt

檔案類型外掛程式 filetype-plugin

如何開始使用檔案類型外掛程式已經在這裡討論過了:add-filetype-plugin。但您可能對預設設定不滿意,因為它們已被保持在最小程度。假設對於 C 檔案,您想要將 'softtabstop' 選項設定為 4,並定義一個對應來插入一個三行註解。您只需兩個步驟即可完成此操作
您的運行時目錄
1. 建立您自己的運行時目錄。在 Unix 上,這通常是「~/.config/nvim」。在這個目錄中建立「ftplugin」目錄
mkdir -p ~/.config/nvim/ftplugin
當您不在 Unix 上時,請檢查 'runtimepath' 選項的值,以查看 Vim 將在哪裡尋找「ftplugin」目錄
set runtimepath?
您通常會使用第一個目錄名稱(在第一個逗號之前)。如果您不喜歡預設值,您可能想要在您的 init.vim 檔案中在 'runtimepath' 選項前面加上目錄名稱。
2. 建立檔案「~/.config/nvim/ftplugin/c.vim」,內容如下
setlocal softtabstop=4
noremap <buffer> <LocalLeader>c o/**************<CR><CR>/<Esc>
let b:undo_ftplugin = "setl softtabstop< | unmap <buffer> <LocalLeader>c"
嘗試編輯 C 檔案。您應該會注意到 'softtabstop' 選項已設定為 4。但是當您編輯另一個檔案時,它會重設為預設值 0。那是因為使用了「:setlocal」命令。這只會將 'softtabstop' 選項設定為緩衝區的本地設定。一旦您編輯另一個緩衝區,它將會設定為該緩衝區的值。對於新的緩衝區,它將會取得預設值或上次「:set」命令的值。
同樣地,當編輯另一個緩衝區時,「\c」的對應將會消失。「:map <buffer>」命令會建立一個本地於目前緩衝區的對應。這適用於任何對應命令:「:map!」、「:vmap」等。<LocalLeader> 在對應中會被替換為「maplocalleader」變數的值。
設定 b:undo_ftplugin 的行是為了當檔案類型設定為另一個值時。在這種情況下,您會希望取消您的偏好設定。b:undo_ftplugin 變數會被當作命令執行。請注意字串內具有特殊含義的字元,例如反斜線。
您可以在這個目錄中找到檔案類型外掛程式的範例
$VIMRUNTIME/ftplugin/
關於編寫檔案類型外掛程式的更多詳細資訊可以在這裡找到:write-plugin

43.2 新增檔案類型

如果您正在使用 Vim 無法辨識的檔案類型,以下是如何讓它被辨識的方法。您需要自己的運行時目錄。請參閱上面的 您的運行時目錄
建立一個「filetype.vim」檔案,其中包含您檔案類型的自動命令。(自動命令在第 40.3 節中說明。)範例
augroup filetypedetect
au BufNewFile,BufRead *.xyz        setf xyz
augroup END
這會將所有以「.xyz」結尾的檔案辨識為「xyz」檔案類型。「:augroup」命令將此自動命令放入「filetypedetect」群組。這允許在執行「:filetype off」時移除所有用於檔案類型偵測的自動命令。「setf」命令會將 'filetype' 選項設定為其引數,除非它已經被設定。這將確保 'filetype' 不會被設定兩次。
您可以使用許多不同的模式來比對您的檔案名稱。也可以包含目錄名稱。請參閱 autocmd-pattern。例如,「/usr/share/scripts/」下的檔案都是「ruby」檔案,但沒有預期的副檔名。將此新增到上面的範例
augroup filetypedetect
au BufNewFile,BufRead *.xyz                        setf xyz
au BufNewFile,BufRead /usr/share/scripts/*        setf ruby
augroup END
但是,如果您現在編輯檔案 /usr/share/scripts/README.txt,這不是 ruby 檔案。以「*」結尾的模式的危險在於它很快會比對到太多檔案。為了避免這個問題,請將 filetype.vim 檔案放在另一個目錄中,該目錄位於 'runtimepath' 的末尾。例如,對於 Unix,您可以使用「~/.config/nvim/after/filetype.vim」。您現在將文字檔案的偵測放在 ~/.config/nvim/filetype.vim 中
augroup filetypedetect
au BufNewFile,BufRead *.txt                        setf text
augroup END
該檔案首先在 'runtimepath' 中找到。然後在 ~/.config/nvim/after/filetype.vim 中使用它,該檔案最後找到
augroup filetypedetect
au BufNewFile,BufRead /usr/share/scripts/*        setf ruby
augroup END
現在將會發生的事情是,Vim 會在 'runtimepath' 中的每個目錄中搜尋「filetype.vim」檔案。首先找到 ~/.config/nvim/filetype.vim。在那裡定義了捕捉 *.txt 檔案的自動命令。然後 Vim 在 $VIMRUNTIME 中找到 filetype.vim 檔案,它位於 'runtimepath' 的中間。最後找到 ~/.config/nvim/after/filetype.vim,並新增了偵測 /usr/share/scripts 中的 ruby 檔案的自動命令。當您現在編輯 /usr/share/scripts/README.txt 時,會依照定義的順序檢查自動命令。*.txt 模式符合,因此執行「setf text」以將檔案類型設定為「text」。ruby 的模式也符合,並且執行「setf ruby」。但是由於 'filetype' 已經設定為「text」,因此這裡沒有任何作用。當您編輯檔案 /usr/share/scripts/foobar 時,會檢查相同的自動命令。只有 ruby 的自動命令符合,「setf ruby」將 'filetype' 設定為 ruby。

依內容辨識

如果您的檔案無法依其檔案名稱辨識,您或許可以依其內容辨識。例如,許多腳本檔案都以如下行開頭
#!/bin/xyz
要辨識這個腳本,請在您的運行時目錄中建立一個「scripts.vim」檔案(與 filetype.vim 相同的位置)。它可能如下所示
if did_filetype()
  finish
endif
if getline(1) =~ '^#!.*[/\\]xyz\>'
  setf xyz
endif
使用 did_filetype() 的第一個檢查是為了避免您檢查檔案類型已由檔案名稱偵測到的檔案內容。這可以避免在「setf」命令不會執行任何操作時浪費時間檢查檔案。scripts.vim 檔案是由預設 filetype.vim 檔案中的自動命令所引用。因此,檢查的順序是
1. 'runtimepath' 中在 $VIMRUNTIME 之前的 filetype.vim 檔案 2. $VIMRUNTIME/filetype.vim 的第一部分 3. 'runtimepath' 中的所有 scripts.vim 檔案 4. $VIMRUNTIME/filetype.vim 的其餘部分 5. 'runtimepath' 中在 $VIMRUNTIME 之後的 filetype.vim 檔案
如果這對您來說還不夠,請新增一個符合所有檔案的自動命令,並引用一個腳本或執行一個函式來檢查檔案的內容。
下一章:usr_44.txt 您自己的語法高亮
版權:請參閱 manual-copyright vim:tw=78:ts=8:noet:ft=help:norl
主要
命令索引
快速參考