T 教程 Tutorials

Neovim 入门:从安装到最小可用 init.lua

中文长文:macOS/Linux 安装、nvim vs vim、配置目录、首次打开、模式与 buffer/window/tab、基础移动编辑、:help,以及一份可跑的最小 init.lua。

教程

本篇是 Neovim 三部曲的入门篇:目标不是「配成网红配置」,而是让你在 macOS / Linux 上装好 nvim,搞清目录与模式,能打开文件、改几行、存盘、查帮助,并留下一份最小可扩展的 init.lua。实战插件见 Neovim 实战,Lua API 与自定义插件见 Neovim 精通。

和 VS Code 的关系:不是互斥。白天用 IDE、晚上用终端,或数据脚本全放终端,都合理。先把「打开 → 改 → 存 → 跑」跑通。

安装(macOS / Linux)

macOS

Homebrew 最省事:

brew install neovim
nvim --version

希望跟最新 nightly 可看 brew install --HEAD neovim,日常稳定版足够。

Linux(Debian / Ubuntu)

发行版仓库版本往往偏旧。可以用官方 AppImage、源码,或 Neovim 团队维护的 PPA / 包。示例(Ubuntu 用官方 tarball 思路):

# 用包管理器(版本因发行版而异)
sudo apt update
sudo apt install neovim

# 或下载 release 资产中的 nvim-linux64.tar.gz 解压到 ~/opt/nvim
# 再把 bin 加入 PATH

Arch:

sudo pacman -S neovim

Fedora:

sudo dnf install neovim

验证:

which nvim
nvim --version   # 建议 0.9+,本教程按 0.10 心智写 Lua

可选:把 nvim 当 vim / vi

若希望 vim 命令也进 Neovim:

# 仅当前 shell 示例
alias vim=nvim
alias vi=nvim

长期可写进 ~/.zshrc / ~/.bashrc。Git 等调用 vi 时,也可设:

export EDITOR=nvim
export VISUAL=nvim

nvim vs vim:差在哪

点VimNeovim
默认配置语言VimscriptLua(仍兼容 Vimscript)
架构单体更模块化,内置 LSP 客户端、Treesitter 接口
默认终端 / Job有异步 Job、内置 terminal 体验更统一
生态vim-plug 等lazy.nvim 等现代插件管理为主流
兼容—大部分 Vim 技巧可迁移,部分选项名有差异

一句话:手感继承 Vim,工程与扩展偏向 Neovim。 你以前会的 hjkl、ci"、宏,在 nvim 里照旧。

配置目录在哪

Neovim 遵循 XDG:

用途路径
主配置~/.config/nvim/init.lua(或 init.vim)
模块~/.config/nvim/lua/**/*.lua
数据(插件安装等)~/.local/share/nvim/
状态 / shada~/.local/state/nvim/
缓存~/.local/cache/nvim/

查实际路径:

:echo stdpath('config')
:echo stdpath('data')

最小结构建议:

~/.config/nvim/
  init.lua
  lua/
    options.lua
    keymaps.lua

init.lua 里:

require('options')
require('keymaps')

Lua 模块名对应 lua/options.lua → require('options')。

首次打开:别慌

nvim
# 或
nvim README.md
nvim src/main.py

空白缓冲时你会看到几乎空的界面。按 i 进入插入模式打字,Esc 回普通模式,:w file.txt 另存,:q 退出,:wq 保存并退出,:q! 放弃修改。

常用「救命」:

  • 卡在某种模式:连按 Esc,或 Ctrl-[
  • 终端里显示乱::set termguicolors(真彩色终端)
  • 不会关::qa! 强制关所有

模式(modes)心智

先掌握四个:

  1. Normal(普通):默认;移动、删除、复制、执行命令。按 Esc 回来。
  2. Insert(插入):i / a / o 等进入;像普通编辑器打字。
  3. Visual(可视):v 字符、V 行、Ctrl-v 块选;再 d/y/> 操作。
  4. Command-line(命令行):: 开头,如 :w、:s/old/new/g。

另有 Replace、Terminal、Operator-pending 等,入门阶段遇到再查。

记忆法:Normal 是「指挥」,Insert 是「打字」,Visual 是「圈选」,: 是「下指令」。

Buffers / Windows / Tabs

这是 Vim 系最易混的三点:

  • Buffer(缓冲区):打开过的文件内容在内存中的表示。可以隐藏不显示。
  • Window(窗口):屏幕上的分割视口,显示某个 buffer。
  • Tab page(标签页):一组窗口布局。不是「一个文件一个 tab」的浏览器心智。

常用:

:ls          " 列出 buffer
:bnext       " 下一 buffer(可映射)
:bprev
:split       " 水平分窗
:vsplit      " 垂直分窗
Ctrl-w h/j/k/l   " 在窗口间移动
:tabnew      " 新标签
gt / gT      " 标签间切换

建议:日常多用 buffer + 分窗,少把 tab 当浏览器标签。

基础移动与编辑

移动

按键作用
h j k l左下上右
w / b下一词 / 上一词
0 / ^ / $行首 / 第一个非空白 / 行尾
gg / G文件头 / 文件尾
{ / }上一段 / 下一段
%括号跳转
Ctrl-d / Ctrl-u半页下 / 上
f{c} / t{c}行内找字符 / 到字符前

编辑(操作符 + 动作)

Vim 语法:操作符 + 动作(或文本对象)。

示例含义
dw删到词尾
d$ / D删到行尾
dd删整行
ci"改双引号内(change inside)
ya(复制圆括号及内容
u / Ctrl-r撤销 / 重做
yy / p复制行 / 粘贴
.重复上次修改

文本对象:i" a" i( a[ iw aw 等,配合 c/d/y 极强。

搜索与替换

/pattern     " 向下搜,n/N 下一个/上一个
?pattern     " 向上搜
:s/old/new/g " 当前行
:%s/old/new/g " 全文件
:%s/old/new/gc " 全文件并确认

:help 才是第一插件

:help
:help :w
:help windows
:help lua-guide
:help options
:user-manual

在帮助缓冲里 Ctrl-] 跟随链接,Ctrl-t / Ctrl-o 返回。中文用户也可装翻译文档,但英文帮助与版本同步最好。

查选项:

:help 'clipboard'
:set clipboard? 

推荐最小 init.lua

把下面存为 ~/.config/nvim/init.lua,重启 nvim。注释可按需删。

-- ~/.config/nvim/init.lua  — 入门最小集
vim.g.mapleader = ' '
vim.g.maplocalleader = ' '

local o = vim.opt
o.number = true
o.relativenumber = true
o.cursorline = true
o.termguicolors = true
o.clipboard = 'unnamedplus'
o.ignorecase = true
o.smartcase = true
o.expandtab = true
o.shiftwidth = 2
o.tabstop = 2
o.undofile = true
o.splitright = true
o.splitbelow = true
o.signcolumn = 'yes'
o.scrolloff = 4
o.updatetime = 250

-- 基础键位
local map = vim.keymap.set
map('n', '<leader>w', '<cmd>write<cr>', { desc = 'Save' })
map('n', '<leader>q', '<cmd>quit<cr>', { desc = 'Quit' })
map('n', '<leader>h', '<cmd>nohlsearch<cr>', { desc = 'Clear search' })
map('n', '<C-h>', '<C-w>h')
map('n', '<C-j>', '<C-w>j')
map('n', '<C-k>', '<C-w>k')
map('n', '<C-l>', '<C-w>l')

-- 缩进在可视模式保持选区
map('v', '<', '<gv')
map('v', '>', '>gv')

-- 中文用户:偶尔需要快速切回 Esc
map('i', 'jk', '<Esc>', { desc = 'Exit insert' })

可选拆文件:把 vim.opt 段放进 lua/options.lua,键位放进 lua/keymaps.lua,init.lua 只 require。

剪贴板与终端

  • macOS:一般装好即可用 unnamedplus(依赖 pbcopy/pbpaste)。
  • Linux:需 xclip 或 wl-clipboard(Wayland)。

真彩色:iTerm2 / Kitty / Windows Terminal / 现代 VTE 都支持,确保 TERM 合理(如 xterm-256color)且 termguicolors 打开。

练习清单(30 分钟)

  1. 用 nvim 打开任意 Markdown,:w 存一次。
  2. 练习 ci"、dd、yy/p、u。
  3. :vsplit 再 Ctrl-w 切换。
  4. :help lua-guide 翻两节。
  5. 改 shiftwidth,:set shiftwidth? 确认。

下一步

插件、LSP、Telescope、Python 工作流 → Neovim 实战。
Lua API、autocmd、自定义插件、性能与远程 → Neovim 精通。


配置是园艺不是装修:先让植物活下来,再谈造型。

评论