容易混淆的问题
这一讲的坑大多不是「不会用」,而是把两个层次混成了一个:按键与动作、编辑器与语言服务、会话与进程、本地与远端。
按键与动作
Normal 模式的 x 删字符,Insert 模式的 x 输入字母 x,Visual 模式的 x 删选区。看到「按 x 没反应」先看左下角的模式,多半是停在 Visual 里。
| 写法 | 作用范围 | 典型场景 |
|---|---|---|
dw | 光标到下一个词首 | 删半个标识符 |
dd | 整行 | 删一行 |
D | 光标到行尾 | 删行尾注释 |
ciw | 当前词 | 改变量名 |
ci( | 括号内部 | 换函数实参 |
da' | 单引号字符串含引号 | 删字符串字面量 |
dw 删到下一个词首,dd 删整行,行尾空格的处理不同;改一整行用 cc 或 S,别用 dw 拼。
ciw 改光标所在的词,ci( 改最近一对括号里的内容。光标在参数中间时用前者,要换整个参数列表用后者,ci( 并不要求光标停在括号上。
工具分工
装了语言服务器还补全错,九成是它没看见你的环境。Python 指向了系统解释器,依赖不在搜索路径里,导入全红;C/C++ 缺 compile_commands.json,跳转随机失效。
| 工具 | 管什么 | 出问题的信号 |
|---|---|---|
| 格式化 | 排版 | 缩进、引号风格不一致 |
| linter | 可疑写法 | 未使用变量、空的 except |
| 类型检查 | 类型不匹配 | 参数类型对不上 |
三者可以都跑,但顺序有讲究:先格式化再 lint,反了会得到「改完又不合规」。CI 里跑的应该是同一条命令,别在编辑器里用一套规则、在流水线里用另一套。
补全、行内对话、agent 的权限依次放大。补全只能加字,行内对话能改选中块,agent 能写文件跑命令;判断该用哪个,看这次改动要不要留回滚点。
会话与配置
<C-b> d 是分离,进程继续跑;关掉终端窗口是客户端消失,session 同样还在;只有在 session 里 exit 或 tmux kill-session 才真的结束它。
改了 .zshrc 没生效,通常是没 source,或者改错了文件:登录 shell 读 .zprofile,交互式非登录才读 .zshrc。echo $0 输出带前导 - 就说明当前是登录 shell。
- 前缀可能被改过:
tmux show -g prefix查 - 嵌套 tmux 里要连按两次前缀
- 按键表可以用
tmux list-keys全文搜
tmux show -g prefix
tmux list-keys | grep -i prefix本地与远端
远端开发时文件在远端,终端在远端,语言服务器在远端,只有画面在本地。所以本地 pip install 不会让远端补全变好,「我本地能跑」也不构成证据。
判断方法很直接:在集成终端里 pwd、hostname、which python,三个输出立刻告诉你站在哪台机器上。
- 本地改的文件没同步:确认打开的是远端窗口,不是本地副本
- 远端扩展列表是空的:扩展装在远端,不是本地
- 端口访问不到:检查转发规则,而不是防火墙