天天看點

從零開始比對vim(1)——選項設定

前面我們算是對 ​

​vimscript​

​​ 做了一個入門,并且實作了一個 輸出 ​

​hello world​

​​ 的語句。現在我們繼續進行 ​

​vimscript​

​ 的學習。

set語句

之前在介紹 ​

​vim​

​​ 基礎的時候,我們說要開啟或者關閉某個屬性,并且給出了相關的配置代碼。那個時候已經接觸了 ​

​set​

​​ 語句了。例如我們使用 ​

​set number​

​ 來顯示行号。這裡我們可以知道 set的第一個用法:

set attribute      

其中這個 ​

​attribute​

​ 是一個屬性名稱,用于開啟/關閉屬性。

設定布爾值

一般在程式設計中将開啟或者關閉某個特性的變量設定為 ​

​bool​

​​ 值。在 ​

​vim​

​​ 中也是如此,但是它的特殊性在于它并不是将這個變量設定為 ​

​true​

​​ 或者 ​

​false​

​​ 而是設定為 ​

​name​

​​ 或者 ​

​noname​

​​ 的樣子。舉個例子,設定顯示行号使用 ​

​set number​

​​ 設定不顯示行号使用 ​

​set nonumber​

​ 。

從零開始比對vim(1)——選項設定

另外對于 ​

​bool​

​​ 類型的屬性值還可以使用 ​

​!​

​​ 來對現有值進行取反,使用 ​

​?​

​​ 來檢視目前使用的值。例如,如果目前不顯示行号 ​

​set number!​

​​ 會顯示行号,再次執行則 ​

​:set number!​

​​ 則不會執行。我們可以使用 ​

​set number?​

​ 來檢視目前是否顯示行号

從零開始比對vim(1)——選項設定

下面我們來執行這麼一個例子

set number
set number?
set number!
set number?      

第一個 ​

​set number?​

​​ 應該會傳回 ​

​number​

​​ 而第二個應該會傳回 ​

​nonumber​

設定鍵值對

有些值是屬于 ​

​bool​

​​ 類型,我們隻需要 ​

​set​

​​ 某一選項即可。但是有些屬性并不适合設計成 ​

​bool​

​​ 類型,例如視窗寬度、高度等等。他們更适合做成一個鍵值對的形式。針對這種形式的屬性,我們直接使用 ​

​set key=value​

​​ 的形式。例如 ​

​set columns=80​

​​ 。對于這種類型的屬性仍然可以使用 ​

​?​

​​ 來顯示目前的值。例如 ​

​set columns?​

​ 來顯示目前每行的最大字元長度。

從零開始比對vim(1)——選項設定

當然,與其他程式設計語言類似,我們也可以使用 ​

​set​

​ 語句,一次性給多個屬性進行指派,例如

set number columns=80      

隻是一般程式設計語言多個變量的指派使用 ​

​,​

​​ 作為分割,但是 ​

​vimscript​

​ 中使用 空格。

使用 lua 設定vim屬性

作為一門更加規範的程式設計語言,​

​lua​

​ 提供了多種方式來對這些變量進行指派。目前有如下辦法能對這些屬性進行指派。

使用neovim提供的全局函數進行設定

​neovim​

​ 中提供了一組函數來設定這些屬性。常見的分為三類:

  1. 設定全局屬性

    a.​​

    ​vim.api.nvim_set_option()​

    ​​ :設定值

    b.​​

    ​vim.api.nvim_get_option()​

    ​ : 擷取值
  2. 設定視窗相關屬性

    a.​​

    ​vim.api.nvim_win_set_option()​

    ​​ : 設定值

    b.​​

    ​vim.api.nvim_win_get_option()​

    ​: 擷取值
  3. 設定緩沖區相關屬性

    a.​​

    ​vim.api.nvim_buf_set_option()​

    ​​ :設定值

    b.​​

    ​vim.api.nvim_buf_set_option()​

    ​ : 擷取值

例如我們可以使用 ​

​vim.api.nvim_set_option('number', true)​

​​ 來設定 顯示行号。使用這些函數時需要嚴格區分對應屬性是 ​

​bool​

​​、數字或者字元串類型。在 ​

​vimscript​

​ 中則沒有這麼嚴格的區分。

使用元通路器進行設定

​neovim​

​ 的接口針對上述這些函數進行了一定的封裝,提供了一組元通路器,以便我們能夠像使用普通變量一樣使用這些屬性值。至于什麼是元通路器暫時不用關心,隻需要知道我們可以像使用變量一樣來設定和獲得這些屬性,但是本質上還是在調用上述那些函數。

針對上述函數,我們可以使用如下幾種通路對象:

  1. vim.o: 全局屬性,我們可以利用 options來記憶
  2. vim.bo: 緩沖區屬性,我們可以利用 buffer-option來記憶
  3. vim.wo: 視窗屬性, 我們可以利用 window-option來記憶

例如我們可以使用 ​

​vim.o.number = true​

​​ 或者 ​

​vim.o.columns = 80​

​​ 來設定對應選項。等效于 ​

​vim.api.nvim_set_option("number", true)​

​​ 和 ​

​vim.api.nvim_set_option("columns", 80)​

總結

通過這篇文章,我們讨論了使用 ​

​set​

​​ 來設定一些選項,并且給出了對應的使用 ​

​lua​

​​ 來設定的方法。下面小夥伴們要做的就是讀一下 ​

​vim​

​​ 的使用者手冊,根據自己的喜好嘗試着設定一些其他選項。

例如我喜歡的基本配置如下:

vim.o.syntax = "enable"
vim.o.relativenumber = true
vim.o.number = true
vim.o.wrap = true
vim.o.ruler = true
vim.o.incsearch = true
vim.o.softtabstop = 4
vim.o.shiftwidth = 4
vim.o.expandtab = true      

如果是vim可能需要的配置更多,但是 ​

​neovim​

​ 沒有曆史包袱,預設的已經很好用了

最後,目前教程采取這種 ​

​vimscript​

​​ 穿插着 ​

​lua​

​​ 的方式進行講解,後續配置雖然主要以 ​

​lua​

​​ 為主,但是有時候又離不開 ​

​vimscript​

​​,​

​neovim​

​​并沒有完全開放 ​

​vim​

​​ 的内置功能,有些功能隻能使用 ​

​vimscript​

​ 來實作。