vim 下側有一個狀态欄,會顯示當前打開的文件等一系列内容,隻是我們很少去關注它。而且原生的vim也支持對狀态欄進行自定義。這篇文章主要介紹如何自定義狀态欄
設置狀态欄我們可以采用 set statusline 來設置狀态欄。例如我們輸入 :set statusline=%f\ -\ FileType=%y。之後我們可以發現它變成了如下這個樣子
statusline 的值是一個格式字符串。上述命令我們使用了 %f 表示當前文件名稱 。
從上面的命令中明顯感覺到隻輸出兩個内容就已經開始顯的比較繁瑣了,如果顯示的内容多了是不是就更加難以閱讀和書寫了呢?好在我們還能使用 lua來做設置。上述内容可以翻譯為如下的 lua代碼
vim.o.statusline = "%f - FileType=%y"
我們保存之後發現下方的狀态欄顯示内容已經發生變化。
控制邊距和寬度如果你寫過 c 或者其他編程語言中的輸出語句,應該很容易理解如何控制輸出的格式,一般使用類似 `%4l`` 這樣的語句來控制該項占4個字符寬度。這裡的設置也是類似的
vim.o.statusline = " f - FileType=%y"
它表示 文件名這項應該站20個字符寬度。最終效果如下所示
默認它的邊距是添加在左邊的,這樣會讓左側空出一大半,會顯得比較難看,我們可以使用 -來使空白站位符顯示在右側
vim.o.statusline = "%-20f - FileType=%y"
當然我們也可以控制一下輸出字符的最大長度,例如使用如下代碼
vim.o.statusline = "%0.10F - FileType=%y"
使用 %F可以顯示文件的全路徑。這裡我們發現全路徑大于10個字符,但是它隻是顯示了10個字符。使用這個方法可以防止某些超長的字符串破壞了我之前的布局
分割我們再來介紹一個符号 %=,它表示将 %= 後面的内容全局居右對齊,例如
vim.o.statusline = "%f %= FileType=%y"
将得到如下顯示内容
更多的關于各個标識符代表的含義可以使用 :help statusline 來查看。
練習最後我們來做一個小練習,我們希望将狀态欄顯示為如下内容
mode | filename[status] | currentline:totalline |encoding|filetype|
其中 mode 代表當前所處模式、filename 代表文件名稱、status 代表文件狀态(是否可讀寫、是否保存)、currentline 代表光标當前所在行數、totalline 代表文件一共多少行、encoding 代表文件編碼、filetype 代表文件類型
我們通過查閱文檔可以知道:
至于當前模式和文件類型我們先不管它,根據這些内容我們可以寫下如下代碼
vim.o.statusline = "mode|%f%m|%l:%L%=encoding|%y"
[ ] 表示對緩沖區所做的修改還沒有寫入到磁盤中。執行:w寫入之後發現它直接消失了
我們可以通過 vim.g.encoding 來獲取當前文件的編碼方式,因此我們改一下當前代碼
vim.o.statusline = "mode|%f%m|%l:%L%=" .. vim.g.encoding .. "|%y"
我們發現此時的狀态已經改過來了。
最麻煩的是模式,vim 中提供了一個可以獲取當前模式的函數 mode 。但是在 lua 接口中我沒有找到對應的函數。因此我們仍然采用在 lua 中調用 vimscript 的方式。這次我們使用函數 vim.api.nvim_eval()。它可以執行 vim 命令并将返回執行的結果。
我們可以定義一個函數返回當前所處模式
function get_mode()
local mode = vim.api.nvim_eval([[mode]])
if mode == "n" then
return "Normal"
elseif mode == "v" then
return "Visual"
elseif mode == "i" then
return "Insert"
else
return ""
end
end
這裡我們為了演示隻返回了 3中模式的字符串,更多模式可以查看vim的幫助文檔
我們希望模式改變時對應的就修改 mode 對應的字段,此時我們應該采用自動命令。查看vim的用戶手冊我們發現,針對模式變化這一事件有一個叫做 ModeChanged 的事件類型,因此我們可以寫下一些代碼
local cmd_statusline = vim.api.nvim_create_autogroup("SET_STATUS_LINE", {clear = true})
vim.api.nvim_create_autocmd({"ModeChanged"}, {
pattern = "*",
group = cmd_statusline,
callback = function()
local win_id = vim.api.nvim_eval([[win_getid()]]) --獲取當前window id
vim.wo[win_id].statusline = get_mode() .. "|%f%m|%l:%L%=" .. vim.g.encoding .. "|%y" -- 使用 setlocal 針對窗口設置本地化配置
end
)
後面我們可以對字符串進行一些格式控制,這裡就不展開了。我們将這些代碼寫到 init.lua中,保存後發現它大緻效果如下
我們發現就是簡單的設置狀态欄的工作也是比較麻煩的。而且有時候我們又想它好看,帶點顔色什麼的。這就更麻煩了。好在有大量的插件可以幫助我們來完成這一工作
lualine 插件lualine 是一個用 lua 語言開發的 neovim 的狀态欄美化插件,可以使用如下代碼進行安裝
use {
'nvim-lualine/lualine.nvim',
requires = { 'kyazdani42/nvim-web-devicons', opt = true }
}
我們創建 lualine 的配置文件,加入加載 lualine 的代碼
require("lualine").setup()
然後在主配置文件中加載該文件
require("plugin-config/lualine")
lualine 官方提供了3種主題的配色,我們可以直接在代碼中引用,例如我這裡引用 evil_lualine 這個配置,然後将 theme改為之前我們安裝的 tokyonight主題
theme = "tokyonight"
到這裡我們已經完成了 狀态欄的美化,其實主要靠插件,本篇一大部分寫了如何使用原生的statusline 設置主要是自己手工設置比較有意思,而且也可以湊文章字數,其實你不知道statusline 這個也無所謂,很多插件都都對原生的方式進行了大量封裝,而且能進行高度的自定義。完全可以滿足你各種奇怪的口味。
當然狀态欄配置并不隻有這一種插件,如果你知道有哪些狀态欄的插件也歡迎在評論區留言給出
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!