工作区、Git 与改动
工作目录与多根工作区、文件面板里的文件树与可编辑文档、变更面板怎么比较、整仓提交。
工作目录
每个会话有自己的工作目录,Klaus 的文件操作和命令默认就在这里发生。挂了项目的会话,工作目录就是项目目录;没挂项目的普通对话用的是这条会话自己的文件夹(~/.klaus/sessions/<会话 id>/)。一个会话也可以同时挂多个根目录(多根工作区),常用的组合可以存成工作区方案下次直接套用;编辑工作区时可以在文件夹对话框里一次多选几个目录并入(方案内部按 id 管理,改名不会把旧方案弄丢)。
文件面板
右侧的「文件」面板(⇧⌘/Ctrl+E)列出这条会话工作目录里的文件,多根工作区会列出每个根。SSH 远程项目同样可用,读的是远端的文件。
- 文件树:按文件类型显示图标,目录点开时才加载。顶部的「筛选文件...」按名称、路径或字符顺序模糊匹配。键盘上,方向键移动和展开收起,Home / End 跳到首尾,F2 重命名,也可以右键重命名。文件树和预览区之间的分隔条可以拖动调宽,聚焦后也能用方向键调。每条会话分别记住自己的展开状态、选中文件和滚动位置。
- 单击预览,双击固定:单击文件在一个预览标签里打开,再单击别的文件会替换它;双击文件或开始编辑后,标签就固定下来不会被替换。
- 排除列表:「设置 → 偏好设置」最下面的工作区排除规则(每行一条 glob)决定文件树和筛选时跳过哪些路径,默认为空。搜不到本应存在的文件时先看这个列表。
直接编辑文件
Markdown 文件(.md、.markdown)默认用排好版的文档视图打开,也可以「查看源码」切到源码;其他可写的文本文件用源码编辑器打开。两种视图都能直接改,停止输入 3 秒后自动保存,状态显示「正在保存…」「已保存」。切换文件或视图时,光标、滚动位置和撤销记录都会保留,切换前也会先把未保存的修改存下来。
- 保存失败时草稿保留在编辑器里,显示「保存失败」并给出「重试保存」。
- 文件在你编辑期间被别的程序改了,Klaus 会暂停自动保存,提示「文件已在磁盘上更改,请选择保留的版本。」:选「使用磁盘版本」丢掉自己的修改,或「保留我的更改」覆盖磁盘上的内容。
- 二进制文件、过大被截断的文件和只读文件不能编辑;图片、音视频、PDF 这类直接用预览打开。
变更面板
「变更」面板看代码改了什么。顶部选「范围」:
- 分支(默认):从远端默认分支和当前分支的共同祖先,比较到你的工作区现在的状态,也就是这条分支整体相对主干改了什么。「比较基准」默认自动选择,也可以「指定引用」换成别的分支或提交。
- 未提交、未暂存、已暂存:对应 git 的三种未提交状态。
- 提交:看某一个提交的改动。
- 最近一轮:只看上一回合 Klaus 改了什么;会话涉及多个仓库时跨仓库汇总。
会话涉及多个仓库时,可以在「仓库」里选其中一个或「所有仓库」。分支、未提交、未暂存三种范围会把未跟踪的新文件也算进去。注意变更面板看的是仓库的真实状态,你自己手改的东西也会出现在里面,它不是「只属于 Klaus 的改动」的清单。改动文件特别多时会只给总体统计、不展开逐个文件。
每个回合结束后,对话里还有一张这一轮的文件改动卡:头部写「已编辑 N 个文件」和增删行数,下面列出文件(多文件默认显示 3 个,可以「再显示 N 个文件」),每行带增删数。点一行跳到变更面板里这一轮的那个文件,⌘/Ctrl 点击则直接打开文件;「查看变更」打开整轮的差异。这张卡只用来看,没有撤销按钮。
Git
- 客户端自己管列分支、切/建分支、以及切换前的未提交改动检查。更复杂的 Git 操作由 Klaus 用命令完成,走正常的权限确认;对还不是仓库的目录执行
git init也属于这一类——输入框上方不会替你自动初始化,但让 Klaus 初始化是可以的,它走命令加权限确认。 - 分支只在「单文件夹项目 + 已是 git 仓库 + 有当前分支」时出现在输入框上方。选中的是多根工作区(或工作区文件)时不给分支控件——一组目录没有单一的「当前分支」;这种目标下「工作树」选项同样不可用并注明原因。空仓库(init 过还没有提交)也没有分支可选。
- 切换分支前会先查会被检出覆盖的未提交改动:只有当 git 真的会拒绝这次切换时才弹确认,列出那些文件并给你「提交并切换分支」这条路;改动能原样带过去的(不冲突的编辑)不打扰你,直接切。
- 提交是整仓提交:先
git add -A再 commit。只有一处例外,就是上面「提交并切换分支」那一步——它只提交会被检出覆盖的那几个文件,剩下的改动照样留在工作区。提交前先在变更面板里看一眼是不是多了你不想带上的东西。提交信息可以让 Klaus 读着 diff 写一句,空信息会被拒。 - 仓库处于半途的 merge / rebase / cherry-pick / revert 状态时,Diff 和提交都直接拒——不会在一个没收尾的合并上再压一次提交。先把那个状态收尾。