Skip to content

Instantly share code, notes, and snippets.

@lazydao
Last active July 1, 2025 08:13
Show Gist options
  • Save lazydao/b4e89d079538bd34966c5aab630ef273 to your computer and use it in GitHub Desktop.
Save lazydao/b4e89d079538bd34966c5aab630ef273 to your computer and use it in GitHub Desktop.
neovim
vim.opt.runtimepath:prepend("~/.vim")
-- 禁用 netrw,避免与 nvim-tree 冲突
vim.g.loaded_netrw = 1
vim.g.loaded_netrwPlugin = 1
-- 插件管理
vim.cmd([[
call plug#begin('~/.vim/plugged')
Plug 'neovim/nvim-lspconfig'
Plug 'hrsh7th/nvim-cmp'
Plug 'hrsh7th/cmp-nvim-lsp'
Plug 'hrsh7th/cmp-buffer'
Plug 'hrsh7th/cmp-path'
Plug 'hrsh7th/cmp-cmdline'
Plug 'hrsh7th/cmp-vsnip'
Plug 'hrsh7th/vim-vsnip'
Plug 'folke/tokyonight.nvim'
Plug 'rktjmp/lush.nvim'
Plug 'tpope/vim-fugitive'
Plug 'airblade/vim-gitgutter'
Plug 'spin6lock/vim_sproto'
Plug 'nvim-tree/nvim-tree.lua'
Plug 'nvim-tree/nvim-web-devicons'
Plug 'ludovicchabant/vim-gutentags'
Plug 'Yggdroot/LeaderF'
Plug 'sbdchd/neoformat'
Plug 'nvim-lualine/lualine.nvim'
Plug 'echasnovski/mini.move'
Plug 'catppuccin/nvim', { 'as': 'catppuccin' }
call plug#end()
]])
-- 界面设置
vim.opt.termguicolors = true -- 启用真彩色支持
vim.opt.background = "dark" -- "dark" | "light"
vim.opt.cursorline = true -- 高亮当前行
vim.opt.number = true -- 显示行号
vim.opt.relativenumber = true -- 相对行号显示
-- 主题设置
vim.cmd("colorscheme tokyonight")
-- 缩进设置
vim.opt.expandtab = true
vim.opt.tabstop = 4
vim.opt.shiftwidth = 4
vim.opt.softtabstop = 4
vim.opt.autoindent = true
vim.opt.smarttab = true -- 插入 tab 时使用 shiftwidth
-- 搜索设置
vim.opt.ignorecase = true
vim.opt.smartcase = true
vim.opt.incsearch = true
vim.opt.hlsearch = true
vim.opt.backspace = { "indent", "eol", "start" }
-- 实用设置
vim.opt.scrolloff = 8 -- 保持光标周围始终有8行显示
vim.opt.sidescrolloff = 8 -- 水平滚动时保持8列显示
-- 拼写检查设置
vim.opt.spell = true -- 默认开启拼写检查
vim.opt.spelllang = { "en", "cjk" } -- 设置拼写检查语言为英语,并支持中日韩文字
vim.opt.spelloptions = "camel" -- 支持驼峰命名的拼写检查
-- 其他设置
vim.opt.laststatus = 3
vim.opt.clipboard = "unnamedplus"
vim.opt.lazyredraw = true -- 延迟重绘以提高性能
vim.opt.mouse = 'a' -- 启用鼠标支持
-- lualine 配置
require('lualine').setup({})
-- mini.move 配置
require('mini.move').setup({})
-- nvim-cmp 配置
local cmp = require("cmp")
cmp.setup({
snippet = {
expand = function(args)
vim.fn["vsnip#anonymous"](args.body)
end,
},
mapping = cmp.mapping.preset.insert({
["<Tab>"] = cmp.mapping.select_next_item({ behavior = cmp.SelectBehavior.Insert }),
["<S-Tab>"] = cmp.mapping.select_prev_item({ behavior = cmp.SelectBehavior.Insert }),
["<C-b>"] = cmp.mapping.scroll_docs(-4),
["<C-f>"] = cmp.mapping.scroll_docs(4),
["<C-e>"] = cmp.mapping.abort(),
--["<CR>"] = cmp.mapping.confirm({ select = true }),
["<CR>"] = cmp.mapping(function(fallback)
if cmp.visible() and cmp.get_selected_entry() then
-- 如果补全菜单可见,并且确实选择了一个条目,则确认它
cmp.confirm({ select = true }) -- select = true 在这里是安全的,因为我们已经检查过有选中项
else
-- 否则,执行默认的回车行为(换行)
fallback()
end
end, { "i", "s" }), -- 应用于 insert 和 select 模式
}),
sources = cmp.config.sources({
{ name = "nvim_lsp" },
{ name = "vsnip" },
}, {
{ name = "buffer" },
}),
})
cmp.setup.cmdline({ "/", "?" }, {
mapping = cmp.mapping.preset.cmdline(),
sources = { { name = "buffer" } },
})
cmp.setup.cmdline(":", {
mapping = cmp.mapping.preset.cmdline(),
sources = cmp.config.sources({
{ name = "path" },
}, {
{ name = "cmdline" },
}),
})
-- LSP 配置
local lspconfig = require("lspconfig")
local capabilities = require("cmp_nvim_lsp").default_capabilities()
lspconfig.lua_ls.setup({ capabilities = capabilities })
lspconfig.pyright.setup({
capabilities = capabilities,
on_init = function(client)
local project_root = client.config.root_dir or vim.fn.getcwd()
local venv_path = project_root .. "/.venv/bin/python"
if vim.fn.filereadable(venv_path) == 1 then
client.config.settings.python.pythonPath = venv_path
end
end,
})
-- Gutentags 配置
vim.g.gutentags_enabled = 1
vim.g.gutentags_ctags_tagfile = "./tags"
-- LeaderF 配置
vim.g.Lf_WindowPosition = "popup"
vim.g.Lf_WorkingDirectoryMode = "Ac"
-- nvim-tree 配置
require("nvim-tree").setup({})
-- Neoformat 配置
vim.g.neoformat_enabled_python = {'ruff'}
vim.g.neoformat_python_ruff = {
exe = 'ruff',
args = {'format', '-'},
stdin = 1
}
vim.g.neoformat_enabled_lua = {'stylua'}
vim.g.neoformat_lua_stylua = {
exe = 'stylua',
args = {'--search-parent-directories', '-'},
stdin = 1
}
-- 快捷键配置
-- nvim-tree 快捷键:隐藏、聚焦
vim.keymap.set("n", "<leader>t", ":NvimTreeToggle<CR>", { silent = true })
vim.keymap.set("n", "<leader>n", ":NvimTreeFocus<CR>", { silent = true })
-- 查找文件
vim.keymap.set('n', '<C-p>', ':Leaderf file<CR>', { silent = true })
-- 格式化快捷键
vim.keymap.set('n', '<leader>f', ':Neoformat<CR>', { silent = true })
-- 窗口切换
vim.keymap.set('n', '<C-h>', '<C-w>h')
vim.keymap.set('n', '<C-j>', '<C-w>j')
vim.keymap.set('n', '<C-k>', '<C-w>k')
vim.keymap.set('n', '<C-l>', '<C-w>l')
-- 快速保存
vim.keymap.set('n', '<leader>w', ':w<CR>')
vim.keymap.set('n', '<leader>q', ':q<CR>')

安装

参考:https://github.com/neovim/neovim/blob/master/INSTALL.md

推荐做法:

# 下载最新版本
wget https://github.com/neovim/neovim/releases/latest/download/nvim-linux64.tar.gz
# 解压
tar -zxvf nvim-linux64.tar.gz
# 通过 `ln -s` 将解压后的 nvim 可执行文件导入 PATH,例如
sudo ln -s ~/nvim-linux64/bin/nvim /usr/local/bin/nvim

配置

  • :checkhealth 检查配置状况
  • :PlugInstall to install the plugins
  • :PlugUpdate to install or update the plugins
  • :PlugDiff to review the changes from the last update
  • :PlugClean to remove plugins no longer in the list

环境依赖

sudo apt install curl python3-dev python3-venv python3-neovim python3-pynvim exuberant-ctags pipx vim-nox
sudo apt install nodejs npm -y
sudo npm install -g pyright
pipx install ruff
cargo install stylua
  • vim-plug 安装
    • sh -c 'curl -fLo "${XDG_DATA_HOME:-$HOME/.local/share}"/nvim/site/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim'
    • 如果 vim 中已经安装了(~/.vim/autoload/plug.vim),就不用再装了
  • lua-language-server 安装并添加至PATH

快捷键

可以用 :map 查看已绑定快捷键。

默认情况下,<leader> 键的映射是反斜杠 \

移动与跳转

快捷键/命令 动作/说明
h/j/k/l 左/下/上/右移动
gg/G 跳转到首行/末行
0/^/$ 跳转到行首/首非空/行尾
w/b/e 跳转到下一个单词首/上一个单词首/下一个单词结尾
% 跳转到匹配括号
fx/tx/Fx/Tx 跳转到下一个x/下一个x前一位/上一个x/上一个x后一位
Ctrl-i 跳到更“新”位置(跳转历史向前)
Ctrl-o 跳到更“旧”位置(跳转历史向后)
Ctrl-] 跳转到光标下符号的定义
Ctrl-t 返回上一个位置
:tag <symbol> 直接跳转到指定符号
:ts <symbol> 查找所有匹配的符号
zz/zt/zb 当前行居中/顶部/底部

编辑与操作

快捷键/命令 动作/说明
i/a/o 进入插入/追加/新开一行插入模式
u 撤销(Undo)
Ctrl-r 重做(Redo)
di"/dt" 删除双引号内/到下一个双引号
%s/old/new/g 全局替换 old 为 new
:saveas <path> 另存为指定路径
<C-W>d 显示光标下诊断信息
<Ctrl+\> 终端与普通模式切换

插入模式快捷键

快捷键 动作/说明
Ctrl-h 删除光标前一个字符
Ctrl-w 删除光标前的一个单词
Ctrl-u 删除从行首到光标的所有字符
Ctrl-a 跳到行首并保留插入模式
Ctrl-e 跳到行尾并保留插入模式

普通模式快捷键

快捷键 动作/说明
Ctrl-d 向下滚动半页
Ctrl-u 向上滚动半页
Ctrl-f 向下滚动一页(Forward)
Ctrl-b 向上滚动一页(Back)
<leader>b * :LeaderfBuffer
[d/]d 上/下一个诊断(neovim专属)
[c/]c 上/下一个 Git hunk
[s/]s 上/下一个拼写错误(neovim专属)
z= 显示建议的正确拼写(neovim专属)
zg 将光标下的单词标记为正确(neovim专属)
zw 将光标下的单词标记为错误(neovim专属)

窗口与分屏

快捷键 动作/说明
Ctrl+w h/j/k/l 窗口左/下/上/右移
Ctrl+w >/< 增加/减少窗口宽度
Ctrl+w +/- 增加/减少窗口高度

nvim-tree 中使用的快捷键

  • a 创建文件或目录
  • S 搜索
  • R 刷新
  • W 折叠
  • x 剪切
  • c 复制
  • p 粘贴
  • r 重命名
  • d 删除
  • <C-X> 水平分屏打开
  • <C-V> 垂直分屏打开
  • <C-T> 新标签页打开
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment