# 文件浏览与代码编辑

::: tip 版本说明
文件树与代码编辑页从 1.11.0 起提供。
:::

侧边栏顶部的「文件」标签页用来浏览当前工作区与当前容器的文件，点文件默认打开全屏的代码编辑页（图片与安装包除外，见下文「图片与安装包」）。本地工作区和远程 SSH 工作区都支持，读写方式按当前模式自动决定。

## 浏览文件

「文件」页是一棵就地展开的缩进文件树，有**两个根**：

- **`workspace`**：当前工作区，默认展开。
- **当前容器**：名称就是当前选中的容器（如「内置 Alpine」），图标与设置里的「容器与镜像」列表一致。展开后是容器的整个文件系统（`/etc`、`/root`、`/usr` 等），默认折叠。本地 PRoot 容器里看到的是容器内的文件，远程 SSH 下看到的是远程服务器上的文件。

两个根各自可折叠展开，右上角有一个刷新按钮。

- 点目录在原地展开或折叠，点文件直接打开编辑页（图片、安装包见下文「图片与安装包」）——无需逐级进入与返回。
- 目录排在文件前面，同类按名称排序。
- 文件按类型显示不同图标（代码、脚本、配置、文档、图片、音视频、压缩包等），采用与 App 全局一致的单色线性图标并跟随主题色着色。
- 着色规则类似 VS Code：`.` 开头的隐藏文件显示为浅色弱化，被工作区根 `.gitignore` 命中的条目显示为橙色（只看工作区根目录的 `.gitignore`，不解析子目录里的；容器里的文件不受影响）。
- 路径很深或文件名很长时不受影响：整棵树共享一个横向滚动，名称不会截断成省略号，左右滑动即可看全。
- 你展开或折叠过的目录会**按工作区记住**，关掉 App 再打开、或者切走再切回同一个工作区，都会恢复上次的展开状态。
- 容器根只在展开时才去读目录；读不到（容器未安装、远程未连接）时该行会标红，不影响工作区那棵。

本地模式下，AI 文件工具支持通过符号链接读取和写入文件，包括指向容器绝对路径的链接。读取或写入会访问链接目标，删除、重命名或移动链接本身则保留目标内容；目标不存在时读取会提示文件不存在，循环链接会报错。项目授权配置目录使用此类链接时，也能读取和保存规则。

AI 局部修改文件时兼容 Linux 常用的 LF 与 Windows 常用的 CRLF 换行，不需要先转换整份文件。替换内容沿用目标区域的换行格式（目标区域没有换行时采用文件的换行格式），未修改的区域保持原样。缩进和其他字符仍需准确匹配；如果 AI 提示找不到原文，让它重新读取对应片段后再修改。

## 从系统文件选择器访问

在支持系统文件选择器的应用中选择 Muse，可以访问 `projects`（本地项目）和 `muse`（AI 配置）两个目录。Muse 顶层只用于展示入口，不能在此新建或删除；进入子目录后可按授权读写文件。指向共享范围外的符号链接不会展示，也不能通过它访问其它内部文件。

## 图片与安装包

文件树里的**图片**（png / jpg / jpeg / gif / webp / bmp）点击后进入应用内的全屏查看器，可以捏合缩放、双击放大，与聊天区看图一致；**APK / APKS / XAPK** 点击后直接调起系统安装器（首次会引导你开启「允许安装未知应用」）。这两类都不会进入代码编辑器，其余文件仍照常打开编辑页。

## 从对话中打开文件

AI 在对话中引用代码时会把路径写成可点击的链接（带下划线的 `文件路径:行号`）。点击这类链接会直接打开编辑页，带行号的还会自动滚动到那一行，并使其**尽量停在屏幕中间**（目标行靠近文件开头或末尾时受滚动范围所限会贴边）。打开后你一滑动，自动定位就交还给你，不会再把画面拽回目标行。

支持工作区内的文件、AI 配置目录（`~/.muse/...`）以及容器系统文件（`/etc/...`、`/root/...`），远程 SSH 工作区下同样可以打开。指向普通网址的链接不受影响，仍然用系统浏览器打开。

点到不存在的路径、目录，或超过大小上限的文件时，编辑页会给出对应的失败提示。

## 列表刷新

本地工作区下文件变动会**自动刷新**，不限于 AI 改的——你在终端里执行命令、或用其他 App 改动同样会被感知。

它监听的是工作区根、容器根（展开时）和当前所有**已展开**的目录，不递归整棵树，因此大仓库下也不会占用大量系统资源；折叠某个目录后就不再监听它。

另外两个刷新时机：侧边栏每次出现都会重读一次（宽屏常驻侧栏下，每次从其它页面回到聊天页也算）；工作区根那行右侧的刷新按钮可随时手动重读。

远程 SSH 工作区无法监听远程文件系统的变动，**只能**依靠这两个时机刷新，发现列表和实际不符时点击刷新按钮。远程模式下读目录要走网络，可能有短暂的加载状态，失败时会在列表位置显示具体原因。

## 新建、重命名、删除

**长按目录行**（工作区根、容器根或任意子目录），从底部菜单里选「新建文件」或「新建文件夹」，新建的条目落在该目录下。如果长按的是折叠状态的目录，会先自动展开好让你看到结果。

名称只能是单个条目名：含 `/`、`\` 或是 `.`、`..` 时确认按钮不可点击——避免误创建到其他目录。同名条目已存在或目录不可写时会提示失败，不会覆盖原有文件。

**长按文件或子目录行**可以重命名和删除（两个根节点都只能新建）：

- **重命名**：只在同一目录内改名，不做跨目录移动。
- **删除**：文件直接删除；文件夹会连同里面全部内容递归删除，所以会先弹确认框。

::: danger 删除不可撤销
删除不进回收站，也不受检查点保护。确认前请考虑清楚，尤其是删除文件夹。
:::

## 复制、剪切与粘贴

长按文件或子目录选择「复制」或「剪切」，再长按目标目录选择「粘贴到此处」。目标已存在同名条目时，会先询问是否覆盖；覆盖会替换原有条目及其内容，不可撤销。

不能在原目录用粘贴覆盖源条目，也不能把文件夹复制或移动到自身及其子目录。此类操作会被拒绝，源文件保持不变。

## 代码编辑页

点文件后侧边栏收起，进入全屏编辑页。

顶部左上是返回，右上依次是撤销、重做、保存、设置。撤销和重做在没有可操作内容时置灰，保存按钮只在有未保存改动时可点。

- **撤销按输入停顿分步**：连续快速输入算一步，停顿约半秒后再输入即算新的一步。一路撤销回打开时的样子后，文件名前的星号消失、保存按钮置灰，此时退出也不会再提示是否保存。
- 打开 Markdown 文件时，撤销按钮左边会多一个**预览切换**按钮，点击切到渲染效果，再点切回源码。预览和源码共用同一编辑状态，切换不会丢失未保存的修改。
- 预览是完整的 Markdown 渲染：**文档里内嵌的 HTML（居中标题、图片、表格排版、徽章等）会照常显示**，代码块带语法高亮，配色跟随应用深浅主题。文档里的相对路径图片（如 `docs/a.png`）会从当前工作区读取，远程工作区也能显示；网络图片（徽章、在线图表等）需要联网才能加载。预览页内点击链接不会跳转，避免离开当前文档。
- 预览不含 LaTeX 公式渲染，含公式的文档切回源码查看。
- 导航栏下面有一条文件名小栏：左边是文件名（有未保存改动时前面加星号），右边是光标的行列位置和文件编码。
- **底部快捷符号栏**可横向滚动，最左是光标左右移动和缩进（Tab），后面是编程常用符号（括号、引号、运算符、`;` `:` `|` `&` 等），点击即在光标处插入。软键盘弹出时符号栏会浮在键盘上方。
- 有未保存改动时，点返回或按系统返回键会先弹确认框，可以选「不保存」或「保存并退出」。
- **滚到文件末尾还能再上滑半屏**：最后几行不会紧贴屏幕底边，方便在文件结尾处编辑。

### 语法高亮

内置了这些语言：Kotlin、Java、Python、JavaScript/JSX、TypeScript/TSX、JSON/JSONC、YAML、Shell、Go、Rust、C/C++、CSS、XML、HTML、Markdown、PHP、Lua。`.kts` 按 Kotlin 高亮。未识别的类型按纯文本显示，不影响编辑。

配色用的是 VS Code 默认主题（深色 Dark+ / 浅色 Light+），随应用主题自动切换，编辑过程中切主题不会丢失未保存的内容。

### 编辑器设置

点右上角设置按钮进入独立的设置页，改动即时生效并记住，下次打开沿用：

- **字体大小**：滑块调节。
- **自动换行**：开启后长行折行显示，不再横向滚动。
- **显示缩进参考线**：默认开启。
- **显示自动换行箭头**：自动换行开启时在折行处画指示箭头，默认关闭。
- **显示空白符号**：把空格、Tab、换行可视化，默认关闭。

### 保存与并发

保存是**整份覆盖写回**，成功后提示「已保存」。

::: warning 不做外部并发检测
AI 工具或终端可能同时在改同一个文件，而保存会直接用编辑器里的内容覆盖，不会提示文件已被外部改动。如果你和 AI 可能同时动同一个文件，先让一方改完再动手，避免互相覆盖。
:::

### 限制

- **文件大小上限 2 MB**。超过上限的文件不打开——内容需要整份读进内存，再大会明显卡顿甚至崩溃。
- **不支持二进制文件**。打开时会嗅探文件开头，识别为二进制（图片、可执行文件、压缩包等）会直接提示，不会把乱码当文本载入。

## 工作区文件在手机上的位置

「文件」页浏览的是工作区内容，而工作区文件、AI 配置都存放在应用私有目录里，普通文件管理器默认看不到。想用外部工具打开或备份时，有几种办法：

**文件管理器挂载（推荐）**：App 实现了标准的 DocumentsProvider，可使用手机自带的「文件」管理器或第三方文件管理器（MT 管理器、Solid Explorer 等）找到并挂载 App 的私有根目录。挂载后能看到：

- `projects/`：工作区项目。通过「添加外部工作区」加进来的外部工作区不在这里，它们在你自行选择的设备目录下。
- `muse/`：对应容器内的 `~/.muse`，里面有 `skills/`（技能）、`docs/`（文档）、`mcp.json`（MCP 配置）等。

以 MT 管理器为例的挂载步骤：打开 MT 管理器 → 点左上角菜单（三横线）→ 侧边栏右上角的三个点 → 「添加本地存储」→ 系统文件选择器打开后点左上角三个点、选「Muse」→ 点底部「使用此文件夹」。

**内置终端**：切到终端页，`cd ~/.muse` 直接查看，用 `vi` 或 `cat` 查看编辑。

**交由 AI 处理**：AI 运行在容器里，你可以说“把 `~/.muse/mcp.json` 打印出来查看”或“在 `~/.muse/skills/` 下写一个新技能”。

**Root 设备**：直接进 `/data/data/com.muse/files/`（部分系统等价路径是 `/data/user/0/com.muse/files/`）。其中 `projects/` 是工作区根，`muse/` 对应 `~/.muse`，`rootfs/` 是容器系统。注意 debug 构建的包名是 `com.muse.debug`，两者私有目录完全隔离。
