本文整理一套跨平台 Neovim 格式化全家桶安装方案,目标是在 Alpine、Debian/Ubuntu 和 macOS 下保持一致的使用体验。
这套配置包含:
lazy.nvim插件管理器onedark.nvim护眼深色主题nvim-tree.lua文件树nvim-osc52远程复制conform.nvim代码格式化prettier前端与配置文件格式化工具;t智能切换文件树;f手动格式化;w保存并自动格式化
一、安装 Neovim
要求 Neovim 版本不低于 0.10.0。如果系统仓库版本太旧,建议改用官方 release 或源码编译方式。
Debian / Ubuntu
sudo apt update
sudo apt install -y neovim git curl
nvim --version | grep ^NVIM
如果 Debian 或 Ubuntu 仓库里的 Neovim 版本低于 0.10.0,可以参考源码编译方案,或使用官方 release 版本。
Alpine
apk add --no-cache neovim git curl
nvim --version | grep ^NVIM
Alpine 3.23 官方仓库通常已经提供较新的 Neovim,适合直接安装。
macOS
brew install neovim
nvim --version | grep ^NVIM
macOS 使用 Homebrew 安装即可,默认通常是最新稳定版。
二、安装格式化与剪贴板依赖
conform.nvim 负责调用格式化器,但真正执行格式化的是系统里的外部命令。这里统一使用 prettier。
Debian / Ubuntu
sudo apt update
sudo apt install -y nodejs npm xclip
sudo npm install -g prettier
Alpine
apk add --no-cache nodejs npm build-base
npm install -g prettier
如果 Alpine 下 npm 下载较慢或安装失败,可以临时切换 npm 镜像源:
npm config set registry https://registry.npmmirror.com
npm install -g prettier
macOS
brew install node
npm install -g prettier
安装完成后统一验证:
node -v
npm -v
prettier -v
三、写入统一 Lua 配置
下面这份 init.lua 可同时用于 Alpine、Debian/Ubuntu 和 macOS。
# 1. 清理旧环境
rm -rf ~/.config/nvim ~/.local/share/nvim ~/.local/state/nvim ~/.cache/nvim
# 2. 写入配置
mkdir -p ~/.config/nvim
cat << 'EOF' > ~/.config/nvim/init.lua
-- [基础设置]
vim.g.mapleader = ";"
local opt = vim.opt
opt.number = true
opt.relativenumber = true
opt.cursorline = true
opt.termguicolors = true
opt.encoding = "utf-8"
opt.mouse = "a"
opt.timeoutlen = 300
opt.splitright = true
opt.splitbelow = true
-- [安装 lazy.nvim]
local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
if not vim.loop.fs_stat(lazypath) then
vim.fn.system({
"git",
"clone",
"--filter=blob:none",
"https://github.com/folke/lazy.nvim.git",
"--branch=stable",
lazypath,
})
end
vim.opt.rtp:prepend(lazypath)
-- [插件配置]
require("lazy").setup({
{
"navarasu/onedark.nvim",
lazy = false,
priority = 1000,
config = function()
require("onedark").setup({ style = "dark" })
require("onedark").load()
local hl = vim.api.nvim_set_hl
hl(0, "Normal", { bg = "#1e2127", fg = "#abb2bf" })
hl(0, "NonText", { bg = "#1e2127", fg = "#3b4048" })
hl(0, "CursorLine", { bg = "#2c313a" })
hl(0, "Visual", { bg = "#3e4452" })
hl(0, "Search", { bg = "#61afef", fg = "#1e2127" })
hl(0, "IncSearch", { bg = "#98c379", fg = "#1e2127" })
end,
},
{
"nvim-tree/nvim-tree.lua",
dependencies = { "nvim-tree/nvim-web-devicons" },
config = function()
require("nvim-tree").setup({
view = { width = 30, side = "left" },
renderer = { indent_markers = { enable = true } },
})
end,
},
{
"ojroques/nvim-osc52",
config = function()
require("osc52").setup()
vim.api.nvim_create_autocmd("TextYankPost", {
callback = function()
if vim.v.event.operator == "y" and vim.v.event.regname == "" then
require("osc52").copy_register("")
end
end,
})
end,
},
{
"stevearc/conform.nvim",
config = function()
require("conform").setup({
formatters_by_ft = {
json = { "prettier" },
yaml = { "prettier" },
html = { "prettier" },
css = { "prettier" },
javascript = { "prettier" },
typescript = { "prettier" },
markdown = { "prettier" },
},
format_on_save = {
timeout_ms = 1000,
lsp_format = "fallback",
},
})
end,
},
})
-- [快捷键映射]
local map = vim.keymap.set
map("n", "<leader>w", ":w<CR>", { silent = true })
map("n", "<leader>q", ":q<CR>", { silent = true })
map("n", "<CR>", ":noh<CR><CR>", { silent = true })
-- 智能文件树切换:;t
map("n", "<leader>t", function()
local view = require("nvim-tree.view")
if view.is_visible() then
if vim.api.nvim_get_current_win() == view.get_winnr() then
vim.cmd("wincmd p")
else
vim.cmd("NvimTreeFocus")
end
else
vim.cmd("NvimTreeToggle")
end
end, { silent = true })
-- 手动格式化:;f
map({ "n", "v" }, "<leader>f", function()
require("conform").format({
timeout_ms = 1000,
lsp_format = "fallback",
})
print("Format executed")
end, { silent = true })
-- 窗口导航
map("n", "<C-h>", "<C-w>h")
map("n", "<C-l>", "<C-w>l")
map("n", "<C-j>", "<C-w>j")
map("n", "<C-k>", "<C-w>k")
EOF
四、首次启动 Neovim
执行:
nvim
第一次启动时,lazy.nvim 会自动下载并安装所有插件。保持网络畅通,等待插件安装完成即可。
退出:
:qa
如果 GitHub 访问不稳定,插件下载可能失败。确认网络后,重新打开 Neovim,或者在 Neovim 内执行:
:Lazy sync
五、验证格式化功能
新建 JSON 文件:
nvim test.json
写入未格式化内容:
{"name":"nvim","platform":"cross-platform","format":true}
普通模式下输入:
;f
如果配置正常,文件会被 Prettier 格式化。也可以输入:
;w
保存时 conform.nvim 会自动执行格式化。
检查格式化状态:
:ConformInfo
如果 prettier 未被识别,先检查命令路径:
which prettier
prettier -v
六、常用快捷键
;t:文件树与代码窗口智能切换;f:格式化当前文件或选中范围;w:保存当前文件,并触发保存时格式化;q:退出当前窗口Ctrl+h/j/k/l:在窗口之间移动Enter:清除搜索高亮
七、平台注意事项
Alpine 通常用于轻量虚拟机或容器,系统非常精简。如果插件下载失败,优先检查 DNS、GitHub 访问和 git 是否已安装。
Debian / Ubuntu 如果仓库里的 Neovim 版本过旧,建议改用源码编译或官方 release 包,不要勉强使用旧版。
macOS 的剪贴板体验通常比 Linux 更自然;如果远程 SSH 复制不生效,检查终端是否支持 OSC 52。
图标能否正常显示,取决于本地终端字体是否安装 Nerd Fonts,例如 JetBrainsMono Nerd Font。
至此,Alpine、Debian/Ubuntu 和 macOS 下的 Neovim 配置体验就基本统一了。
