Vim + Claude Code:纯键盘终端工作流
面向 Vim 重度用户和 SSH 远程开发场景的 Claude Code 完整工作流,包含 tmux 三 pane 布局、shell 别名封装、Vim 宏批量处理、日志分析、配合 fzf/ripgrep/fd、vim-fugitive 配套等实战。
Vim 重度用户对 Claude Code 的需求和 GUI 编辑器用户完全不一样:不要 GUI diff、不要侧边栏、不要弹窗。要的是「在 tmux 一个 pane 里跑 claude,左 pane 跑 vim,下 pane 看日志,全程不离开键盘」。本文按这个目标搭一套从布局到 shell 别名到 Vim 宏的完整工作流,特别适合 SSH 远程开发、服务器运维、纯终端环境。
推荐布局:tmux 三 pane
整个屏幕分三块:
+----------------------------+----------------------+
| | |
| Vim/Neovim (左 60%) | Claude Code (右 40%)|
| | |
| | |
| | |
+----------------------------+ |
| Shell / 日志 (下方 30%) | |
| | |
+----------------------------+----------------------+
为什么这个分法:
- 左 60% 给 Vim:代码需要看清,宽度优先
- 右 40% 给 Claude Code:对话流文字密度低,窄一点不影响读
- 左下 30% 跑测试 / 看日志 / 临时 grep —— 这部分不能没有,因为你会频繁需要在 Vim 之外跑命令
.tmux.conf 模板
放在 ~/.tmux.conf:
# 前缀键改成 Ctrl-A (比默认 Ctrl-B 更顺手)
unbind C-b
set -g prefix C-a
bind C-a send-prefix
# 鼠标支持 (复制粘贴时方便)
set -g mouse on
# 256 色 + true color
set -g default-terminal "tmux-256color"
set -ga terminal-overrides ",*256col*:Tc"
# 历史缓冲增大(Claude Code 输出多)
set -g history-limit 50000
# 索引从 1 开始(数字键好按)
set -g base-index 1
setw -g pane-base-index 1
# 用 hjkl 切 pane (vim 风格)
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R
# Alt + hjkl 不用 prefix 直接切(更快)
bind -n M-h select-pane -L
bind -n M-j select-pane -D
bind -n M-k select-pane -U
bind -n M-l select-pane -R
# 一键开发布局
bind D source-file ~/.tmux/dev-layout.conf
# 状态栏精简
set -g status-style "bg=default fg=white"
set -g status-left "#[fg=green]#S "
set -g status-right "#[fg=yellow]%H:%M "
一键开发布局脚本
放在 ~/.tmux/dev-layout.conf:
# 当前窗口先关掉所有 pane(保留主 pane)
kill-pane -a -t 0
# 把当前 pane (左主) 拆出右侧 40%
split-window -h -p 40
# 焦点回到左主 pane
select-pane -t 0
# 把左主拆出下方 30%
split-window -v -p 30
# 右侧 pane 启动 claude
select-pane -t 2
send-keys 'claude' Enter
# 左下 pane 准备好
select-pane -t 1
send-keys 'clear' Enter
# 焦点放回左上(vim 区)
select-pane -t 0
send-keys 'vim .' Enter
进入项目目录后,在 tmux 里按 Ctrl-A D 就直接进入「Vim + Claude + Shell」三 pane 状态。
SSH 远程服务器跑 Claude Code
好处
- 算力解耦:本地是 MacBook Air 也行,重活在服务器跑
- 网络优势:服务器到 Anthropic API 通常比家用宽带稳定
- 环境一致:跑测试的 Linux 环境就是部署环境
- 长任务不怕本地睡眠:tmux 包一层,跑通宵也行
完整安装与登录流程
# SSH 连上服务器
ssh user@server
# 装 nvm + Node
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
source ~/.bashrc
nvm install --lts
# 装 Claude Code
npm install -g @anthropic-ai/claude-code
# 在 tmux 里启动(很重要!)
tmux new -s work
claude /login
/login 会输出一个 URL,复制到本地浏览器打开授权,授权后会显示一段 token,复制回 SSH 终端粘贴。
断网恢复
SSH 断了不影响远端 tmux session:
# 重新连上
ssh user@server
# 重新接回 session
tmux attach -t work
Claude Code 还在跑(如果有任务在跑),输出全程保留。
Token 安全
不要做:把 API key 直接写在 ~/.bashrc 提交进 dotfiles 仓库。
推荐做法:
# 单独文件,权限 600
echo 'export ANTHROPIC_API_KEY="sk-ant-xxx"' > ~/.config/claude-env
chmod 600 ~/.config/claude-env
# .bashrc 引用
echo '[ -f ~/.config/claude-env ] && source ~/.config/claude-env' >> ~/.bashrc
dotfiles 仓库 .gitignore 加上 claude-env。
常见坑
| 坑 | 现象 | 解法 |
|---|---|---|
| 服务器没装 git | Claude Code 想看 git log 报错 | apt install git |
| 服务器 ulimit 太低 | 大项目读文件失败 | ulimit -n 4096 加到 .bashrc |
| 远端字符集不对 | 输出乱码 | export LANG=en_US.UTF-8 |
| OAuth 浏览器流程在 SSH 用不了 | 没法点链接 | 复制 URL 到本地浏览器,把 token 粘回去 |
| 跑了几小时 token 配额用完 | 任务卡住 | 切 API key / 检查订阅状态 |
Shell 别名 / 函数封装
把高频用法压成一个字母的命令,节奏会快很多。放在 ~/.bashrc 或 ~/.zshrc:
# 最基础:缩短 claude
alias cc='claude'
# 一次性问,不进 REPL
alias ccp='claude -p'
# 看某个文件
ccfile() {
claude "看一下 $1"
}
# 解释一段命令的输出(管道用)
ccexp() {
claude -p "解释一下这段输出: $(cat -)"
}
# 用法: cat error.log | ccexp
# 找文件然后让 Claude 处理
ccgrep() {
rg -l "$1" | xargs -I {} claude "看看 {} 里和 '$1' 相关的代码做了什么"
}
# git diff 后让 Claude 写 commit message
ccmsg() {
local diff=$(git diff --cached)
if [ -z "$diff" ]; then
echo "Nothing staged."
return 1
fi
claude -p "根据这个 git diff 写 conventional commits 格式的提交信息(中文),只输出一行:
$diff"
}
# 跑测试失败时让 Claude 看错误
cctest() {
npm test 2>&1 | tee /tmp/test-output.log
if [ $? -ne 0 ]; then
claude "测试失败了,输出在 /tmp/test-output.log,看一下并修复"
fi
}
# 看 PR diff 写 review
ccreview() {
local target="${1:-main}"
git diff "$target"...HEAD | claude -p "review 一下这个 PR diff,指出潜在问题:
$(cat -)"
}
# 进项目根目录
ccroot() {
cd "$(git rev-parse --show-toplevel)" && claude
}
加完后 source ~/.bashrc。日常工作流变成:
ccfile src/api/auth.ts # 问一个文件
ccp "next.js app router 怎么传 cookie?" # 一次性问
cctest # 跑测试,失败让 AI 修
git add . && ccmsg | git commit -F - # AI 写提交信息后提交
Vim 宏 + Claude Code 批量处理
Vim 宏(q)擅长结构化重复操作;Claude Code 擅长一次写好一个模板。组合起来:先让 Claude Code 把一个文件改对,再用 Vim 宏复制到其他文件。
实例:给 30 个 API handler 加上日志
场景:项目里 app/api/ 下有 30 个 route.ts,要在每个 POST handler 开头加 logger.info({ path, body }, 'request received')。
第 1 步:让 Claude Code 改一个作为模板
claude
请只修改 app/api/users/route.ts。
在 POST 函数体的最开头加一行:
logger.info({ path: req.nextUrl.pathname, body }, 'request received')
注意 body 可能还没解析,按需调整。
不要改其他文件。
Claude 改完后看 diff,理解清楚改了什么。
第 2 步:在 Vim 里录制宏
打开第二个文件,光标定位到 POST 函数大括号开头:
qa " 开始录制到寄存器 a
/export async function POST<CR>
$% " 跳到大括号配对
O " 在上方开行
logger.info({ path: req.nextUrl.pathname, body }, 'request received')<Esc>
ZZ " 保存退出
q " 结束录制
第 3 步:批量应用宏
# 在终端
for f in app/api/*/route.ts; do
vim -c "normal @a" -c "wq" "$f"
done
或者在 Vim 里用 arglist:
:args app/api/*/route.ts
:argdo normal @a | update
第 4 步:让 Claude Code 检查
我刚批量改了 app/api/ 下所有 route.ts,
每个 POST handler 开头加了一行 logger.info。
请检查改动是否合理,有没有漏掉的、加错位置的、需要导入 logger 的。
Agent 会扫所有文件,可能发现「7 个文件还没 import logger」「2 个文件 body 是在更后面才解析的」。让它修完收尾。
为什么不直接让 Claude Code 一次改 30 个?
可以,但有两个考量:
- 30 个文件的 token 不便宜,宏改完事
- 复杂模式 Vim 宏比 AI 准(AI 偶尔加错位置)
简单结构化用宏,AI 看末尾,是最经济的搭配。
服务器管理场景
Claude Code 在 SSH 终端里有几个独门用法:
日志实时分析
tail -f /var/log/nginx/error.log | claude -p "实时看这个日志,发现异常立刻指出(500 / 超时 / OOM 等),其他不要输出"
注意 -p 模式下 stdin 输入会一次性吃完才回答。要真正实时分析,更好用 tee 加批量处理:
tail -F /var/log/app.log | tee -a /tmp/applog | awk 'NR%100==0' | while read line; do
echo "$line" | claude -p "这一行有没有异常? 一句话回答"
done
或者每隔一段时间总结一次:
while true; do
tail -n 500 /var/log/app.log | claude -p "总结过去 500 行日志的异常模式,3 句话"
sleep 300
done
配置文件审查
claude "review 一下 /etc/nginx/nginx.conf,
关注:
- worker_processes / worker_connections 是否合理(CPU 8 核,内存 16G)
- 安全相关 header
- gzip / brotli 配置
- 有没有该加的 limit_req"
Shell 脚本调试
bash -x ./deploy.sh 2>&1 | tee /tmp/deploy-trace.log
# 失败后
claude "/tmp/deploy-trace.log 是 bash -x 的输出,
脚本在 line 47 附近失败了,看看是什么问题"
一次性问命令
# 不进 REPL
claude -p "ufw 怎么允许 8080 从特定 IP 段?"
# 给它管道输入
ps auxf | claude -p "找出占内存最多的 5 个进程,按层级解释"
# 系统状态快照
(uptime; free -h; df -h; ps auxf | head -30) | claude -p "评估这台机器当前负载是否健康"
配合 fzf / ripgrep / fd
这三件套是终端工作流的灵魂,Claude Code 接进来效果更好。
fzf:交互式选文件给 Claude
# 选一个文件让 Claude 解释
ccpick() {
local file=$(fzf --preview 'bat --color=always {}')
[ -n "$file" ] && claude "解释一下 $file 这个文件做了什么"
}
# 选多个文件做对比
cccompare() {
local files=$(fzf -m --preview 'bat --color=always {}')
[ -z "$files" ] && return
claude "对比这些文件: $(echo $files | tr '\n' ' ')"
}
ripgrep:grep 后让 Claude 总结
# 搜函数定义后让 Claude 解释
ccfunc() {
local results=$(rg -n "^(function|export function|const \w+ =)" --type ts)
echo "$results" | claude -p "这里是项目所有顶层函数定义,按职责归类,做个目录"
}
# 找 TODO 后让 Claude 排优先级
cctodo() {
rg -n "TODO|FIXME|XXX" | claude -p "这里是项目所有 TODO,按重要性排序,估算每个工作量"
}
fd:找文件交给 Claude
# 找最近改过的文件,让 Claude 总结改了啥
ccrecent() {
fd --type f --changed-within 1d -e ts -e tsx | head -20 | xargs -I {} echo {} | claude -p "这些是最近 24 小时改过的文件,结合 git log 看一下整体改了什么"
}
vim-fugitive 看 Claude Code 的改动
Claude Code 改完文件后,不要直接在 vim 里继续打字——先看一遍 diff。vim-fugitive 是首选工具。
安装(如果还没装)
" ~/.vimrc 或 init.vim
Plug 'tpope/vim-fugitive'
Claude 改完后审查流程
:Git status " 看哪些文件被改了
:Git diff " 看所有 unstaged 改动
或者更直观的:
:Gvdiffsplit " 当前文件和 HEAD 的对比,左右分屏
发现 Claude 改得不对的地方,可以用 :Gread 撤销当前文件改动,或者用 :diffget / :diffput 选择性接受。
暂存 + 提交 + 让 Claude 写信息
:Git add -u " 暂存所有改动
:!ccmsg " 调用前面定义的 shell 函数
" ccmsg 输出会显示在 vim 命令行
:Git commit -m "<paste here>" " 用生成的信息提交
或者更顺:
# 终端 pane 里
git add -u
ccmsg | git commit -F -
全流程模板(Vim + Claude + Git)
1. 在 Vim 写代码 / 切到 Claude pane 让它改
2. 切回 Vim,:Git status 看动了什么
3. :Gvdiffsplit 逐文件 review
4. 不满意的让 Claude 再改一遍 ("第 N 行改回去")
5. :Git add -u
6. 终端跑 ccmsg | git commit -F -
7. :Git push
整个流程不离开 tmux,不动鼠标。
配合 Vim 插件生态
CoC / coc.nvim
如果用 CoC(基于 LSP),让 Claude 改完后 buffer 不会自动重载。加这个 autocmd:
" ~/.vimrc
set autoread
au CursorHold,CursorHoldI * checktime
au FocusGained,BufEnter * :checktime
Treesitter
Neovim 用 Treesitter,让 Claude 改完后高亮可能错乱,重新 :TSBufEnable 即可。
copilot.vim
如果同时装了 GitHub Copilot:Copilot 管 vim 里的逐行补全,Claude Code 管终端里的多步任务,井水不犯河水。两者付费独立。
实战搭配建议
最后一条主线:
- 进项目 →
tmux attach -t work或新开 + 一键布局 - 要看一个文件 → vim 里看 /
ccfile让 Claude 解释 - 要改一段代码 → vim 直接改(你比 AI 知道想要什么)
- 要改 10+ 文件 / 跨文件 feature → 切 claude pane,描述任务
- AI 改完 review → 切回 vim,
:Git status+:Gvdiffsplit - 跑测试 / 跑命令 → 左下 shell pane
- 提交 →
ccmsg | git commit -F -
整套流程的核心是:**Vim 干 Vim 擅长的(精确编辑、看代码、跳转);Claude Code 干 AI 擅长的(理解意图、批量改、跑测试);tmux 把两者粘在同一个屏幕上。**全程不动鼠标,SSH 远程也一样顺手。
相关阅读
其他编辑器工作流:
- VS Code + Claude Code:远程开发与 Dev Container
- Cursor + Claude Code:日常开发完整工作流
- WebStorm + Claude Code:JS/TS 项目实战工作流
- Neovim + Claude Code:Lua 生态深度集成
- Zed Channel 多人协作开发:搭配 Claude Code 实战
相关编辑器安装教程: