Wednesday, July 16, 2025

Luarocks 與 Neovim

最近我遇到了一個挑戰:

> 如果使用 luarocks 安裝了 lua-cbor 的話,neovim 裡寫的 lua script 可以使用 lua-cbor 嗎?

答案是:預設不行,要做一些調整。

由於我的 luarocks 也是用 homebrew 去安裝的,而預設的 luarocks 它依賴的 lua interpreter 跟 neovim 預設依賴的 lua interpreter 不同。此外,neovim 的 package path 也很可能找不到 luarocks 的安裝 path 。

解法:
1. 重新安裝 luarocks ,下載 tar 包、重新編譯、安裝,讓它一定會依賴於 neovim 預設依賴的 lua interpreter ,即 luajit 
2. 設定 neovim 內部的 path ,使它可以讀得到 luarocks 的 module/library paths

< 重新安裝 luarocks 的指令 >
1. brew install luajit
2. wget https://luarocks.org/releases/luarocks-3.9.2.tar.gz
3. tar zxvf; cd luarocks-3.9.2
4. mkdir ~/.luarocks-luajit
5. ./configure \
  --with-lua=$(brew --prefix luajit) \
  --with-lua-include=$(brew --prefix luajit)/include/luajit-2.1 \
  --lua-suffix=jit \
  --prefix=$HOME/.luarocks-luajit
6. make && make install


< 設定 neovim 內部的 path >
1. 在 lua 資料夾下生成一個檔案  luarocks.lua
2. 貼上以下的內容:

```
local function add_luarocks_paths()

  local luarocks_path = "/Users/laurencechen/.luarocks-luajit/share/lua/5.1/?.lua;/Users/laurencechen/.luarocks-luajit/share/lua/5.1/?/init.lua"

  local luarocks_cpath = "/Users/laurencechen/.luarocks-luajit/lib/lua/5.1/?.so"

  package.path = package.path .. ";" .. luarocks_path

  package.cpath = package.cpath .. ";" .. luarocks_cpath

end

return {add_luarocks_paths = add_luarocks_paths}

```
3. 在 init.vim 裡增加一行 lua require("luarocks").add_luarocks_paths()