使用 NeoVim 能帶來什麼?和傳統編輯器相比優勢在哪
下面的內容大概很多人不會看了,所以我決定先寫這個部分。看完之後,再做決定要不要配置它,因為這是一件非常漫長卻又享受的過程,同時你需要習慣 hjkl 的橫向移動和大量快捷鍵。
使用 Vim 最大的優勢就是可以捨棄滑鼠,在寫程式碼時不會因為需要用到滑鼠去定位而出現了停頓時間,沒有停頓時間可以更加專注去編碼。
其次就是它非常快,啟動時間在 100ms 之內,記憶體使用非常小,響應速度非常快,不會像某些 IDE 96G 的記憶體都不夠用的。
有了插件的加持你可以很快速的做到以下經常遇到的問題。
- 選區
在 VSC 中選擇一個塊級作用域的程式碼從一處搬到另一處可能需要借助滑鼠的拖動來完成塊級作用域的選區。而在 NeoVim 中使用 Treesitter 的 increase selection 你只需要按幾下 Enter
。
另外 NeoVim + Treesitter 提供了非常多的 textobjects 可以非常方便的選區和刪除修改文本對象。
- 增加 / 修改 / 刪除括號配對
在 VSC 不知道一般都是怎麼操作的,我的話是滑鼠選區配合鍵盤剪貼然後加括號再粘貼。這裡需要花費很多時間。而在 NeoVim 中使用 mini-surround。
- 快速移動
如果 VSC 中在當前視圖中看到一個關鍵字,想把光標移動到那個地方然後輸入,可能需要用到滑鼠。但在 NeoVim 中使用 flash.nvim 的能力的話。比如我想移動到 console.log
然後刪除這行。
- 上下文快速移動
- 模糊匹配
根據路徑和文件內容去模糊匹配內容也是 VSC 做不到的。
前情摘要#
從剛開始接觸 NeoVim(下文簡稱 nvim)已經 3 年了,記得那個時候還是 nvim 0.4.x 半年多過去了還停留在 0.5 的 dev 版本遲遲等不到 0.5 stable 的到來。
那個時候,我還在寫 Vue 2,nvim 上還沒有 telescope.nvim 也沒有 nvim-lsp,雖然已經不是 YouCompleteMe 的時代,但是 nvim 還是沒有性能上很優秀的 lsp,那時候我們都在用 coc.nvim,這是一個由 NodeJS 驅動的 lsp,因為 NodeJS 的運行時和採用了 VSC 一致的接口,可以非常方便的把 VSC 的插件移植到 coc 上,但是由於 coc 的性能堪憂,再加上 coc 生態變化快。最後我還是選擇放棄了使用 nvim 作為主要的編輯器。
過去兩年中,nvim 進入了 lua 時代,這段時間中我也有時關注 nvim 圈子,折騰折騰好玩的插件,但是由於原本的配置基本都是 VimScript 的很難再遷移到 lua,雖然可以兩者混用,但是堪憂的啟動速度和繁多的快捷鍵我早已忘記。
這次又一次看到了 theniceboy 的視頻,自己遷移 nvim 配置到 lua 後的體會,讓我也心裡癢癢,再一次開始配置 nvim 了,而這一次徹底把原本一千多行的配置全部推到重來。
開始#
使用 kitty 作為承載 nvim 的終端模擬器。因為 kitty 支持波浪線,性能足夠快,渲染字符比 iTerm2 更優秀。相比 Alacritty 它的配置更加簡單。而且它的圖標很萌。
nvim 社區一直都是很活躍的,插件生態也很龐大。目前在社區中,有以下的開箱即用的配置:
從 star 數看,AstroNvim 是比較多的,社區維護的預設插件配置也很多,而且主配置和用戶配置分離,後期會比較好維護,也不太有心智負擔。新手推薦可以直接用這個,然後熟悉預設鍵位。
注意的是,以上每個的預設鍵位都是不同的所以一旦習慣一個之後就很難再換一個了。這裡需要選擇最適合你的。
我使用的是 LazyNvim。
git clone https://github.com/LazyVim/starter ~/.config/nvim
rm -rf ~/.config/nvim/.git
安裝完之後就可以使用了,基本的功能都有,lsp telescope treesitter 都配置好了。然後可以去看看這個視頻熟悉一下基本操作:
這裡我就不說了,不想折騰的自然也不會看到這裡,想折騰的自己早去看官方文檔了。我扯這麼多也沒有用,畢竟不是教程貼。
按鍵移動#
作為 vim 黨和 qwerty 鍵盤佈局,hjkl 的移動是不可少的,使用 Hammerspoon map 系統鍵位,把上下左右 map 到 <Caps-hjkl>
,對了我現在是在設置中改鍵 CapsLock 也是 Control 鍵。Control 也是 Control,完全棄用 CapsLock 了。
映射 hjkl 配置如下:
https://gist.github.com/Innei/695460015ba94e8d163d3665d707c6b4
遷移常用配置#
前面說了我之前是有一千多行的配置的,雖然這次從頭開始了,但是有些配置還是需要去配一下的。
目前我配置了以下的 options,其他都使用 LazyNvim 預設值。
local opt = vim.opt
opt.clipboard = "unnamedplus"
opt.wrap = true
opt.clipboard = ""
opt.spelllang = "en,cjk"
-- vim.opt.spell = true
opt.spelloptions = "camel"
opt.scrolloff = 5
opt.indentexpr = ""
opt.foldmethod = "indent"
opt.foldlevel = 99
opt.foldenable = true
opt.foldlevelstart = 99
開啟了程式碼折疊了,禁用了系統剪貼板同步,開啟程式碼超出換行,光標距離底部保持 5 行。就沒別的了。
然後是一些常規 keymap,; 到 : 還是很方便的。y 到 +"y
只有 y 才會複製到系統剪貼板。 到 <C-g>u
這個就很特殊了,可以解決 nvim 在輸入模式下 undo 範圍過大。這樣的話一個空格會作為一個記憶點。同樣的可以把 = 也做一下。
https://github.com/Innei/nvim-config-lua/blob/main/lua/config/keymaps.lua
上面還有一些 keymap 為 kitty 準備的。在使用 kitty 時,可以對 nvim 專門做一些字符映射。比如我在 kitty 中配置了在 nvim 中把 ⌘ P 組合按下時發送 ⌥ P 的字符序列,然後在 nvim 做 <M-p>
的 keymap 到 :Telescope fd
就可以做到 VSC 的 ⌘ P 一樣了。
其他的我還做了 ⌘, S, ⌘, D, ⌘ C, ⌘, X 等等。
https://github.com/Innei/dotfiles/blob/master/tag-base/config/kitty/keymap.py
(此靈感來自 sxyazi)
插件分享#
插件是 nvim 作為主力編輯器的第一生產力。LazyNvim 自帶的我就不推薦了,大家都用,預設就好。
better-escape.nvim#
可以消除 jk 之後的字符等待。可以用,也不是很必要。
Map keys without delay when typing
fedepujol/move.nvim#
可以對選區做一些塊級移動。
LunarVim/bigfile.nvim#
可以對大文件提速。但是我還是建議使用 VSC 去打開大文件,目前用下來只有 VSC 對大文件的支持最好,打開速度最快,最流暢。
Make editing big files faster 🚀
dstein64/nvim-scrollview#
可以給 nvim 右側加上滾動條指示器。
AndrewRadev/switch.vim#
很方便的在 false
和 true
直接切換。
Wansmer/treesj#
根據 ast 對多行作用域合併到一行,或者相反。還是很方便的。
mbbill/undotree#
沒用過幾次,但是關鍵時候挺有用的。回溯 undo 歷史。
gbprod/yanky.nvim#
剪貼板記錄。
Eandrju/cellular-automaton.nvim#
沒卵用的東西,just for fun。
下代碼雨。
Bekaboo/dropbar.nvim#
類似 VSC 的麵包屑導航,需要 nvim > 0.10。
此文由 Mix Space 同步更新至 xLog 原始鏈接為 https://innei.in/posts/Z-Turn/nvim-lua-config-init