
分享一个我用 Lua 编写的 Neovim 一体化配置框架。早用 lua 早日摆脱 vimscript。
特性
- 用 Lua 管理 nvim 配置。所有配置项都可覆盖。
- 充分使用 Neovim 功能:Native LSP、Float Window、Winbar。
- 基于 vim-plug 或 packer.nvim 的插件框架,任你选择。
- 帅气的界面和配色。暗黑模式。支持真彩色、平滑滚动、滚动条、Dashboard。你可以修改配色,详见 doc/colors.md 。
- 支持配置 github 代理,在中国大陆可加快插件下载速度。
- 集成了 120 多个 Vim/Nvim 插件。增强插件的使用体验,并且修复了一些插件的缺点。
插件列表
- 插件管理器: vim-plug (默认) 或 packer
- 面板: alpha.nvim
- 大纲: aerial (默认) 或 majutsushi/tagbar
- 文件浏览器: neo-tree (默认) 或 nerdtree 或 nvim-tree
- 状态栏: lualine (默认) 或 airline
- Tab 栏: tabby
- Buffer 栏: barbar 或 bufferline (如果使用 Buffer 栏,你要禁用 Tab 栏插件)
- 光标栏高亮: beacon (默认) 或 specs.nvim
- 滚动条: nvim-scrollbar
- 平滑滚动: neoscroll.nvim
- 会话: persisted (默认) 或 possession 或 xolox/vim-session 或 rmagatti/auto-session
- 模糊查找: telescope 与 ctrlsf
- Diagnostics 窗口: trouble
- 撤销: vim-mundo
- 语法高亮: treesitter 与 nvim-ts-rainbow 与 nvim-treesitter-pairs
- 单词高亮: vim-interestingwords
- 注释代码: Comment.nvim (默认) 或 nerdcommenter
- LSP: nvim-lspconfig 与 treesitter 与 null-ls 与 nlsp 与 goto-preview 与 lsp-toggle
- DAP: nvim-dap
- 格式化: lsp-format 与 editorconfig-vim
- Formatter, Linter, LSP, DAP 管理器: mason 与 mason-installer
- 补全: nvim-cmp
- Snippets: nvim-snippy
- Markdown: plasticboy/vim-markdown 与 markdown-preview 与 headlines.nvim 与 vim-MarkdownTOC
- 括号配对: nvim-surround 与 nvim-autopairs 与 nvim-ts-autotag 与 vim-matchup
- Git: gitsigns 与 lazygit 与 diffview.nvim
- 缩进基准线: indent-blankline
- 光标移动: hop.nvim 与 accelerated-jk
- 窗口选择: nvim-window-picker (默认) 或 yorickpeterse/nvim-window 或 vim-choosewin
- 窗口大小调整: simeji/winresizer 与 windows.nvim
- Context: aerial (默认) 或 navic 与 nvim-treesitter-context
- 文本对齐: vim-easy-align
- 书签: vim-bookmarks
- 标记: marks.nvim
- 日历: mattn/calendar-vim
- Curl: rest.nvim
- Icons: devicons 与 icon-picker
- UI 增强: dressing 和 noice
- 启动加速: impatient.nvim
- 跳出输入模式的快捷键: better-escape.nvim
- Increment: increment-activator
- Filetype: filetype.nvim
- Latex: nabla
- 通知: notify (默认) 或 notifier
- 性能调优: vim-startuptime
- Text-Objects: wildfire 与 nvim-treesitter-textobjects
- 表格: vim-table-mode
- 终端: neoterm
- 测试: nvim-test
- TODO 注释: todo-comments
- 尾空格: whitespace
- 复制粘贴: yanky
- 禅模式: twilight 与 zen-mode
- 笔记本: zk
- 实时命令: live-command
- 颜色着色: nvim-colorizer
- 游戏
截图
依赖
- NVIM v0.8 及以上版本
- python3、pip3
- nvim python provider
-
pip3 install --upgrade --user pynvim
-
pip2 install --upgrade --user pynvim
(这是可选的) - Git 与 curl
- C 编译器与 libstdc++。( treesitter 需要)
- Nerd Font 字体 。推荐 DejaVuSansMonoForPowerline Nerd Font 。记得修改你的终端的字体设置。
- ripgrep(rg)
- 支持 Linux 和 MacOS,不支持 Windows
安装
你可使用 git clone 安装本项目。或在容器中运行 nvim。
git clone
PACK_DIR=${XDG_DATA_HOME:-$HOME/.local/share}/nvim/site/pack/user/start
mkdir -p "$PACK_DIR"
git clone --depth 1 --single-branch https://github.com/adoyle-h/one.nvim.git "$PACK_DIR"/one.nvim
# Set your nvim config directory
NVIM_HOME=${XDG_CONFIG_HOME:-$HOME/.config}/nvim
mkdir -p "$NVIM_HOME"
echo "require('one').setup {}" > "$NVIM_HOME"/init.lua
初始化
后,执行
nvim
启动。
容器
你可以在容器里运行它。这要求你的主机已安装 docker。
构建容器
执行
./scripts/build-container
。 (建议中国地区用户加上
-p
参数使用代理,加快构建速度)。
苹果芯片的 Mac 用户注意
。当前 nvim 未提供 Arm 架构下的发行版。所以容器构建和运行都使用了
--platform=linux/amd64
选项。苹果芯片下运行容器会很卡。
使用容器
# 在主机上缓存 nvim 数据
docker volume create nvim-data
# 建议把这行 alias 加到 ~/.bashrc
alias nvim='docker run --rm -it --platform linux/amd64 -v "$HOME/.config/nvim:/root/.config/nvim" -v "nvim-data:/root/.local/share/nvim" -v "$PWD:/workspace" adoyle/one.nvim:v0.8.0'
初始化
后,执行
nvim
启动。
配置
所有配置项都是可选的。
require('one').setup {}
用户配置
你可以传入自定义配置来覆盖默认配置。
require('one').setup {
config = {
colors = { -- basic colors
white = '#BEC0C4', -- frontground
black = '#15181D', -- background
cursorLine = '#252931',
['mason-installer'] = {
ensureInstalled = {
'lua-language-server',
'luaformatter',
'bash-language-server',
-- Add your plugins or override plugin default options.
-- More examples in ./lua/one/plugins.lua
plugins = {
-- { 'profiling', disable = false },
-- { 'psliwka/vim-smoothie', disable = false },
}
你可参考 我的 init.lua 来编写你的配置。
你可以覆盖插件的默认选项。详见 插件 - 使用插件 。
默认配置
configFn(config)
有些插件配置需要用到对应的模块。例如
null-ls
的
sources
配置项。你必须定义在
configFn(config)
函数。 函数的返回值必须是一个 table,它会被合并到
config
变量。
require('one').setup {
configFn = function(config)
local builtins = require('null-ls').builtins
local codeActions = builtins.code_actions
local diagnostics = builtins.diagnostics
local formatting = builtins.formatting
-- Do not return config, only return the overridden parts
return {
nullLS = {
sources = {
codeActions.eslint_d,
codeActions.shellcheck,
diagnostics.eslint_d,
formatting.eslint_d.with {
prefer_local = 'node_modules/.bin',
formatting.lua_format,
end,
}
覆盖插件参数
通过
require('one').setup {plugins = {}}
,你可以覆盖任何
插件参数
。你可以覆盖配色和快捷键设置。
查看配置
你可以通过编写 lua 脚本访问
require('one.config').config
或
a.CM.config
获取配置信息.
同时,这里提供了两个命令来查看配置:
:ShowConfig
查看最终合并的配置。
:ShowPlugins
查看加载的和未加载的插件。
插件管理器
选择你喜欢的插件管理器,目前提供
vim-plug
(默认) 和
packer
。
require('one').setup {
config = {
pluginManager = { use = 'packer' }, -- 'vim-plug' or 'packer'
}
vim-plug 管理的插件目录和 packer 管理的是不一样的。当你改变了
config.pluginManager.use
的值,需要重装插件。详见
初始化
流程。
插件
所有插件都可以被关闭,覆盖默认配置项,或者替换成你喜欢的插件。自定义配置和扩展非常方便。
插件的定义和使用,详见 ./doc/plugin.md 。
你甚至可以设置
onlyPlugins = {}
来一键禁用所有插件(不禁用插件管理器)。详见
Debug - Disable other plugins
。
代理
require('one').setup {
config = {
proxy = {
-- 如果你在中国大陆,推荐使用 'https://ghproxy.com'。否则,不要设置该配置项。
github = 'https://ghproxy.com',
}
有些插件使用了 git submodule,代理无法起作用。建议你执行
git config --global http.https://github.com.proxy https://ghproxy.com
设置全局代理。
使用
LSP
本项目使用 nvim-lspconfig 和 null-ls 来配置 LSP,管理 LSP 与 Nvim 的连接。 使用 mason.nvim 来安装与管理 lsp,dap 和 null-ls 的第三方包。
格代化码式
本项目基于 LSP 来格式化代码。 使用
lsp-format
代替 nvim 内置的
vim.lsp.buf.format
,提供更灵活的自定义配置。详见
lsp-format 选项
。
Telescope 插件
本项目实现了很多有用的 Telescope 插件,详见 ad-telescope-extensions.nvim 和 ./lua/one/plugins/telescope/extensions.lua 。
可使用
<space>;
快捷键查询所有 Telescope 插件。
窗口选择器
按下
<C-w><C-w>
打开选择器浏览所有 Tab 和窗口。 按下
<CR>
跳转到对应的窗口或者 Tab。
浮动命令栏
该功能默认未开启,因为还不稳定。 你可以依照下面的代码启用。
require('one').setup {
plugins = {
{ 'noice', disable = false },
}
它会隐藏命令栏。当
:
,
/
,
?
按下会弹出窗口。
扩展你自己的插件、高亮、命令等配置
local my = {}
my.highlights = function(config)
local c = config.colors
return { CmpGhostText = { fg = c.grey4, bg = c.darkBlue } }
my.commands = {
Hello = ':echo world'
require('one').setup {
plugins = { my },
}
全局变量
你可以在运行时操作 one.nvim 的属性。
╭─────────────────────╮
│ one.CM CMD │
│ one.FT CMD │
│ one.PM CMD │
│ one.cmp CMD │