在前面的一系列文章中,我們介紹了使用
:noremap
進行鍵盤映射,使用
set
來設定選項和
vim
的變量。并且已經在配置檔案中對他們進行了相關配置。
在介紹設定那一篇文章中我們提到了,
lua
提供的函數有全局設定、視窗設定和緩沖區設定。當初有小夥伴在評論區問到相關問題,現在我們就來詳細的解釋這些之前被擱置的内容。
本地緩沖區設定與本地視窗設定
我們先以一個例子來說明
我們先注釋掉配置檔案中顯示行号的設定,然後随機打開一個檔案例如我打開
nvim-config/init.lua
。在這個緩沖區中,我們使用
:set number
來顯示行号。這個時候不管如何打開新的檔案,我們發現新打開的檔案都會顯示行号,這沒什麼新鮮的。
接下來我們來點不一樣的。如果我不希望新打開的檔案顯示行号,但是又希望原來的檔案能夠顯示行号該怎麼辦呢?
要實作這個功能,我們可以使用本地緩沖區設定。使用
set
來設定全局選項,但是使用
setlocal
可以設定目前被打開緩沖區的選項。例如這裡要實作這個功能,我們隻需要在老檔案中使用
setlocal number
。再打開新檔案就會發現它隻在原來的緩沖區中顯示了行号。
我們可以在配置檔案中使用
setlocal
來針對不同緩沖區進行不同的設定。我們之前介紹緩沖區的時候說過,緩沖區是被随機進行編号的。每次打開或者關閉不同的檔案會導緻緩沖區變化發生變化,這就導緻了我們沒辦法通過編号精準的為每個緩沖區設定我們想要的效果(不過這個需求也基本很少遇到就是了,後續将會學習新的技術來實作這一需求)
在
vimscript
中,統一使用
setlocal
來設定本地選項。但是在
lua
中,對視窗值和緩沖區值進行了區分。并且定義了
vim.api.nvim_buf_set_option
來設定緩沖區值,定義
vim.api.nvim_win_set_option
來設定視窗值。
例如我們上面示範了
number
就是一個視窗值,我們在配置檔案中加上一句
vim.api.nvim_win_set_option(0, 'number', true)
,将0号視窗設定為顯示行号
本地leader 鍵
既然選項分本地和全局兩類,那麼其他設定也基本遵守本地和全局設定。本地
leader
可以使用
localleader
來設定本地快捷鍵,例如
:let localleader = " "
。在
neovim
中使用
vim.g.maplocalleader
來設定本地
leader
鍵
作為普通使用者來說,我僅僅是進行配置,讓
vim
更好用,我更喜歡所有的
leader
都一樣。是以我平時很少使用,但是不能排除有的插件使用
localleader
作為快捷鍵,這個時候我推薦将
leader
和
localleader
設定成同一個鍵。
本地快捷鍵與全局快捷鍵
我們同樣可以定義本地緩沖的快捷鍵,使用
:nnoremap <buffer> <leader>x dd
來定義隻在目前緩沖區中将
<leader>x
定義為删除一行
這個有前面的基礎應該很好了解,在結束本節之前,我們來看點不一樣的
我們打開一個檔案在指令行中輸入
:nnoremap <buffer> Q x
:nnoremap Q dd
然後再執行 Q 發現它隻删除了一個字元,沒有執行 dd指令。這是因為定義的本地行為把全局行為給覆寫掉了。我們可以了解為局部變量會覆寫全局變量。
但是我們切換到新的檔案發現它執行的是 dd操作,以程式設計語言作為類比的話,此時已經跳出了局部設定的生命周期了。