Claude CodeVim工作流终端SSH

Vim + Claude Code:纯键盘终端工作流

面向 Vim 重度用户和 SSH 远程开发场景的 Claude Code 完整工作流,包含 tmux 三 pane 布局、shell 别名封装、Vim 宏批量处理、日志分析、配合 fzf/ripgrep/fd、vim-fugitive 配套等实战。

· 阅读约 17 分钟

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

好处

  1. 算力解耦:本地是 MacBook Air 也行,重活在服务器跑
  2. 网络优势:服务器到 Anthropic API 通常比家用宽带稳定
  3. 环境一致:跑测试的 Linux 环境就是部署环境
  4. 长任务不怕本地睡眠: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

常见坑

现象解法
服务器没装 gitClaude 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 个?

可以,但有两个考量:

  1. 30 个文件的 token 不便宜,宏改完事
  2. 复杂模式 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 管终端里的多步任务,井水不犯河水。两者付费独立。


实战搭配建议

最后一条主线:

  1. 进项目tmux attach -t work 或新开 + 一键布局
  2. 要看一个文件 → vim 里看 / ccfile 让 Claude 解释
  3. 要改一段代码 → vim 直接改(你比 AI 知道想要什么)
  4. 要改 10+ 文件 / 跨文件 feature → 切 claude pane,描述任务
  5. AI 改完 review → 切回 vim,:Git status + :Gvdiffsplit
  6. 跑测试 / 跑命令 → 左下 shell pane
  7. 提交ccmsg | git commit -F -

整套流程的核心是:**Vim 干 Vim 擅长的(精确编辑、看代码、跳转);Claude Code 干 AI 擅长的(理解意图、批量改、跑测试);tmux 把两者粘在同一个屏幕上。**全程不动鼠标,SSH 远程也一样顺手。


相关阅读

其他编辑器工作流:

相关编辑器安装教程: