Skip to content
| Marketplace
Sign in
Visual Studio Code>Other>ADrive StudioNew to Visual Studio Code? Get it now.
ADrive Studio

ADrive Studio

lupee

|
1 install
| (0) | Free
Browse your Aliyun Drive (alipan.com) in the VS Code sidebar like Finder / File Explorer: preview images and videos in place, open other files as read-only copies, upload and download through a transfer queue
Installation
Launch VS Code Quick Open (Ctrl+P), paste the following command, and press enter.
Copied to clipboard
More Info

ADrive Studio

像 macOS Finder / Windows 资源管理器一样,在 VS Code 侧边栏中浏览阿里云盘(alipan.com)。目录浏览的做法与同目录下的 File Studio(file-studio-plugin)相同,连接阿里云盘的做法与 x-cmd(osclass4/osclass4-adrive-client)相同。

功能

  • 活动栏新增「ADrive Studio」视图。未登录时视图里只有一个图标、一句登录提示和「扫码登录」按钮;登录后顶上是一条页签(与 SSH Studio 同款):文件、笔记。当前页签在视图折叠再展开后保持
  • 「文件」页是阿里云盘的文件树:
    • 备份盘(默认盘,默认展开)
    • 资源盘(账号有资源盘且不同于备份盘时才显示)
    • 顶层盘的行尾淡淡地写着账号名,文件的行尾写着大小
  • 侧边栏只有一个视图(工具栏与文件树之间没有可拖拽的分割线),视图标题栏里不放任何按钮:
    • 工具栏一行:第一个带文字的按钮 添加文件夹,在当前选中的目录下新建(选中文件时取其所在目录,未选中时为备份盘的根),新建后展开到新条目并选中
    • 后四个只有图标的按钮:刷新(重新读取云端内容并重新取盘列表)、全部折叠、传输(上下箭头,打开传输面板;有正在上传的任务时向上的箭头变绿、有正在下载的时向下的变绿,暂停的不算)、设置(齿轮),悬停显示名称
    • 齿轮菜单:最上面是账号的空间用量(「已用 X / 共 Y(N%)」、一条用量条、「剩余 Z」;用到九成以上用量条变红。是备份盘与资源盘合在一起的账号总量——开放平台只给总量,不分盘;打开菜单时查一次,30 秒内再开用查过的);退出登录(行尾附注账号名;未登录时是扫码登录);清理已下载的文件缓存;清除云盘中的修饰文件;「界面语言」是二级菜单,行尾显示当前语言,展开后列出「跟随 VS Code」与六种语言,当前设置打勾,点选即切换
  • 界面语言支持中文、English、Deutsch、Français、日本語、한국어,默认跟随 VS Code 的显示语言,选择记录在配置文件里(见下文)。命令面板中的命令标题由 VS Code 按其显示语言渲染,不受此设置影响
  • 文件树由插件自己绘制,图标为统一的线条图标(不跟随 VS Code 的文件图标主题)。文件按扩展名显示易于辨认的类型图标并着色:网页 < >(橙)、XML(蓝)、JSON { }(黄)、CSS { }(蓝)、YAML 列表(紫)、Markdown M↓(蓝)、PDF(红)、Word W(蓝)、PowerPoint P(橙)、Excel / CSV 表格(绿)、图片(紫)、音频(绿)、视频(红)、压缩包(黄)、代码 </>(按语言着色)、配置文件、字体;未识别的扩展名用普通文件图标。备份盘根目录下的 .notes 文件夹画成红色——那是「笔记」页的笔记本(见下),一眼认得出来,别当普通目录随手改动;资源盘里、子目录里同名的文件夹不算
  • 鼠标放到行上时,行尾出现动作按钮:目录是上传、下载、复制路径;文件是下载、复制路径。顶层的盘只有上传(可以往盘的根传,但不整个下)。复制的是云端路径(如 /backup/photos)
  • 图片、视频显示缩略图:云端在列目录时就给了缩略图地址,图片和视频的行图标直接换成缩略图(裁成方的、圆角),鼠标划过树不弹任何浮层。缩略图地址带签名、约 15 分钟有效,过期后会把所在目录重读一次换新地址,仍然取不到就换回类型图标。只加载看得见的那些行(loading="lazy")
  • 目录内容按需读取,展开时才加载;收展状态、选中项和滚动位置在视图折叠再展开后保持
  • 单击图片(png / jpg / gif / webp / bmp / ico / avif)在编辑器区的预览面板里直接显示,本地不留副本:图片走云端的下载地址由页面自己加载,原图到位之前先拿缩略图垫着(压一点模糊),点图片在「缩到装得下」与「原始尺寸」之间切换
  • 单击视频(mp4 / m4v / webm / mov / ogv)在同一个面板里播:直接放云端的原文件(对象存储支持 Range 请求,所以能边下边播、能拖进度条),缩略图当封面,不自动播也不预加载整个文件。看的是原画,走多少流量就是多少;mkv / avi / wmv / flv 这些容器 Chromium 不认(哪怕里面是 H.264),仍旧按下面那条走
  • 预览面板只有一个,再点别的图片 / 视频就换掉里面的内容,焦点始终留在侧边栏,可以连着点着看。下载地址约 15 分钟有效,过期后自动换新的接着看(长视频看到一半也能这样续下去)
  • 单击其他文件(含 svg、heic、tiff 这些网页显示不了的图,以及 mkv、avi 这些放不了的视频)即下载到本地缓存(~/.x1/adrive-studio/cache/),然后在当前 VS Code 窗口中打开。打开的是只读副本(在本次会话里设为只读),改动不会传回云盘。同一版本(file_id 与 content_hash 都没变)第二次打开直接用缓存;超过 50 MB 的文件先弹确认框。单击目录展开 / 折叠
  • 键盘:上下键移动,右键展开、左键折叠或跳到父目录,Enter 打开文件或切换目录,Home / End 跳到首尾,Delete(macOS 也可 ⌘⌫)删除,F2 重命名
  • 预览面板开着的时候,用键盘在树里上下移动,走到哪张图片 / 哪个视频它就换成哪个(按住方向键连着走时只认停下来的那一个,中间经过的不去要地址)。面板没开就不管——键盘翻目录不会突然弹出面板;移到不能预览的条目上,面板里保持上一个不动
  • 右键菜单:在目录上新建文件夹、上传…、下载…,下面一组「视频截图」「视频预览」「图片预览」「重复校验」(见下文);在文件上打开、下载…,视频文件还有「视频截图」;在任意条目上「复制路径」;在顶层盘之外的任意条目上「重命名」「删除」
  • 删除前先弹出确认框,确认后移入阿里云盘的回收站(可在阿里云盘里恢复),不做永久删除。命令面板里的「删除」对当前选中项生效
  • 清除云盘中的修饰文件:齿轮菜单里的一项,范围是整个云盘(备份盘,账号有资源盘的话也一起),不针对某个目录。先弹确认框说清楚要删哪些,确认后用全盘搜索把 .DS_Store 与 ._ 开头的文件一次找出来(openFile/search,一页 100 条),再并发移入回收站。搜索是为了少发请求:逐目录爬几千个文件夹很容易撞上 429,而 429 会让插件里所有在途请求一起等,看着就像卡死;搜索用不了会自动退回逐目录爬,只是慢些。删除只能一个一个发——开放平台没有批量接口(PDS 的 /v2/batch 只在企业版上,这边几个候选路径全是 404,2026-09-08 实测),所以靠并发提速:实测只读并发 8、写入并发 6 都不会 429,这里用 6,真撞上限流会当场把并发收到 2。这些是 macOS 的 Finder 目录设置与扩展属性(AppleDouble),除了占地方没有别的用处;本插件上传时已经不会带上它们,这个功能是给以前用别的方式传上去的存量文件用的。搜索是「包含」匹配,回来的结果里名字中间带 ._ 的普通文件会被滤掉;目录一概不动——万一真有目录叫 ._something,它和里面的东西都不会被删。中途随时可以取消(已经删掉的不会退回来),真撞上限流时进度里会写明「云端限流,等待 N 秒…」,不是卡死

笔记

「笔记」页把备份盘根目录下的 .notes 当作笔记本(没有就在第一次切到这一页时自动建出来),结构固定两层:

/.notes/<分类>/<笔记>/index.md          正文(markdown)
/.notes/<分类>/<笔记>/image-….png       正文里插的图片,与 index.md 同级,正文里用相对路径引用
/.notes/<分类>/<笔记>/<文件名>           正文里插的附件,保留原来的文件名,正文里是指向它的相对链接
/.notes/<分类>/<笔记>/index.pdf         工具栏上「PDF」生成的 PDF,每生成一次换掉上一份
/.notes/<分类>/conf.yaml                这个分类在树里的显示样式(右键「设置」写的,见下)
  • 树里只显示两层:分类(.notes 下的文件夹,只有一层)与笔记(分类下的文件夹,显示文件夹名);笔记文件夹里面的东西不显示,分类里零散的文件也不算笔记。分类行尾淡淡地写着笔记数,鼠标放上去出现「添加笔记」按钮。笔记名字后面淡淡地写着创建时间;笔记文件夹里有 index.pdf(工具栏「PDF」生成的)时,名字后面多一个红框的「PDF」标记——读树时整盘搜一次 index.pdf 按所在文件夹对上(只多一次请求,搜不了就不画标记、不耽误读树);在笔记页生成并传上去后马上画上,在「文件」页里删掉、改名、往笔记文件夹里传了文件也跟着变(搜索的索引跟不上刚变的文件,本窗口确知的变化 10 分钟内以确知的为准)
  • 读树时工具栏下沿走一条细线;第一次读、还没有树时,树的位置上是一行转圈的「加载中…」。笔记编辑页打开时的「加载中…」上面也转着圈
  • 工具栏:添加分类、添加笔记、刷新、全部展开、全部折叠。添加分类 / 添加笔记 / 重命名在侧边栏里弹一个小窗:添加笔记要同时填笔记名称和所属分类(默认是当前选中的分类,选中的是笔记就取它所在的分类)。笔记必须放在分类里,还没有分类时点「添加笔记」会先请你添加分类。同名的分类 / 笔记会被拒绝,原因写在弹窗里
  • 添加笔记 = 在分类下建一个以笔记名命名的文件夹,里面放一个 index.md(内容是以笔记名为题的一级标题),建好后直接打开
  • 双击笔记(或选中后回车)在编辑器区打开它的 index.md,默认就是渲染后的所见即所得编辑(Toast UI Editor,底层存的仍是 markdown;右下角的「编码模式」切到 markdown 源码,「渲染模式」切回所见即所得——编辑器原来叫 Markdown / 所见即所得):标题、加粗 / 斜体 / 删除线、字体颜色(存成 <span style="color: …">,字体、字号、背景色见下)、引用、列表 / 任务列表、表格(右键可增删行列;markdown 里某一行比表头少几格的——手写、粘贴来的表格常见——读进来时自动补上空格子,不然少的那几格点不进去,写回时那一行多几个 | |,意思不变)、插入图片、链接、行内代码、代码块(可设语言)。每篇笔记一个页签(页签上写着笔记名,页面里不再有显示「分类 / 笔记名」的顶栏,一打开就是工具栏),再双击同一篇就调到前面来;编辑器的深浅默认跟着 VS Code 的主题走(也可以在工具栏上单独切,见下),按钮文字跟着插件的界面语言走
  • 深色 / 浅色:工具栏上锁右边的按钮(月亮「深色」/ 太阳「浅色」,写着当前的深浅),点一下换成另一种——不用换 VS Code 的主题,只改笔记页(顶栏、工具栏、目录、正文、菜单)。选择存在 conf.yaml 的 noteTheme,所有笔记页签一起变;没设置过(auto)跟着 VS Code。选的深浅与 VS Code 当前一致时用的就是你 VS Code 主题本身的颜色,不一致时用 VS Code 默认的 Dark Modern / Light Modern 配色。代码块有自己的主题,不受影响;锁着也能切
  • 锁定(防误改):工具栏最左边一把锁,每次打开笔记都是锁着的——只能浏览、选中复制、查找、切到源码模式看,点一下「已锁定」解锁才能编辑(按钮变成亮起的「已解锁」),再点一下锁回去。锁着时没有光标,打字、粘贴、拖放、快捷键(⌘B、⌘Z…)、任务勾选框、表格右键菜单都改不了正文,工具栏上除了锁、深色 / 浅色、目录开关、「正文 ▾」(里面只有「标题编号」能点)、代码块默认类型 / 样式、生成 PDF、查找之外都灰掉,点了、在正文里打字会提示先解锁;区块左边的按钮、表格列宽拖柄不出来,代码块的换语言 / 格式化灰掉(收起、主题、自动换行、复制照常),查找框没有替换。锁着时点链接直接打开(解锁后要按住 ⌘ / Ctrl 点)。锁不锁不写进笔记、也不记进设置:换语言、换深浅主题时保持原样,重新打开笔记又锁上
  • 工具栏(照有道云笔记收拾过样子):一条 40 px 的细工具栏,与正文同底色;16 px 细线图标(换掉了编辑器自带的位图),颜色跟着 VS Code 主题,光标处正是该格式时按钮亮起。从左到右:锁、深色 / 浅色、目录开关|**「⊕ 插入 ▾」(见下)|「正文 ▾」(一行一个图标 + 名称:正文、一到六级标题,当前项打勾;按钮上显示光标所在段落的格式,光标在代码块里时这几项灰掉;最下面隔一道线是标题编号开关,见下)、「字体 ▾」、「字号 ▾」|加粗、斜体、删除线、行内代码|字体颜色**、背景颜色|无序 / 有序 / 任务列表、行间距|代码块默认类型、代码块默认样式(见下);markdown 模式还有「同步滚动」开关;最右边是「PDF」(生成 PDF,见下)与查找替换。引用、水平线、代码块、表格、图片、链接都在「插入 ▾」里,编辑器自带的这几个按钮与它重复,去掉了。列表项的缩进 / 减少缩进用 Tab / Shift+Tab(编辑器自带的那两个按钮只在列表里管用、与 Tab 重复,也去掉了)。下划线、对齐没有做。链接 / 图片 / 表格弹窗、悬停提示、底下的「编码模式 / 渲染模式」切换也换成了 VS Code 的样子
  • 字体、字号、字体颜色、背景颜色:字体有默认字体、宋体、新宋体、仿宋、楷体、黑体、Arial、Arial Black、Times New Roman、Courier New、Tahoma、Verdana(每项用它自己的字体显示),字号 12–36(按钮上显示光标处的字号,标题里显示标题本来的大小;选回本来的大小就去掉)。两种颜色的下拉照有道:顶上「默认颜色 / 无背景」,一排主色加浅 / 中 / 深三排,最下面「自定义颜色 ›」是取色器(饱和度 / 亮度方块、色相条、透明度条、HEX 与 R G B A 输入,松开鼠标或回车就应用);按钮下面那道色条是最近用过的颜色。markdown 存不了这些,存成内联 HTML <span style="font-family: …; font-size: 18px; color: …; background-color: …">…</span>,几样设在同一段文字上会合在一个 span 里、互不冲掉(区块菜单的整块上色也一样)。没选中文字时设的是接下来打的字;markdown 源码模式下就地包一层 span
  • 生成 PDF:工具栏最右边、放大镜左边的「PDF」。把这篇笔记排成 A4 的 PDF,存成与 index.md 同级的 index.pdf(本地副本里与云端笔记文件夹里各一份),原来有的就覆盖——云端没有覆盖接口,做法同其他同名上传:新的传上去、旧的进阿里云盘的回收站。生成时右下角有进度通知(可取消),生成完马上同步一次,提示「已生成并上传」,点「打开」用系统默认的程序打开本地这份;传不上去的留着,跟正文一样过一会儿自动重试。不改正文,锁着也能用;生成中按钮转圈,再点不起作用
    • PDF 里是此刻的正文(没同步的修改也算,所见即所得 / 编码模式都一样),样子与编码模式右边的预览同一套:浅色纸面(与笔记页的深浅无关)、代码块按当前的代码块主题高亮(长行一律折行,纸上没有横向滚动条)、字体 / 字号 / 颜色 / 背景色、标题编号(开着时)、这篇笔记的行距、表格列宽(按比例缩进版心)、图片;字是真的字(选得中、搜得到),页脚居中写页码;标题不会落在一页的最底下,图片、表格的一行不从中间劈开。指向附件的链接在 PDF 里只留文字(点了也打不开,还会把本机路径写进去),网址链接照常可点
    • 用**本机的 Google Chrome / Microsoft Edge / Chromium(或 Brave)**无头打印(扩展宿主只是 Node 进程,用不上 VS Code 自己的打印;纯 JS 的 PDF 库要重新排版、还得内嵌十几 MB 的中文字体)。按平台在常见的安装位置自动找;装在别处的,在 conf.yaml 里用 pdfBrowser 写上可执行文件的路径(macOS 上写 .app 也行),改了不用重启。每次单独起一个临时的无头实例(临时用户目录,用完删掉),不碰你自己的浏览器配置,生成一份约两秒
    • 附件不能叫 index.pdf(会被下次生成的 PDF 覆盖),插入同名附件时自动改名为 attachment-index.pdf
  • 查找替换:工具栏最右边的放大镜、⌘F / Ctrl+F 打开查找,⌥⌘F / Ctrl+H 打开并展开替换(webview 自带的网页内查找关了:它认不得编辑器里的内容,也替换不了)。浮在正文右上角,样子照 VS Code 的查找框:所有匹配淡淡标出、当前那个深一点并选中、滚到看得见,显示「第几个 / 共几个」或「无结果」;「Aa」区分大小写;查找框里回车下一个、Shift+回车上一个;替换框里回车替换当前这个、⌘ / Ctrl+回车全部替换(也有「替换」「全部替换」按钮),全部替换一次 ⌘Z 就撤回;Esc 关掉回到正文。所见即所得与 markdown 源码模式都能用,只在一段之内找、不跨段,代码块里的也找
  • 「插入 ▾」菜单(照有道云笔记,只有这几项):图片、表格(悬停出 8×8 的格子,划到哪就是几列几行,下面写着「列 x 行」,至少表头加一行)、链接(小表单填链接地址与链接文本,选中了文字时链接就加在选中的文字上)、代码块、水平线、引用、附件。图片 / 表格 / 代码块 / 水平线 / 引用在所见即所得模式下插在光标所在那一块的下面(那一块是空行就直接换掉,与区块左边的「+」一个规矩),markdown 模式下插在光标处;链接、附件插在光标处,光标在代码块里时灰掉
    • 附件:弹 VS Code 的选文件窗口(可多选),文件复制进这篇笔记的文件夹(保留原来的文件名,重名时加「 (2)」,index.md 这类会占用正文 / 同步文件名的会改名),正文里插成一个链接:文字是原来的文件名,地址是复制进笔记文件夹后的文件名(地址里的空格、括号等转义成 %xx)。同步时随图片一起传上云端,打开笔记时正文链接到的附件本地缺了也会拉下来。按住 ⌘ / Ctrl 点附件链接用系统默认的程序打开本地副本里的那个文件。正文里删掉了附件链接,云端那个文件不会跟着删
  • 目录(照有道云笔记):编辑器左边一栏按正文里的标题自动列出目录,按级别缩进;点一条就滚到那个标题,滚动正文时高亮正在读的那一节。所见即所得与 markdown 源码模式都能用。工具栏上锁右边的目录按钮(目录开着时亮起,锁着也能点)或目录顶上的「⇤」收起 / 展开;目录与正文之间的分割线可以拖动调宽度(140–480 px,双击恢复默认 220 px,分割线获得焦点时左右方向键也能调)。收起 / 展开与宽度都是全局偏好(存在 conf.yaml 的 noteToc / noteTocWidth),所有笔记页签一起变;页签窄时目录临时收窄、给正文留够 480 px,再窄就不显示(工具栏上的目录按钮也灰掉)
  • 区块按钮与菜单(照有道云笔记,所见即所得模式下):鼠标指着哪一块,它左边就出「+」与「⋮⋮」两个按钮。「区块」是最外一层的一段、一个标题、一整个列表、一整段引用、一个代码块、一张表格、一条水平线,只有图片的一段算图片块
    • 点「⋮⋮」弹出这一块的菜单并选中整块:文字类的区块可以换类型(正文 / 一到六级标题 / 无序 / 有序 / 任务列表 / 引用 / 代码块)、给整块文字上色(灰红橙黄绿蓝紫,「默认」去掉颜色;代码块不能上色),所有区块都能剪切 / 复制 / 删除 / 整理(复制的是这一块本身,贴回来结构不变)。整理把这一块里每一行两头的空白都去掉——空格、Tab、全角空格、不换行空格、零宽字符;段落、标题、列表的每一项、表格的每一格各算一行,代码块按换行分行(代码的缩进也会去掉);格式、图片保留,一步 ⌘Z 撤回,没什么可去的会提示。图片、表格、水平线的菜单只有剪切 / 复制 / 删除 / 整理。「缩进和对齐」没有做:markdown 存不了对齐
    • 拖着「⋮⋮」走把整块挪到别处:落点处出一条线,拖到正文上下边缘会自动滚动;挪动是一步操作,⌘Z 一下就撤回
    • **点「+」**弹出插入菜单,只有 markdown 的基本元素:正文、一到三级标题、无序 / 有序 / 任务列表、引用、代码块、表格(3×3)、图片、水平线,插在这一块下面;这一块是空段落就直接换成选的内容
  • 标题编号:「正文 ▾」最下面的「标题编号」,默认开(打勾)。开着时每个标题前面自动显示章节号——一级 1 标题、二级 1.1 标题、三级 1.1.1 标题……号码与文字之间一个空格;号码不是正文,不写进 markdown、不能编辑、选不中也复制不走,左边目录里带着同样的号码,markdown 源码模式右边的预览也有。编号从文中出现的最高一级算起(通篇从二级标题写起的,二级就编 1、2、3);中间跳了级的(一级下面直接三级),跳过的那一级记 0(1.0.1)。开关是全局偏好(存在 conf.yaml 的 noteHeadingNumbers),所有笔记一起变
  • 行间距:工具栏「行距 ▾」,1.0 / 1.15 / 1.5 / 1.7 / 2.0 / 2.5 / 3.0(默认 1.5),一篇笔记一个行距,管正文段落(列表、引用、表格里的字也算),标题、代码块有自己的行高。不是默认的 1.5 时 md 第一行写一行注释 <!-- line-height: 1.7 -->,跟着笔记走(同步到别的电脑也一样),GitHub、VS Code 预览等不显示;源码模式里看得见、也能手改,在源码模式下点工具栏改的就是这一行。改行距不进撤销历史
  • 表格列宽(所见即所得模式下):鼠标移到表格两列之间的竖线上出一道竖条,按住左右拖调这一列的宽度(最窄 48 px),别的列不动、表格跟着变宽变窄,格子里的长字折行;双击竖条整张表恢复自动宽度;⌘Z 照常撤销。调过宽度的表格写进 md 时上面多一行注释,记每列的像素宽度,下次打开按它还原:
    <!-- col-widths: 120 80 200 -->
    | 名称 | 数量 | 说明 |
    | --- | --- | --- |
    
    GitHub、VS Code 预览、Typora、Obsidian 都不显示注释,表格本身还是标准 markdown;源码模式里看得见、也能手改(改完切回所见即所得照办)。没调过的表格不写这一行;表格后来加了列,新列按 120 px 补上。markdown 源码模式右边的预览不按列宽显示
  • 标题下面不画横线(编辑器默认给一、二级标题画的那道线去掉了);一到六级标题都是 20 px(行高 28 px,级别靠标题编号与目录缩进区分;上下间距也统一成上 20 px、下 8 px——编辑器原来给一级标题上面空 52 px,跟在代码块后面时中间一大片空白;文档开头的第一个标题不空上边距),所见即所得、预览、源码模式一样
  • 代码块(照有道云笔记,所见即所得模式下):顶上一条工具条,鼠标移上去或光标在里面时显出来——左边收起 / 展开、语言下拉(顶上可搜索,上下键挑、回车选;只放常用的 30 种语言、自己加的 Form(表单) 与「纯文本」:Bash / Shell / PowerShell、C / C++ / C# / Java / Kotlin / Groovy / Go / Rust、Python / Ruby / Lua / Swift、JavaScript / TypeScript、HTML / CSS、SQL、JSON / YAML / XML / INI / Properties、Dockerfile / Makefile / Nginx / HTTP / Markdown、Form;标注行写的是别的语言(包括菜单里去掉的 Batch、Dart、Diff、JSX、TSX、Less、PHP、SCSS、TOML)就照写、不高亮)、主题下拉(四套:默认主题照 Monokai Pro——深色底 #2d2a2e,声明类关键字 function / const 青色斜体、return 与运算符粉、函数名绿、参数橙色斜体、字符串黄、数字与常量(含 const 声明出来的名字)紫、注释灰色斜体,不随 VS Code 的深浅变;宁静深邃 / 清新条纹 / 暗夜繁星照有道,词的配色分别是 Prism 自带的 tomorrow / coy / okaidia 主题,个别颜色照有道取色调过;清新条纹左边一道蓝边、一行一道条纹、不带行号),右边格式化、自动换行与复制代码。外面一圈灰色细框,深色代码块放在深色页面上也看得出边界。正文带行号(自动换行时对着每一行的第一截)与语法高亮(Prism),markdown 源码模式右边的预览也按同一套主题高亮
    • 代码块默认类型 / 默认样式(工具栏上两个下拉,锁着也能改):默认类型是之后新加的代码块用什么语言(下拉同代码块上的语言下拉,可搜索;默认「纯文本」),存在 conf.yaml 的 codeLanguage,所有笔记一起用——插入菜单、区块的「+」与「换成代码块」、编辑器自带的 ⇧⌘P 新建的代码块都直接带上它,编码模式里插的代码块在开头那行补成 ```java;已有的代码块不动,读入笔记、切模式、撤销重做、粘贴进来、拖动挪块的也不补。默认样式就是上面说的全局主题(与每个代码块工具条上的主题下拉是同一个设置),改了所有代码块一起变
    • Form(表单):存账号、密码这类信息,一行一条 键: 值(以第一个英文冒号分开,值里的冒号——网址、时间——算值的一部分)。键红色、值绿色、冒号灰白(三套深色主题照参考图取色:#e2777a / #7ec699 / #cccccc;清新条纹是白底,用深一点的红绿),哪套代码主题下都是红配绿;没有冒号的行不着色。所见即所得模式下鼠标指着哪一行,这一行右边就出一个复制按钮,点一下把冒号右边的值放进剪贴板——两头的空格、Tab、全角空格、零宽字符都去掉;锁着也能复制。格式化时每行整理成 键 : 值(冒号左右各一个空格)
    • 格式化(按钮,或光标在代码块里时按 ⇧⌥F / Shift+Alt+F):按代码块的语言把代码重新排好,一步 ⌘Z 撤得回来,光标还在原来那一行。原则是不改代码的意思——能只动每行开头的空白就只动空白:
      • 整段重排(换行、空格也调):JavaScript(不含 JSX 的)、CSS、HTML 用 js-beautify,SQL 用 sql-formatter(按标注行认 MySQL / PostgreSQL / PL/SQL 方言,标准 SQL 不认的写法会换个方言再试;关键字大小写不动)。这两个库约 200 KB,单独打包在 vendor/formatters.js,第一次格式化这几种语言时才加载
      • JSON:一行一个键 / 元素、冒号后一个空格,数字、字符串照原样抄(不经 JSON.parse,大整数不丢精度、1.0 不会变成 1),带注释、末尾多逗号的 JSONC 也认得;XML:一个元素一行,只有文字的元素留在一行,属性、文字、注释、CDATA 照原样;YAML:只把缩进统一成两格(- x 收成 - x),层级不变、值一个字不动(拿 YAML 库重新输出会把 0755 写成 755)
      • 其余只调缩进:Java、C / C++ / C#、Go(Tab)、Rust、Kotlin、Swift、Groovy、TypeScript(标注行写着 tsx 的、含 JSX 的 JavaScript 也走这里,认得标签层级)、PowerShell、Nginx 按括号层级,switch 里的 case(Go、Swift 的 case 与 switch 对齐)、链式调用开头的 .、没有花括号的 if 下一行、三元运算符的续行、TSX 里的标签层级、C++ 的 public: 都照常见写法;Shell 按 then / do / case … esac / { },Ruby、Lua 按关键字与 end;Dockerfile 的续行缩四格;INI、Properties 顶格。字符串、多行字符串(模板字符串、文本块、raw string、heredoc)里的行原样不动,块注释整体跟着挪,C / C++ 的预处理行顶格
      • 缩进宽度先看代码里原来用的是几格(或 Tab),看不出来才用这门语言的惯例(JS / JSON / YAML / Shell / Ruby 两格,Java / C 系 / SQL 四格,Go 一律 Tab)
      • Python、Makefile(缩进 / Tab 本身有含义)、Markdown、HTTP 与纯文本不格式化,按钮灰掉;没写语言的代码块看内容:{ [ 开头当 JSON,< 开头当 XML / HTML。括号对不上之类的语法问题会提示「第 N 行附近可能有语法错误」,代码不动
    • 语言写在 markdown 代码块的标注行里(```bash),换语言只换标注行的第一个词;sh、js、py、yml 这类常见写法认得出来,照原样保留。主题与自动换行是全局偏好(所有笔记的代码块一起变,存在 conf.yaml 的 codeTheme / codeWrap),markdown 文件里不多写东西;收起只在这次打开有效,光标挪进收起的代码块会自动展开
  • 图片:工具栏选图、区块的「+」→「图片」、直接粘贴截图、拖进编辑器都行,图片存进这篇笔记的文件夹(与 index.md 同级,起名 image-<时间>-<随机>.<扩展名>),正文里以相对路径引用,单张上限 30 MB。正文里删掉了图片引用,云端那张图不会跟着删
  • 编辑器里点链接不会跳转(多半是要改字);按住 ⌘ / Ctrl 点才在浏览器里打开
  • 分类的显示样式:右键分类 →「设置」,弹窗(与添加分类同款)最上面一行预览,下面三项:
    • 字体颜色:「默认」(跟主题)+ 12 个色块,或在「自定义颜色」里填 #RRGGBB(#rgb、不带 # 也认)
    • 高亮关键词:填了就只给名称里的这几个字上色(不分大小写,出现几处上几处)——设了「技术专题」,「技术专题 ABC」里只有「技术专题」四个字上色;空着就整个名称上色。没选颜色时关键词不起作用
    • 图标:默认的文件夹,或六个技术领域的图标之一——编程开发 </>、服务器 / 后端、数据库、云计算 / 运维、人工智能、网络安全。图标不跟着上色
    • 存在云端那个分类文件夹里的 conf.yaml(color、highlight、icon 三个键),换台电脑看也一样;手工写在里面的别的键、注释保存时原样留着,三项都改回默认、文件里也没别的了就把它移进回收站。云端没有就地改写,每存一次都是新传一份、旧的进回收站。读树时顺带读它:按文件对上本地缓存(~/.x1/adrive-studio/notes/<盘>/.category-styles.json)就不再下载,所以只有改过的分类会多一次下载
  • 右键菜单:分类上「添加笔记」「设置」,笔记上「打开」,两者都有「重命名」「删除」;空白处右键是「添加分类」「添加笔记」。删除先弹确认框,移入阿里云盘的回收站(删分类连同其中的全部笔记)。键盘:上下移动、左右收展、回车打开 / 收展、Delete(macOS 也可 ⌘⌫)删除、F2 重命名
  • 保存与同步:编辑是在本地工作副本上进行的(~/.x1/adrive-studio/notes/,见下文),每次改动立刻写进本地,崩溃也不丢字;停手 5 秒后整篇传上云端,一直在改也至少每分钟传一次;⌘S / Ctrl+S 或底下状态栏左边的云朵按钮立即传;关页签、退出 VS Code 时也会传。底下状态栏的最左边写着同步状态(已同步到阿里云盘 / 有修改尚未同步 / 正在同步 / 同步失败及原因,失败时红字;页签窄时截断,不压右边的模式按钮),传失败了 30 秒后自动重试,传不上去的留在本地,下次打开这篇笔记时接着传
  • 云端没有「覆盖」这回事,每传一次 index.md 都是新建一份、把旧的移入回收站(与上传同名文件的做法相同),所以同步不会太勤;内容没变时什么都不传
  • 打开笔记时,云端的 index.md 比本地新(在别的电脑上改过)就拉下来,正文引用到的图片本地缺了也拉下来;本地还有没传的修改而云端也改过时暂停同步、让你选:「用云端的」(本地那份另存为 index.conflict-<时间>.md 并上传,不会丢)、「用我的」或「对比」。断网时也能打开本机的副本,修改先存在本机,连上后再同步
  • 在「文件」页里改名、删除 /.notes 下的东西,笔记页的树会跟着刷新,开着的笔记页签也会换标题 / 关掉

视频截图、视频预览、图片预览、重复校验

都在文件树的右键菜单里,作用于右键的那个文件夹(顶层的盘也行):

  • 视频截图:给视频截一帧当缩略图。右键文件夹是处理它和所有子文件夹里的视频,右键视频文件就只处理它,别的文件跳过。弹窗里填截取第几秒的画面(默认 120 秒;视频没那么长就截正中间那一帧),以及已有缩略图的要不要重新生成(默认不勾,跳过)。缩略图是 PNG,与视频同名、只换扩展名(a.mp4 → a.png),长边不超过 800 px,传到视频所在的云端目录;重新生成时按上传的同名规则覆盖(新的传上去、旧的进回收站)。从盘的根往下找时跳过笔记的 .notes。进度在通知里,可以取消,结束时说清楚生成、跳过、失败各几个
    • 截帧用本机的 ffmpeg(阿里云盘自己的缩略图有的编码截不出来,比如 AV1,截哪一刻也定不了)。ffmpeg 直接读云端的下载地址,靠 Range 请求只取需要的那几段,不用把整个视频下下来:常见的 MP4 / MKV 每个视频只读几 MB;没有索引的文件(录屏常见的不带索引的 MKV 等)要从头读到截帧的位置,截得越靠后读得越多。AV1 要 ffmpeg 带软件解码器(libdav1d 或 libaom-av1,Homebrew 的 ffmpeg 自带 dav1d)
    • 没装 ffmpeg 会提示怎么装;装在别处的在配置文件里写 ffmpegPath(见下文)
  • 视频预览:在编辑器区开一个页签看这个文件夹(不含子文件夹)里的图片:上面是选中的那张大图,下面一排是全部图片(横着滚,名字在图下面);同目录里有同名视频的(扩展名前面那段相同,不分大小写,如 a.png 与 a.mp4),图片右下角标出视频的格式
    • 键盘:↑↓ 换图(没在放视频时 ←→ 也换);空格放同名视频、再按空格停下回到图片(再放接着上次的位置);放视频时 ← / → 后退 / 前进 15 秒
    • 删除按钮把这张图连同它的同名视频一起移入回收站,不再确认——所以这个按钮只认鼠标点,键盘碰不到它
    • 视频直接放云端的原文件,只能放浏览器认识的格式(mp4 / webm / mov),mkv、avi 这些会提示放不了
  • 图片预览:在编辑器区开一个页签,像访达的图标视图那样一格一张地铺开这个文件夹(不含子文件夹)里的图片,名字在图下面。浏览时只用云端给的缩略图,不加载原图
    • 点一张选中它;方向键移动选中(←→ 前后一张,↑↓ 上下一行)
    • 选中后按空格放大看原图(像访达的「快速查看」,这时才去取原图),再按空格(或 Esc、点图片外面)关掉;放大着也能用方向键换图
  • 重复校验:在编辑器区开一个页签,找出这个文件夹连同所有子文件夹里内容相同的文件。上面是进度条与状态(已扫几个文件夹、几个文件),可以中途「停止」(扫到的照样列出来)、扫完「重新校验」;下面一组一组地列出重复的文件:组标题写着几个相同、每个多大,每个文件一行写名字、大小、所在文件夹,右边是删除按钮。组按「删掉多余的副本能省多少」从大到小排
    • 不下载任何文件:判重用的是列目录时云端就给了的校验码(content_hash,整个文件的 SHA1)加大小。这个校验码是阿里云盘服务端在文件上传完成时按实际存下的内容算的(秒传的文件是服务端核对过所有权证明、引用已有的同一份),客户端报不了假的。所以只是把目录一层层列一遍(同时列 4 个),文件名、修改时间不同但内容一样的也算重复
    • 不参与比较:0 字节的文件(空文件的校验码都一样)、.DS_Store 与 ._*、没传完的半成品、云端没给校验码的(个数写在总结里);从盘的根往下查时跳过笔记的 .notes
    • 删除不再确认,移入回收站(能恢复),文件树跟着更新;一组里只剩一个时它的删除按钮是灰的——删了就一份都不剩了。删到一组只剩一个,这一组就收起来
    • 删除重复(扫完、有重复时出现在「重新校验」左边):每组只保留排在第一个的(组里按路径排),其余的一次删掉。一下子删很多,先弹一次确认框写明删几个、能省多少;删的时候同时删 4 个,进度条改成删除的进度,单个的删除按钮都灰掉,删完写明删了几个、省了多少、几个没删成
  • 视频预览、图片预览、重复校验的页签都是一个文件夹一个,同一个文件夹再点就调到前面;这个文件夹里有变化(上传了、截了图、在树里删了 / 改名了)会自动重读

上传 / 下载与传输面板

  • 上传:鼠标放到目录行上,点行尾的上传按钮(或右键「上传…」),选本地的文件 / 文件夹(macOS 的对话框可以两者同时选,别的平台先问一句选哪种),选定后即作为任务加进上传队列。选了文件夹就连同里面的一切一起传,云端建出同样的目录结构(空目录也建,符号链接跳过);macOS 的修饰文件(.DS_Store、._*)在遍历时直接跳过,不让它们上去(直接点名选中的照传——那是你要的),一个目录里除了修饰文件什么都没有就当空目录建出来;云端已有同名文件时覆盖(内容一样就原样不动,一个请求都不多发;同名的是个目录则不动它,只把文件传上去)。支持秒传:云端已经有一份同样内容的文件时直接建好,一个字节都不用传。大文件走分片上传(16 MB 起,分片数超过 2000 就加大每片),传得慢导致分片地址过期会自动重新取。支持断点续传:传到一半暂停、断网、关掉 VS Code 都不用从头再来——云端记得收到了哪几片,下次只补剩下的(断点记在 uploads.json,本地文件改动过就作废)
  • 下载:点文件或目录行尾的下载按钮(或右键「下载…」),选一个本地文件夹作为下载位置,即作为任务加进下载队列。选了目录就连同里面的一切一起下,本地建出同样的目录结构(先向云端逐层列举,大目录列举得久,通知上可以取消);本地已有同名的会加序号(名字 (1).txt),不覆盖。支持断点续传:下到一半暂停、断网、关掉 VS Code,下次接着下(.part 文件里已收到的字节就是断点,旁边的 .part.etag 记着那份内容的 ETag,续传前先探一下云端现在的 ETag,对不上——云端文件在中断期间被换过——就从头下)。网络抖动、超时、地址过期会自动重试,每次从 .part 已有的地方接着来。只有明确取消才删掉 .part
  • 传输面板:工具栏的传输按钮打开(添加任务时也会自动打开),编辑器区的一个页签,上传、下载两个 tab,各自显示任务:文件名、进度条、进度条右边是当前速度,下面一行是来源 → 去向(上传是本地文件 → 云端路径,下载是云端文件 → 本地路径;两段各自省略,鼠标停上去看完整的),右边是当前在做什么:准备中(查断点、建云端目录、取下载地址)、校验中(算哈希、跟云端比对,大文件这一步要好几秒到几十秒,会写明算到哪儿了,如「校验中 · 3.2 GB / 10.0 GB」,速度那格显示读盘速度)、收尾中(合并分片、回收被覆盖的旧文件),真在收发数据时则显示已传 / 总量。这几步一个字节都还没发出去,进度条不动——原来这段时间界面是空白的,看着像卡死。传完的任务从列表里消失,失败的留着显示原因,可以重试或移除,正在传的可以暂停(进度条变灰,已传的量留着)、继续或取消。取消一个没传完的上传会把云端那个半成品一并收进回收站;暂停则留着,等你继续。列表上方还有整个 tab 的批量按钮:全部暂停(有在传或排队的才出现)、全部继续(有暂停着的才出现)、清除失败、全部取消
  • 文件校验:传输面板顶上的切换按钮,管的是上传遇到同名文件时怎么判断两边是不是同一份(是同一份就什么都不做,云端保持原样,file_id 不变、已有的分享链接和收藏都还在)。两档都先比文件大小——大小不一样必然不是同一份,改动过的文件多半在这一步就分出来了。大小相同时:精确(默认)比整个文件的 SHA1,本地要把文件整个读一遍(约 580 MB/s,2 GB 约 4 秒),这个 SHA1 接着还要拿去建文件(云端认得出这份内容就秒传),并不白算;快速只比修改时间——云端的 updated_at 是那份文件传上去的时刻,本地比它新就当改过,零哈希、零额外请求,代价是大小和时间都没变、内容却变了的文件会被当成同一份,于是该覆盖的没覆盖。设置记录在配置文件的 verify 键里。注意这个开关不影响秒传——秒传是云端的判断,协议要求必须给出整个文件的 SHA1
  • 并发数:传输面板顶上两个下拉,分别设上传、下载同时进行的任务数(1–10,默认 1),选完立刻生效,不必重启。调大马上多起几个任务,调小不打断正在传的,等它们传完自然收敛。设置记录在配置文件里(见下文)

登录与授权

做法与 x-cmd 相同:插件不持有阿里云盘的 app 密钥,扫码、换取 / 刷新 token 一律经由授权服务端 http://adrive.osclass.cn/adrive-server(写死在 src/adrive/authClient.ts 里,不是配置项)完成;拿到 access_token 之后的列目录、新建、改名、删除、取下载地址、分片上传才由插件直连 https://openapi.alipan.com(分片本身传到接口返回的对象存储地址)。

  • 第一次打开视图时显示登录面板,点扫码登录:插件向授权服务端取二维码,把图片抓下来显示在侧边栏里(抓不到时可点「在浏览器中打开」),用手机阿里云盘 App 扫码并确认,最长等 3 分钟。二维码过期或出错时可点「重试」
  • 授权成功后 token 存到 ~/.x1/adrive-studio/token.json(权限 rw-------),重启 VS Code 后免扫码。access_token 临过期(2 分钟内)自动用 refresh_token 刷新;刷新失败(refresh_token 也失效)会自动登出并回到登录面板
  • 与 x-cmd 的 ~/.xcmd/adrive-token.json 各用各的文件:阿里云盘刷新 token 后旧的 refresh_token 会失效,两个程序若共用一份会互相把对方踢下线
  • 齿轮菜单里的退出登录只删本地的 token.json,不会撤销授权
  • 云端限流(HTTP 429)时按服务端给的 Retry-After 等待后重试,所有在途请求一起等(没有 Retry-After 就指数退避,封顶 20 秒——这是交互式插件,等一分钟跟卡死没区别);5xx 与网络异常有限次重试后报错。开放平台没有批量接口(/v2/batch 那套是企业版 PDS 的),要快只能靠并发;实测只读并发 8、写入并发 6 都不会触发限流

配置文件

插件不使用 VS Code 的设置项,所有偏好记录在用户目录的 ~/.x1/adrive-studio/conf.yaml 里(与 File Studio 的 ~/.x1/file-studio/conf.yaml、SSH Studio 的 ~/.x1/ssh-studio/conf.yaml 同一套做法)。齿轮菜单里的操作会直接写入该文件,文件里的其他键原样保留;也可以手工编辑,重启 VS Code 后生效。

键 默认值 说明
language auto 界面语言:auto(跟随 VS Code)、zh-cn、en、de、fr、ja、ko
uploadThreads 1 同时进行的上传任务数,1–10。由传输面板顶上的下拉维护
downloadThreads 1 同时进行的下载任务数,1–10。由传输面板顶上的下拉维护
verify exact 上传遇到同名文件时怎么判断两边是不是同一份:exact 比整个文件的 SHA1,fast 只比修改时间(快,但会漏掉「大小和时间都没变」的改动)。两者都先比文件大小。由传输面板顶上的切换按钮维护;早先版本写的 prefix 会当作 fast
noteToc true 笔记编辑器左边的目录展开着没有。由目录顶上的收起按钮、工具栏上的目录按钮维护
noteTocWidth (220) 笔记编辑器左边的目录有多宽,140–480 的整数(px)。由目录与正文之间的分割线维护,没设置时用默认的 220
codeTheme default 笔记里代码块的主题:default(默认主题,Monokai Pro 配色)、serene(宁静深邃)、stripes(清新条纹)、starry(暗夜繁星);认不出的值当 default。由代码块工具条上的主题下拉维护
codeWrap false 笔记里的代码块自动换行(关着时长行横向滚动)。由代码块工具条上的自动换行按钮维护
codeLanguage (纯文本) 新加的代码块默认用的语言,写 markdown 标注行的那个词(如 java、python、form);空串或不写就是纯文本。由工具栏上的「代码块默认类型」维护
noteHeadingNumbers true 笔记的标题前面显示自动编号(1、1.1、1.1.1…)。由「正文 ▾」下拉里的「标题编号」维护
pdfBrowser (自动找) 笔记生成 PDF 用的浏览器:Chrome / Edge / Chromium 的可执行文件路径(macOS 上写 /Applications/Google Chrome.app 这样的 .app 也行,~ 开头的会展开)。不写就按平台在常见位置找 Chrome、Edge、Chromium、Brave。只能手工写,改了马上生效(每次生成 PDF 时重新读)
ffmpegPath (自动找) 视频截图用的 ffmpeg:可执行文件的路径,或它所在的目录(ffprobe 要在同一目录),~ 开头的会展开。不写就在 PATH 与常见位置(Homebrew 的 /opt/homebrew/bin、/usr/local/bin 等)找。只能手工写,改了马上生效
noteTheme auto 笔记页的深浅:dark、light,或 auto(跟着 VS Code 的主题)。由工具栏上的「深色 / 浅色」按钮维护(按钮只在深色、浅色之间切;想回到跟着 VS Code,把这一项删掉或写成 auto)

~/.x1/adrive-studio/ 下的其他文件:

~/.x1/adrive-studio/
├── conf.yaml        偏好(界面语言、上传 / 下载并发数、同名文件的校验方式、笔记目录展开着没有与宽度、代码块主题与换行、标题编号、笔记页深浅、生成 PDF 用的浏览器、视频截图用的 ffmpeg)
├── token.json       阿里云盘授权(access / refresh token、过期时刻与登录会话的标识;几个 VS Code 窗口共用,一个窗口登出、换账号,别的窗口跟着)
├── uploads/         没传完的上传,一条一个文件(file_id + upload_id),下次接着传;传完即删。早先版本的 uploads.json 头一次用到时迁过来
├── downloads/       下到一半的文件夹记在这里(本地哪个文件夹是为哪个云端文件夹建的),关了窗口再下同一个文件夹时接着下;整个下完即删
├── cache/           单击打开文件时下载的只读副本:<driveId>/<fileId>/<content_hash 前 8 位>/<文件名>
└── notes/           笔记的本地工作副本:<driveId>/<笔记文件夹的 file_id>/ 下是 index.md、正文引用的图片
                     与 .sync.json(同步状态:上次同步的云端版本、有没有没传的修改)。用 file_id 命名,
                     笔记改名、换分类都不影响。「清理已下载的文件缓存」不碰它——里面可能有还没传上去的修改
                     齿轮菜单「清理已下载的文件缓存」可整个清掉

目录结构

  • src/:扩展代码
    • extension.ts:激活、命令注册;新建 / 改名 / 删除 / 上传 / 下载 / 打开 / 语言切换 / 清缓存的具体执行
    • sidebarView.ts:侧边栏唯一的 webview 视图(下发文案、盘列表与目录内容,推送扫码登录的进度,执行页面交回的动作)
    • transfer.ts:上传 / 下载的任务队列(两个独立的池,各自的并发数),文件夹展开、云端目录按需创建、进度与速度统计
    • transferView.ts:传输面板(编辑器区的 webview 页签)
    • mediaView.ts:图片 / 视频预览面板(编辑器区的 webview 页签),并判断哪些格式能直接看
    • notes.ts:笔记的云端结构(.notes / 分类 / 笔记)与本地工作副本的同步(打开时拉、编辑后传、冲突另存)
    • notePanel.ts:笔记编辑器(编辑器区的 webview 页签,每篇一个),掌握同步的节奏(停手 5 秒 / ⌘S / 关页签)
    • notePdf.ts:笔记生成 PDF:找本机的 Chrome / Edge / Chromium,套上笔记页的样式表拼成网页,经 --remote-debugging-pipe 走 DevTools 协议无头打印
    • prompts.ts:文件页与笔记页共用的确认框与名称校验
    • thumbnails.ts:视频截图:找本机的 ffmpeg / ffprobe,列出目标里的视频,一个个截帧成同名 PNG 传回视频所在目录
    • galleryView.ts:视频预览(编辑器区的 webview 页签,每个文件夹一个):图片与同名视频配对、给页面要原图 / 视频的下载地址、删除图片连同同名视频
    • duplicateView.ts:重复校验(编辑器区的 webview 页签,每个文件夹一个):一层层列目录(并发 4)、按云端校验码 + 大小分组、删除时保护每组的最后一份
    • imageGridView.ts:图片预览(编辑器区的 webview 页签,每个文件夹一个):网格只用云端缩略图,放大看时才给原图地址
    • cleanup.ts:清除整个云盘里的 macOS 修饰文件(.DS_Store / ._*):全盘搜索 → 并发移入回收站,搜索不可用时退回逐目录爬;认这类文件的规则(isMetadataFile)由上传那边共用
    • adrive/authClient.ts:授权服务端的三个端点(取二维码、轮询扫码状态、换取 / 刷新 token),解开 { success, message, data } 信封
    • adrive/openApi.ts:阿里云盘开放平台接口(云盘信息、列目录、全盘搜索、文件详情、新建文件夹、改名、移入回收站、取下载地址、分片上传的建文件 / 取分片地址 / 列已传分片 / 收尾)与限流 / 重试
    • adrive/session.ts:token 持久化与自动刷新、扫码登录流程、盘列表
    • adrive/download.ts:把云端文件下载到本地(缓存副本 / 下载任务)
    • adrive/upload.ts:把本地文件传到云端(秒传、同名覆盖、分片上传)
    • adrive/hash.ts:秒传要算的三个值(前 1 KB 的 SHA1、整个文件的 SHA1、拿 access_token 定位的所有权证明)
    • adrive/uploadState.ts:没传完的上传记在 uploads/ 下(一条一个文件),供下次续传
    • adrive/downloadState.ts:下到一半的文件夹的记录(downloads/),关了窗口再下同一个文件夹时接着下
    • adrive/fileLock.ts:跨窗口的独占锁(.part、断点、笔记本地副本都靠它:记着持有者的进程号,进程没了锁就作废)
    • adrive/cancel.ts:暂停 / 取消一路传到云端请求(AbortSignal)的几个小工具
    • adrive/types.ts:报文类型
    • i18n.ts:运行时文案的翻译与语言切换;confFile.ts:读写配置文件 ~/.x1/adrive-studio/conf.yaml;webviewHtml.ts:七个 webview 共用的页面装配(模板 + CSP + nonce)
  • media/main/:侧边栏页面(HTML / CSS / JS):main.js 是登录面板、页签与「文件」页(工具栏、文件树、右键菜单、齿轮菜单),notes.js 是「笔记」页(两层树、弹窗),后者用的 vscode api、菜单、图标从 main.js 交出的 window.__ad 拿
  • media/note/:笔记编辑器页面(HTML / CSS / JS):main.js 是编辑器与同步状态(建好编辑器、切换模式后清空撤销历史:编辑器把「整篇换成读进来的内容」也记成了一步,不清的话刚打开就按 ⌘Z 会把正文撤空),tables.js 是表格列宽,outline.js 是左边的目录,blocks.js 是区块左边的按钮、区块菜单、插入菜单与拖动,codeblocks.js 是代码块(作为编辑器插件替换自带的代码块视图,行号与高亮是 ProseMirror 装饰),formblock.js 是 Form(表单)代码块的高亮语法与逐行复制按钮,codeformat.js 是代码块的格式化(各语言的重排缩进;js-beautify / sql-formatter 在 vendor/formatters.js 里按需加载),lock.js 是锁定(ProseMirror 不可编辑 + 拦下改文档的事务),theme.js 是笔记页的深色 / 浅色(与 VS Code 不一致时在 body 上重定义 --vscode-* 变量),numbering.js 是标题编号(节点装饰 + CSS 伪元素),toolbar.js 是工具栏的排法与「正文 ▾」下拉(外观在 style.css 的「工具栏」一节),insert.js 是「插入 ▾」菜单,format.js 是字体、字号、两种颜色与取色器(也给编辑器注册 span 标记),find.js 是查找替换,pdf.js 是工具栏的「PDF」(用编辑器自己的预览渲染器把此刻的正文渲染成 HTML 交给扩展;打印用的网页另带 pdf.css,把整页编辑器的排法改成纸上从上往下排、加分页规矩);这几个从 main.js 交出的 window.__note 拿编辑器,直接对编辑器内部的 ProseMirror 文档下事务;vendor/ 是打包好的 Toast UI Editor(含五种界面语言包与代码高亮用的 Prism)与格式化库,由 scripts/build-editor.js 生成
  • media/transfer/:传输面板页面(HTML / CSS / JS),两个 tab 的任务列表与并发数下拉
  • media/preview/:预览面板页面(HTML / CSS / JS),图片是缩略图垫底 + 原图后台加载 + 缩放切换,视频是缩略图当封面 + 浏览器自带播放器
  • media/gallery/:视频预览页面:上面大图 / 播放器,下面横滚的缩略图条,键盘换图、放 / 停视频、跳 15 秒,删除
  • media/dupes/:重复校验页面:进度条与状态、表头 + 一组一组的结果、每行的删除按钮
  • media/images/:图片预览页面:缩略图网格、方向键移动选中、空格放大看原图
  • l10n/:运行时文案的翻译包,英文原文为 key
  • package.nls.*.json:命令标题、视图名等静态文案,由 VS Code 按显示语言选用
  • scripts/check-l10n.js:校验 t() 用到的每条文案在各语言包里都有译文、没有多余 key,以及 package.nls.*.json 的 key 一一对应
  • scripts/check-webview.js:校验扩展与七个页面对得上——下发的文案 key 与页面用到的一一对应、post / send 的消息类型双向都有人处理、页面用到的 class 在各自的 style.css 里都有定义(页面的脚本是页面目录下所有的 .js,vendor/ 不算)
  • scripts/check-code-langs.js:校验代码块的语言登记与 build-editor.js 打包的 Prism 语法对得上
  • scripts/build-editor.js:把 Toast UI Editor(npm 包里的 UMD 版把 prosemirror 当外部依赖,没法直接用 script 标签加载)连同语言包、prosemirror-state 的选区类(区块菜单要用,与编辑器是同一份模块)、Prism 与代码块菜单里的语言用 esbuild 打成 media/note/vendor/ 下的一个 js + 一个 css。产物提交在仓库里,平时不用跑;升级编辑器或增减语言时 npm install && npm run build-editor

开发与调试

npm install
npm run compile      # 编译到 out/
npm run watch        # 监听源码变化自动编译
npm run check-l10n   # 校验翻译文件
npm run check-webview # 校验扩展与页面之间的文案 key / 消息类型 / 样式类
npm run check-code-langs # 校验代码块语言登记与打包的 Prism 语法
npm run build-editor  # 重新生成笔记编辑器的 vendor 文件(升级 Toast UI Editor 时才需要)
  • 按 F5 启动「Run Extension」在扩展开发宿主中调试。
  • 或将本目录符号链接到 ~/.vscode/extensions/lupee.adrive-studio-<version>(<version> 与 package.json 里的一致),编译后执行 Developer: Reload Window 即可在日常使用的 VS Code 中加载。
  • 依赖的 VS Code 版本 ≥ 1.85(内置 Node 18,全局 fetch 可用;分片上传用的是 Node 自带的 https,插件没有引入 HTTP 库)。

打包

npm run package      # 生成 adrive-studio-<version>.vsix
  • Contact us
  • Jobs
  • Privacy
  • Manage cookies
  • Terms of use
  • Trademarks
  • Your Privacy Choices
  • Consumer Health Privacy
© 2026 Microsoft