跳转到内容
moshpit

键盘、主题与快捷键

第一部分。12 个格位,22 个内置键,拖动排序的编辑器。还可以自己造键。

第二部分。蓝牙键盘能做什么、不能做什么,拼音和日文输入为什么要专门修一次。

第三部分。8 套终端主题和一个调色器,10 种字体,8 个 App 图标,强调色自己定。

这条栏由 Moshpit 自己绘制,系统的 input accessory view 已关掉。你看到的是 App 的栏,不是键盘自带的。最多放 12 个键,出厂 6 个。

设置 → KEYBOARD · KEYS → Shortcuts

新装的 App,栏上依次是 esc、tab、^C、^L、粘贴和方向摇杆。另外 16 个内置键放在编辑器的 AVAILABLE 列表里,需要时再加。有三个键在栏上显示图标而不是文字:粘贴是剪贴板,摇杆是四向箭头,翻历史是上下箭头。paste、✛、⇅ 这几个名字只出现在编辑器列表里。

  • 横向拖动这一排,能把屏幕外的键拉进来
  • 显示/隐藏键盘的按钮在拖动区域之外,位置固定
  • 设置里那一行直接显示占用情况,比如 6/12、9/12

Shortcuts 编辑器:上方是这条栏的实时预览,下方是可拖动排序的键列表

编辑器分四组。PREVIEW 实时渲染这条栏最终的样子。IN TOOLBAR · n/12 就是栏本身:拖 ≡ 调顺序,点红色 − 移出。CUSTOM 是你自己做的键。AVAILABLE 是当前不在栏上的全部内置键,每个带一个绿色 +,点了加回来。

  • 移出内置键不是删除,它只是回到 AVAILABLE,内置键丢不了。自定义键不一样:CUSTOM 组里的红色 − 是真删,没有撤销。
  • 只有栏本身能排序。AVAILABLE 不能手动排,它按存储顺序显示,重排栏时会跟着变。
  • 版本更新加了新的内置键,而你的栏已经满了,新键会进 AVAILABLE,不会悄悄消失。

其中两个专门给编程智能体用:⌃End 把 Claude Code 长长的对话跳到最新一行,⇧Tab 切换它的模式。这两个在软键盘上打不出来:没有 End 键,Shift-Tab 也得有实体 Tab。

Shortcuts 编辑器的 AVAILABLE 列表:当前不在栏上的内置键,每个都带一个绿色 + 可以加回去

键 作用
ctrl Control,粘滞,只生效一次
⇅ 翻历史
⌃End 跳到末尾
⇧Tab 反向 Tab/切换模式
^D 文件结束(EOF)
^R 反向搜索
^A 行首
^E 行尾
^W 删一个词
^Z 挂起
↑ / ↓ 上一条/下一条历史命令
Home / End Home、End
PgUp / PgDn 上翻页、下翻页

✛ 方向摇杆。它是一个带死区、按主轴判断方向的摇杆:先按住,再推。进入一个方向时发一次,按住不放就连发。普通方向键走摇杆自己的编码器,所以 application-cursor 模式照常生效,shell 的历史搜索也不受影响。生效前那一下短按是故意的:这条栏离底部的 Home 指示条很近,iOS「上滑回桌面」的手势可能就从这个键上起手。要是碰到就发,这一滑的方向就会当成真的方向键发到远端。

⇅ 翻历史。往上拖看更早的,往下拖看更新的,一步三行,按住不放就一直翻。它放在栏上而不是终端画面上,是为了不和点击聚焦、长按选中这两个手势冲突。翻的是谁那边的历史,取决于会话类型,下面单独说。

ctrl 粘滞键。点它,再打一个字母,这个字母就按对应的控制码发出去,然后键自动解除。点栏上任何别的控件(esc、tab、paste、摇杆)也会解除它,不会粘到你没打算按的键上。

只有普通 shell 的历史留在手机上。其他情况下历史在服务端,这个键是请服务端翻页。这么做是对的,但也说明「翻历史」不是纯本地操作。你至少该知道自己用的是哪一种。

  • 纯 SSH,或 mosh 下的普通 shell:翻 Moshpit 自己的缓冲,什么都不往外发。当前程序接管了鼠标的话,它收到的是合成出来的滚轮事件。
  • SSH + tmux:接管了鼠标的程序(Claude Code、vim)通过控制模式连接收到滚轮事件。普通 shell 翻的是本地留的一份窗格历史,连上时预先取好,你在看的时候新输出先攒着。不会进 tmux 的 copy-mode(见滚动)。
  • mosh + tmux:接管鼠标的程序收滚轮事件,普通 shell 收 tmux copy-mode 按键,都走 mosh 那条路。因为 mosh 画出来的那块屏幕是 copy-mode 唯一会重绘的地方。翻页做了节流,按住不放也不会一口气把历史翻穿。
  • herdr:发一条 terminal.scroll 消息,由服务端决定是滚轮还是翻历史。herdr 在本地完全没有回滚:它的帧是整屏重绘,不是追加的字节流。手机上攒不出可翻的历史,每翻一步都是一次往返。

在 Shortcuts 编辑器右上角点 +。Add Shortcut 是一整屏表单,从上往下填。顶部有这个键的实时预览和一个 SLOT n/12 读数,让你知道这一格花在哪。

  • TYPE:Key Combo 发修饰键加主键。Text 原样输入一段文字。Command 输入一条命令并按回车。
  • QUICK KEYS:41 个预设,分 PREFIX、CONTROL、SPECIAL、NAVIGATION、F-KEYS(F1–F12)五组。点一个填入触发键,再改标签。PREFIX 组第一个就是多路复用器前缀 C-b,tmux 和 herdr 默认都是它。
  • TRIGGER:四个修饰键开关 ⌃ ⌥ ⇧ ⌘,加一个主键。手机上 ⌘ 按 Control 的语义送进 PTY。
  • ACTION:实际发送的内容。\r、\n、\t、\e 会解释成对应的控制字符,转义序列可以直接写。Append Return 在末尾补 ⏎ 提交。
  • DISPLAY:键上的标签最多 6 个字符。Description 是编辑器列表里显示的说明。
  • SCOPE:留空,这个键处处可见。绑定到某几台主机,就只在那些连接上出现。实际用到超过 12 个键,靠的就是这个。

填了 ACTION,TRIGGER 就不算数。Key Combo 只要 ACTION 里有内容,就原样发送,上面的修饰键和主键一律忽略。有几个快捷预设(S-Tab、Del、BSpace、Home、End、PgUp、PgDn 和全部 F 键)填的是 ACTION 而不是 TRIGGER。事后改 TRIGGER 不会有任何变化,得先清空 ACTION。

这个表单里有两处,实际做的比看上去少

Section titled “这个表单里有两处,实际做的比看上去少”

这两处都是当前版本的真实情况。先说清楚,免得你照着它们排计划。

  • Color 色块存了,但没画。栏上每个键,不管内置还是自定义,都是同一种深灰色圆角键。你的选择会保存下来,但现在栏上没有颜色区分。
  • 「Repeat on hold」不是逐键开关。不管开不开,每个 Key Combo 键按住都会连发。副标题写的是按住 0.4 秒后每秒 30 次,实际大约 0.3 秒开始,每秒 14 次左右。按「按住会连发」理解就行。

SCOPE 组还有一个开关 Only in a multiplexer,说明写的是「只在会话跑着 tmux 或 herdr 时显示」。发前缀组合键的键适合放这里。在纯 SSH 的 shell 上,它只是占位。

这个开关早先只认 tmux,herdr 会话算作「不在多路复用器里」,结果你标记过的键在唯一想用它的那条连接上悄悄消失了。这个问题已经修好。存储字段保留旧名字,是为了让已保存的快捷键还能读出来,变的只是含义。

「在多路复用器里」的准确定义:App 在这条连接上握着一条活的 tmux 或 herdr 控制通道,而不是「屏幕上出现了 tmux 这个词」。走 mosh 时,这条控制通道是另开的一条轻量 SSH 连接,因为 mosh 传的是渲染好的画面,带不了 tmux -CC,也带不了 herdr 的帧协议。主机不给 Moshpit 开这条旁路连接,就算你眼睛看着会话里跑着多路复用器,这个键也不会出现。

两边的前缀默认都是 ⌃ b,所以 PREFIX 那个预设对谁都对。分歧在前缀后面绑的是什么。Moshpit 的面板会按每条连接的多路复用器打印正确的键位,就是因为这一点。

你要做的 tmux herdr
列出会话/工作区 ⌃ b s ⌃ b w
切换窗口/标签页 ⌃ b 再按 1–9 ⌃ b n / ⌃ b p,逐个切换,不能按数字跳
窗格 ⌃ b q 列出窗格 ⌃ b v 分屏。herdr 没有「列出窗格」这个键

记住 ⌃ b q:在 tmux 里是列出窗格,在 herdr 里是断开连接。名词也不同,tmux 叫 Session 和 Window,herdr 叫 Workspace 和 Tab。

这是两件不同的事。一件由终端引擎负责,键盘配对上就能用。另一件专门修过,而且专门决定了哪些东西不打开。

物理按键事件直接进终端,终端需要的键本来就都在:

  • 方向键,识别 application-cursor 模式。⌥←/⌥→ 发 emacs 的按词移动,⌃←/⌃→ 发 control-left/right
  • Esc、Tab、Shift-Tab(反向 Tab)、前向删除
  • Home 和 End。Page Up 和 Page Down 在远端不处于 application-cursor 模式时翻的是画面
  • Control 组合键。Option 当 Meta 用,运行时用 ⌥⌘O 切换
  • 功能键到 F11。长按 0.4 秒开始重复,之后每 0.1 秒一次。

边界说清楚:Moshpit 没有外接键盘的键位重映射。没有 App 级的 ⌘ 快捷键,没有键位设置页,F12 及以上没有任何作用。Shortcuts 编辑器只管屏幕上那条栏。外接键盘打不出来的键,放到栏上去。

终端视图一般会关掉自动纠错、拼写检查和智能引号。对 shell 来说这是对的。但在真机上,这些一关,键盘的联想区也跟着塌掉,而拼音和日文输入法的候选栏正是画在那里。结果就是一个候选都看不到。

Moshpit 只为这一件事,在终端上重新打开了拼写检查。自动纠错仍然关着,shell 里的命令不会改写,ls 不会变成 last。自动大写、智能引号和智能连字符也都关着,'foo' 和 --flag 发出去就是你打的样子。

键盘弹出、收起、改变高度的过程中,终端画布尺寸是冻住的,中英文键盘互切也算在内。切换途中重排会把画面弄花。

设置 → DISPLAY → Theme。每一行都把配色直接画出来:一个迷你终端,加八个基础 ANSI 色块。一串主题名字回答不了你在这里唯一关心的问题。

设置 → Display

长按内置主题,选 Duplicate & Edit。长按自己的主题,有 Edit、Duplicate、Copy JSON、Delete。+ 菜单里是 New Theme 和 Import JSON…。

  • 内置主题只读,复制一份是唯一的入口
  • 删掉正在用的主题,自动切回默认
  • 8 套内置全是深色。没有浅色终端主题。

设置页:强调色、App 图标、终端字体、字号和主题几行

主题 背景色
GitHub Dark #050507 默认
Liquid Glass #0E1019 深色玻璃质感
Bioluminescent #0D1117
Dracula #282A36
Nord #2E3440
Solarized Dark #002B36
Monokai #272822
Tokyo Night #1A1B26

屏幕顶部是一段假的 git status 会话,用你正在编辑的配色画出来。选它是因为一屏就能同时看到提示符的绿、路径的蓝、diff 的红绿一对、警告的黄,还有暗色的次要文字。点 Save 之前什么都不会生效。中途退出,正在跑的终端一点没变。

四组:NAME、TERMINAL(背景、前景、光标)、ANSI COLORS(「shell、diff 和 TUI 就用这八个颜色上色」)、BRIGHT COLORS。

亮色默认自动推导:每个亮色是对应基础色朝白色混 32%。这里故意没用 xterm 手工挑的那张表。这样提亮结果可预期,色相不变,绝不会更暗。而且和「把基础色直接抄进亮色」不同,亮黑和黑能区分开。很多工具用亮黑画灰字,两者一样就等于看不见。想完全自己定,打开 Override bright colors。

导出的 JSON 格式化过,键名排过序。同一套主题再导一次,得到的是能看的 diff,不是一堆重排。格式故意做成扁平、用人话命名:可以手改,从别的终端模拟器抄来的配色也能直接解出来。

{
"name": "My Palette",
"background": "#0D1117",
"foreground": "#C9D1D9",
"cursor": "#5FE3D8",
"black": "#0A0C10", "red": "#F85149",
"green": "#56D364", "yellow": "#E3B341",
"blue": "#58A6FF", "magenta": "#BC8CFF",
"cyan": "#39C5CF", "white": "#B1BAC4"
// brightBlack … brightWhite 可选
}
  • 简写别名也认:bg、fg、text、cursorColor、caret,以及按位置的 ansi0…ansi15
  • 十六进制接受 #RGB、#RRGGBB、RRGGBB、0xRRGGBB。#RRGGBBAA 也能读,透明度丢掉,终端调色板里没有 alpha 这回事
  • 某个颜色写错了,那一格变成黑色,整份导入不会失败。差一点就对的主题照样能加载,进调色器改掉就行
  • 单个主题和数组都收。每次导入都生成新的 id,payload 里的 id 一律不采用。这样既不会撞上内置主题,也不会覆盖你还想留的主题。重名自动加「 2」「 3」。

设置 → DISPLAY → Font。7 款程序员字体打包在 App 里,在哪台设备上看都一样。另外 3 款来自 iOS。

  • 随 App 打包:JetBrains Mono、Maple Mono、Fira Code、Source Code Pro、IBM Plex Mono、Hack、Anonymous Pro
  • 来自 iOS:SF Mono(默认)、Menlo、Courier

Fira Code 和 JetBrains Mono 都在,但用不到它们的连字。字符终端按字形索引一列放一个字形。带连字的字体会把 ->、!=、== 合成一个字形,后面每个字形都提前一列,整行就乱了。对终端来说关掉才是正确的,也不打算再打开。

内置的程序员字体没有中日韩字形。远端回显的中文,或输入法组词时的浮层,以前会显示成方块。Moshpit 给你选的任何字体挂了一条回退链:PingFang SC、PingFang TC、Hiragino Sans、Apple SD Gothic Neo,再到 Apple Symbols(勾、箭头、制表符这类)和 Apple Color Emoji。ASCII 始终用你选的等宽字体,中日韩字符保持双宽,列对齐不受影响。

设置 → DISPLAY → Font Size 是 8 到 18 磅的滑块,步长 1,默认 9。下面有一行实时样例 ABCdef 012 ~/ssh $。在终端里双指缩放,停在哪个字号就写回这个设置,下次重绘不会弹回去。

设置 → APPEARANCE 里,Accent 和 App Icon 是分开的两行。它们曾经是一个列表,选颜色的同时也换了图标。拆开不是为了好看,是 iOS 的限制决定的。

内置四套:Signal Room(默认,靛蓝)、Teal Line、Terminal Green、Amber Console。自定义强调色只有一个颜色。按下状态和两层淡淡的背景色都从它推出来,而且只存这一个色值。以后推导规则改了,已保存的强调色也跟着变。

  • 编辑器把你选的颜色画在 App 自己界面的模型上:一个 CONNECT 按钮、一个 MOSH 标签、一行选中状态。旁边就是固定的警告色、成功色、错误色,撞色在保存前就看得出来。
  • 状态色永远不变。警告、成功、错误三个颜色固定,不会和强调色混淆。
  • 强调色在你离开这个页面时才生效,不是点一下就换。点的时候那一行先打勾,退出时提交。立刻生效会重建整棵视图树,把这个页面一起顶掉,你会弹回设置页。想比较两个颜色,就得来回进出。

9 个,全是 Liquid Glass,带深色和着色两种外观:Moshpit、Pit、Island、:wq、Prefix、Localhost、Prompt、Cursor、Hail。其中大多数根本不是 App 的标志。这一组是真正不同的图,不是一张图换九个颜色。选择器里显示的是打包进去的真图,不是重新画的,你看到的就是主屏幕上会出现的。

设置 → CURSOR:形状 Block、Bar 或 Underline。颜色可选青、绿、白或你的强调色。Blink 按 1.1 秒的节奏。琥珀色不在列表里,那是漫游时自动切换的颜色。

「Trail on predict」和上面的 Color 色块是同一个情况。开关在,默认开着,说明写的是标出 mosh 预测回显里服务器还没确认的字符。但今天真正会画它的,只有设置页里紧挨着的那个小预览。终端渲染路径没有任何一处读这个设置,真实光标开不开都没有拖尾。

你的选择在每一批输出之后都会重新应用一次。远端程序会随手发光标样式的控制序列,vim、zsh 插件、编程智能体都会。只应用一次的话,下一条序列一来就没了,光标时对时不对。

快捷键和主题会在多台设备之间同步吗?

不会。栏的排列、自定义快捷键、自定义主题和自定义强调色全部存在本机。Moshpit 没有账号,也没有 iCloud 同步,第二台设备从默认状态开始。两边都要用,把主题复制成 JSON 粘过去。

自定义键能用颜色区分吗?

目前不能。Add Shortcut 里的 Color 会保存,但没有任何渲染路径读它。栏上每个键都是同一种深灰色圆角键。

光标拖尾有用吗?

终端里没用。「Trail on predict」存下来了,也画在设置页自己的预览上,但渲染路径没人读它。开和关看到的光标一样。

⇅ 会往服务端发东西吗?

经常会。接管鼠标的程序在哪种连接下都收滚轮事件。普通 shell 在 SSH 下翻的是本地历史,带不带 tmux 都一样,只有 mosh + tmux 才发 copy-mode 按键。herdr 永远发一条 terminal.scroll 消息,由服务端翻页,因为它的帧是整屏重绘,本地攒不出可翻的历史。

外接键盘能改键位吗?

不能。物理按键由终端引擎处理,不可重映射,也没有 App 级的 ⌘ 快捷键。F12 及以上没有作用。Shortcuts 编辑器只管屏幕上那条栏。

有浅色终端主题吗?

没有。8 套内置全是深色。可以在调色器里自己做一套浅色,把背景设成浅的没人拦着,但 App 不自带。

Fira Code 的连字为什么不生效?

故意关的。一列一个字形,终端网格才能对齐。连字把两个字符合成一个字形,后面的内容整体左移一列。这是为了正确性,不是漏做。

栏上能放超过 12 个键吗?

不能,12 是硬上限。绕开的办法是 SCOPE:把键绑到指定主机,或者只在多路复用器会话里显示。它就不会在用不着的连接上占位。