05 - 文本编辑器(Vim + Nano)

在图形化编辑器盛行的时代,终端文本编辑器依然是 Linux 用户和开发者的核心工具。远程服务器没有 GUI、Docker 容器极简环境、快速修改配置文件——这些场景下,掌握至少一个终端编辑器是刚需。本章从入门友好的 nano 开始,再深入讲 Vim 的使用哲学。


5.1 为什么必须学会终端编辑器

场景说明
SSH 远程管理远程服务器通常只有命令行,没有图形界面
Docker 容器容器镜像为了体积最小化,通常不包含 GUI
系统恢复系统崩溃后的单用户模式只有终端可用
sudo 编辑系统配置sudo vim /etc/nginx/nginx.conf 比 GUI 更直接
效率熟练后编辑速度远超鼠标操作
通用性任何 Linux/Unix 系统都有 vi(POSIX 标准要求)
graph TD
 A["你需要编辑文本"] --> B{"环境?"}
 B -->|"SSH 远程 / Docker / 恢复模式"| C["终端编辑器是唯一选择"]
 B -->|"本地桌面"| D["终端编辑器或 GUI 编辑器均可"]
 C --> E["学习 Vim 或 Nano"]
 D --> F["仍推荐终端编辑器<br/>效率更高"]

 style C fill:#ffcdd2
 style E fill:#e8f5e9

5.2 Nano — 入门友好的编辑器

5.2.1 Nano 简介

Nano 是 GNU 项目的一部分,设计目标是简单直观。底部始终显示快捷键提示,上手难度极低。

5.2.2 基本操作

nano # 新建空白文件
nano file.txt # 打开已有文件或创建新文件
nano -l file.txt # 显示行号
nano -m file.txt # 启用鼠标支持
nano -B file.txt # 保存时创建备份 file.txt~

5.2.3 Nano 快捷键

所有快捷键以 ^ 表示 Ctrl 键,以 M- 表示 Alt/Esc 键:

快捷键功能记忆技巧
Ctrl+G显示帮助Get Help
Ctrl+O保存文件(Write Out)Write Out
Ctrl+X退出Exit
Ctrl+K剪切当前行Kut
Ctrl+U粘贴(Uncut)Uncut
Ctrl+W搜索Where is
Ctrl+\搜索并替换
Ctrl+C显示光标位置Cursor position
Ctrl+_跳转到指定行号Go to line
Alt+U撤销Undo
Alt+E重做Redo
Alt+A设置标记(开始选择)Mark

5.2.4 Nano 配置文件

~/.nanorc 配置示例:

# ~/.nanorc
set linenumbers # 显示行号
set autoindent # 自动缩进
set tabsize 4 # Tab 宽度为 4
set tabstospaces # Tab 转换为空格
set softwrap # 软换行
set constantshow # 始终显示状态栏
set mouse # 启用鼠标
set backup # 保存时创建备份
syntax on # 语法高亮
include /usr/share/nano/*.nanorc # 包含所有语法高亮文件

5.2.5 Nano 适合谁

  • Linux 初学者
  • 只需偶尔修改配置文件的用户
  • 偏好简单直观操作的用户

Nano 虽简单,但足以应对日常的配置文件编辑需求。如果你需要高效的代码编辑和复杂的文本处理,则应投入时间学习 Vim。


5.3 Vim — 程序员的编辑器

5.3.1 Vim 的哲学

Vim(Vi IMproved)是 Bram Moolenaar 在 1991 年发布的 Vi 增强版。Vi 本身由 Bill Joy 在 1976 年编写,是 Unix 系统的标准编辑器。

Vim 的核心设计理念:

编辑文本不是打字,而是一种”操作语言”。

Vim 将编辑操作抽象为:

  • 动作(motion) — 移动光标到哪里(w, b, j, /pattern…)
  • 操作符(operator) — 做什么(d 删除, y 复制, c 修改…)
  • 计数器(count) — 做多少次(3dw = 删除 3 个词)

这三者可以自由组合,形成强大的编辑指令。

5.3.2 安装 Vim

# 使用你的包管理器安装
# Debian/Ubuntu:
sudo apt install vim -y
 
# Fedora:
sudo dnf install vim-enhanced -y
 
# Arch Linux:
sudo pacman -S vim
 
# openSUSE:
sudo zypper install vim -y
# 启动 vim 内置教程(推荐初学者完成此教程!)
vimtutor

5.4 Vim 四大模式

Vim 的模式(mode)是初学者最大的困惑来源。理解模式切换是掌握 Vim 的关键。

stateDiagram-v2
 [*] --> 普通模式
 普通模式 --> 插入模式: i / a / o
 普通模式 --> 可视模式: v / V / Ctrl+v
 普通模式 --> 命令模式: :
 插入模式 --> 普通模式: Esc / Ctrl+[
 可视模式 --> 普通模式: Esc
 命令模式 --> 普通模式: Esc / Enter

 note right of 普通模式: 默认模式\n导航、删除、复制
 note right of 插入模式: 编辑文本\n打字输入
 note right of 可视模式: 选择文本块
 note right of 命令模式: 保存、退出、搜索

5.4.1 普通模式(Normal Mode)

启动 Vim 后默认的模式。不能输入文本,但可以导航、删除、复制等。

vim file.txt # 打开文件,进入普通模式

在任何模式下按 Esc 都可以回到普通模式。

5.4.2 插入模式(Insert Mode)

实际”打字输入”的模式。

进入方式效果
i在光标前插入
I在行首插入
a在光标后追加(append)
A在行尾追加
o在下方新开一行并插入(open below)
O在上方新开一行并插入(Open above)
s删除光标处字符并插入
S删除整行并插入(同 cc

5.4.3 可视模式(Visual Mode)

用于选择文本块:

进入方式效果
v字符选择模式
V行选择模式
Ctrl+v块选择模式(矩形选择)

选中后可以执行:d(删除)、y(复制)、>(缩进)、<(反缩进)等。

5.4.4 命令模式(Command Mode)

在普通模式下按 : 进入,可以输入 Ex 命令:

命令效果
:w保存
:q退出
:wq保存并退出
:q!强制退出(放弃修改)
:x保存并退出(同 :wq
:w filename另存为
:e filename打开另一个文件

5.5 Vim 移动(Movement)

在普通模式下,高效移动光标是基本功。强制不用方向键,用 hjkl 替代,是 Vim 学习的重要习惯。

5.5.1 基本方向键

 k (上)
h(左) l(右)
 j (下)
方向记忆技巧
h最左边,且 h ↔ l 对称
jj 像向下伸展的钩子
kk 像向上
l最右边

5.5.2 单词级移动

命令移动
w下个单词的开头(word)
b上个单词的开头(back)
e当前/下个单词的结尾(end)
W下个大单词(仅空格分隔,忽略标点)
B上个大单词
E大单词结尾

5.5.3 行内移动

命令移动
0行首(第 1 列)
^本行第一个非空字符
$行尾
f<char>行内向右查找字符并跳转(find)
F<char>行内向左查找字符
t<char>行内向右查找字符并停在之前(till)
T<char>行内向左查找字符并停在之后

5.5.4 全文移动

命令移动
gg文件开头
G文件末尾
10gg10G跳转到第 10 行
Ctrl+f向下翻一页(Forward)
Ctrl+b向上翻一页(Backward)
Ctrl+d向下翻半页(Down)
Ctrl+u向上翻半页(Up)
H屏幕顶部(High)
M屏幕中间(Middle)
L屏幕底部(Low)
%在匹配的括号之间跳转
{ / }段落间跳转

5.6 Vim 编辑操作

5.6.1 删除(Delete)

命令效果
x删除光标处字符
X删除光标前字符
dd删除整行(并将其存入寄存器)
3dd删除 3 行
dw删除到下一个单词开头
d$D删除到行尾
d0删除到行首
dG删除到文件末尾
dgg删除到文件开头

5.6.2 复制与粘贴(Yank & Paste)

命令效果
yy复制整行(yank)
3yy复制 3 行
yw复制一个单词
y$复制到行尾
p在光标后粘贴(paste)
P在光标前粘贴
"ayy复制到寄存器 a
"ap粘贴寄存器 a 的内容

5.6.3 修改(Change)

c 操作符 = 删除 + 进入插入模式:

命令效果
cc修改整行(删除行并进入插入模式)
cw修改到单词结尾
c$C修改到行尾
ciw修改光标所在的整个单词(change inner word)
ci(修改括号内的内容
ci"修改双引号内的内容
r<char>替换光标处字符为 <char>
R进入替换模式(覆盖输入)

5.6.4 撤销与重做

命令效果
u撤销(undo)
Ctrl+r重做(redo)
U恢复当前行的所有修改

5.6.5 其他常用操作

命令效果
.重复上一次修改(Vim 最强大的命令之一)
>> / <<缩进 / 反缩进一行
>3j缩进当前行及下面 3 行
J将下一行合并到当前行
~切换光标字符的大小写
gUw将单词转为大写
guw将单词转为小写

5.7 Vim 搜索与替换

5.7.1 搜索

/pattern " 向下搜索 pattern
?pattern " 向上搜索 pattern
n " 下一个匹配
N " 上一个匹配
* " 搜索光标所在的单词(向下)
# " 搜索光标所在的单词(向上)
:set hlsearch " 高亮所有搜索结果
:set nohlsearch " 关闭高亮
:noh " 临时关闭本次高亮

5.7.2 替换

:s/old/new/ " 替换当前行第一个匹配
:s/old/new/g " 替换当前行所有匹配
:%s/old/new/g " 替换文件中所有匹配
:%s/old/new/gc " 替换文件中所有匹配(每次确认)
:10,20s/old/new/g " 替换第 10-20 行的匹配
 
" 正则表达式替换
:%s/\s\+$//e " 删除行尾空白
:%s/^#\s\(.*\)/\1/ " 取消注释(移除行首 # )
:%s/^/\# / " 注释所有行

5.8 Vim 多文件与窗口

5.8.1 缓冲区(Buffer)

:e file2.txt " 编辑另一个文件
:bnext 或 :bn " 切换到下一个缓冲区
:bprev 或 :bp " 切换到上一个缓冲区
:ls " 列出所有缓冲区
:b1 " 切换到缓冲区 1
:bd " 删除当前缓冲区

5.8.2 分屏

:split file.txt 或 :sp " 水平分割
:vsplit file.txt 或 :vsp " 垂直分割
Ctrl+w h / j / k / l " 在分屏间移动
Ctrl+w q " 关闭当前分屏
Ctrl+w = " 均等分配大小

5.8.3 标签页

:tabnew file.txt " 新标签页打开文件
gt " 切换到下一个标签页
gT " 切换到上一个标签页
:tabclose " 关闭当前标签页

5.9 Vim 配置

5.9.1 .vimrc 基础配置

创建 ~/.vimrc 文件:

" === 基本设置 ===
set number " 显示行号
set relativenumber " 显示相对行号(当前行除外)
set cursorline " 高亮当前行
set tabstop=4 " Tab 显示宽度
set shiftwidth=4 " 缩进宽度
set expandtab " Tab 转为空格
set autoindent " 自动缩进
set smartindent " 智能缩进
set hlsearch " 搜索结果高亮
set incsearch " 增量搜索(边输入边搜索)
set ignorecase " 搜索忽略大小写
set smartcase " 搜索包含大写时恢复大小写敏感
set mouse=a " 启用鼠标
set encoding=utf-8 " UTF-8 编码
set clipboard=unnamed " 系统剪贴板
 
" === 快捷键映射 ===
nnoremap <C-h> <C-w>h " Ctrl+h 到左边分屏
nnoremap <C-j> <C-w>j " Ctrl+j 到下边分屏
nnoremap <C-k> <C-w>k " Ctrl+k 到上边分屏
nnoremap <C-l> <C-w>l " Ctrl+l 到右边分屏
nnoremap <leader>w :w<CR> " ,w 快速保存
 
" === 插件管理器(vim-plug)示例 ===
call plug#begin('~/.vim/plugged')
Plug 'tpope/vim-sensible' " 合理的默认设置
Plug 'preservim/nerdtree' " 文件树侧边栏
Plug 'junegunn/fzf.vim' " 模糊查找
Plug 'morhetz/gruvbox' " 配色方案
call plug#end()
 
colorscheme gruvbox
set background=dark

5.9.2 常用插件推荐

插件功能安装方式
vim-plug插件管理器curl -fLo ~/.vim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
NERDTree文件树侧边栏vim-plug
fzf.vim模糊文件搜索vim-plug
vim-airline状态栏美化vim-plug
coc.nvim代码补全(LSP)vim-plug
gruvbox经典配色vim-plug

5.10 Vim 学习策略

5.10.1 分阶段学习计划

阶段内容时间
第一周完成 vimtutor、学会基本移动(hjkl)、进入/退出插入模式、:w :q每天 15 分钟
第二周dd/yy/p、搜索 /pattern、可视模式 v每天 15 分钟
第三周操作符+动作组合(dw, d$, ciw)、宏录制日常使用
一个月多文件、分屏、.vimrc 定制日常使用
持续逐步减少依赖鼠标,每次学一个新命令终身学习

5.10.2 常见误区

误区正确做法
一直停留在插入模式只在需要输入时进入插入模式,其余时间在普通模式
频繁使用 :q!养成先 :w:q 的习惯
记不住 hjkl每天练习,禁用方向键
一次想学所有命令每次只学 2-3 个新命令

5.11 编辑器选择建议

用户类型推荐编辑器理由
Linux 初学者Nano简单直观,20 分钟上手
开发者Vim / Neovim效率极高,插件生态丰富
系统管理员VimSSH 标配,到处可用
重度 GUI 用户VS Code + Vim 插件现代 UI + Vim 键位
追求极致者Neovim + ARKVimLua 配置、内置 LSP、智能工具链检测、异步更快

5.11.1 Neovim 简介

Neovim 是 Vim 的一个现代化分支,兼容 Vim 插件但性能更好、架构更先进。配置使用 Lua 而非 Vimscript。如果你是 Vim 新手并且准备深入,直接从 Neovim 开始是更好的选择。

一句话建议:先用 Nano 学会 Linux 基本操作,然后花 30 分钟完成 vimtutor 教程,之后在日常使用中逐步提升 Vim 熟练度。

5.11.2 ARKVim — 面向开发者的 Neovim 配置

ARKVim 是基于 LazyVim 的 Neovim 配置发行版,核心特色在于智能语言工具链自动检测 — 仅当系统中存在对应编译器或解释器时,才会启用相关语言的 LSP、格式化、检查与调试插件。无需繁琐的手动配置,开箱即用同时保留了充分的定制空间。

支持的语言:C、C++、Rust、Python、Java、JavaScript、TypeScript、HTML、CSS、Ruby、Lua

每种语言自动集成 LSP 智能补全、代码格式化、静态检查(lint)和调试器:

功能工具(按语言自动选择)
智能补全(LSP)clangd / rust-analyzer / basedpyright / ts_ls / jdtls / solargraph / lua_ls …
自动格式化clang-format / rustfmt / ruff / prettier / stylua / rubocop …
代码检查clang-tidy / clippy / ruff / mypy / eslint / luacheck …
调试codelldb / debugpy …

特色快捷键

快捷键功能
<space>ft内置底部终端
<space>fT外部终端窗口(自动检测 gnome-terminal、konsole、alacritty、kitty、wezterm、foot 等终端模拟器)
<space>k编译并运行当前文件(外部终端执行)

兼容性:Linux(完全支持,自动识别 14 种终端模拟器)、macOS(通过 Terminal.app .command 临时脚本执行外部命令)、仪表盘显示 ARKVIM 渐变 ASCII 艺术字(配色自动匹配 cava 或 tokyonight 主题)。

# 安装(自动备份现有配置)
mv ~/.config/nvim ~/.config/nvim.bak
git clone https://github.com/missercatos/ARKVim.git ~/.config/nvim
 
# 启动 Neovim,lazy.nvim 自动安装所有插件
nvim

适合已有 Vim 基础、追求 LazyVim 生态、希望多语言开箱即用而又保留 Lua 定制能力的开发者。安装前需要 Neovim >= 0.9.0 和 git。


5.12 相关链接