eDEX-UI音效系统与用户体验优化
eDEX-UI通过精心设计的好莱坞黑客风格音效系统,为用户创造了沉浸式的未来科技体验。系统采用模块化的AudioManager类统一管理音效资源,集成Howler.js音频库实现高质量播放控制。包含12种不同类型的音效,每种都有特定的应用场景和情感表达,从标准输入输出的stdin/stdout音效到系统警告的alarm/error音效,形成了完整的音频反馈体系。音效设计遵循未来科技感、功能性反馈和情感化设计三大原则,通过电子合成音色、明确的语义含义和情感化的音调变化,让普通的命令行操作充满戏剧性和情感张力。
好莱坞黑客风格音效设计
eDEX-UI的音效系统是其沉浸式用户体验的核心组成部分,完美再现了好莱坞科幻电影中黑客操作的经典音效氛围。通过精心设计的音频反馈机制,为用户创造出仿佛置身于未来科技世界的听觉体验。
音效架构与实现
eDEX-UI采用模块化的音效管理系统,通过AudioManager类统一管理所有音效资源。系统使用Howler.js音频库来实现高质量的音频播放和控制功能。
class AudioManager {
constructor() {
const path = require("path");
const {Howl, Howler} = require("howler");
if (window.settings.audio === true) {
// 标准输入输出音效
this.stdout = new Howl({src: [path.join(__dirname, "assets", "audio", "stdout.wav")], volume: 0.4});
this.stdin = new Howl({src: [path.join(__dirname, "assets", "audio", "stdin.wav")], volume: 0.4});
// 交互反馈音效
this.folder = new Howl({src: [path.join(__dirname, "assets", "audio", "folder.wav")]});
this.granted = new Howl({src: [path.join(__dirname, "assets", "audio", "granted.wav")]});
// 系统操作音效
this.keyboard = new Howl({src: [path.join(__dirname, "assets", "audio", "keyboard.wav")]});
this.theme = new Howl({src: [path.join(__dirname, "assets", "audio", "theme.wav")]});
this.expand = new Howl({src: [path.join(__dirname, "assets", "audio", "expand.wav")]});
this.panels = new Howl({src: [path.join(__dirname, "assets", "audio", "panels.wav")]});
// 状态提示音效
this.scan = new Howl({src: [path.join(__dirname, "assets", "audio", "scan.wav")]});
this.denied = new Howl({src: [path.join(__dirname, "assets", "audio", "denied.wav")]});
this.info = new Howl({src: [path.join(__dirname, "assets", "audio", "info.wav")]});
this.alarm = new Howl({src: [path.join(__dirname, "assets", "audio", "alarm.wav")]});
this.error = new Howl({src: [path.join(__dirname, "assets", "audio", "error.wav")]});
Howler.volume(window.settings.audioVolume);
}
}
}
音效分类与应用场景
eDEX-UI的音效系统包含12种不同类型的音效,每种音效都有其特定的应用场景和情感表达:
| 音效类型 | 文件名称 | 应用场景 | 情感表达 |
|---|---|---|---|
| 标准输出 | stdout.wav | 终端字符输出 | 数据流动感 |
| 标准输入 | stdin.wav | 键盘输入确认 | 操作确认感 |
| 文件夹操作 | folder.wav | 文件浏览导航 | 界面切换感 |
| 权限授予 | granted.wav | 操作成功反馈 | 成功成就感 |
| 键盘反馈 | keyboard.wav | 虚拟键盘操作 | 物理交互感 |
| 主题切换 | theme.wav | 界面主题变更 | 环境转换感 |
| 面板展开 | expand.wav | 界面元素展开 | 空间扩展感 |
| 面板操作 | panels.wav | 面板交互操作 | 机械操作感 |
| 扫描检测 | scan.wav | 系统扫描过程 | 探测搜索感 |
| 操作拒绝 | denied.wav | 权限拒绝反馈 | 警告阻止感 |
| 信息提示 | info.wav | 普通信息提示 | 通知提醒感 |
| 警报警告 | alarm.wav | 严重警告提示 | 紧急危险感 |
| 错误报告 | error.wav | 系统错误发生 | 故障异常感 |
音效设计原则
eDEX-UI的音效设计遵循好莱坞科幻电影的音效美学原则:
未来科技感:所有音效都采用电子合成音色,避免使用自然声源,营造出高科技设备的听觉体验。
功能性反馈:每个音效都有明确的语义含义,为用户操作提供清晰的听觉反馈,增强交互的可理解性。
情感化设计:通过音调、节奏和音色的变化,传达不同的情感状态,从成功的喜悦到错误的警示。
graph TD
A[用户操作] --> B{操作类型}
B --> C[终端输入]
B --> D[界面交互]
B --> E[系统状态]
C --> F[触发 stdin 音效]
C --> G[触发 stdout 音效]
D --> H[触发 keyboard 音效]
D --> I[触发 panels 音效]
D --> J[触发 expand 音效]
E --> K[成功: granted]
E --> L[警告: alarm]
E --> M[错误: error]
E --> N[信息: info]
F --> O[听觉反馈]
G --> O
H --> O
I --> O
J --> O
K --> O
L --> O
M --> O
N --> O
O --> P[沉浸式用户体验]
技术实现细节
音频性能优化:系统采用音频池和预加载机制,确保音效播放的即时性和流畅性,避免音频延迟影响用户体验。
音量控制体系:支持全局音量调节和个别音效的音量控制,stdin/stdout音效默认使用0.4的音量级别以避免听觉疲劳。
错误处理机制:通过Proxy模式实现安全的音效访问,即使音效未加载完成也不会导致系统崩溃。
// 安全的音效访问代理
return new Proxy(this, {
get: (target, sound) => {
if (sound in target) {
return target[sound];
} else {
return {
play: () => {return true;}
}
}
}
});
音效与视觉的协同
eDEX-UI的音效设计与视觉界面高度协同,创造出多感官的沉浸式体验:
时空同步:音效与视觉动画精确同步,如面板展开时同时播放expand音效,增强操作的物理真实感。
情感共鸣:错误模态框显示时播放error音效,成功操作时播放granted音效,形成视听情感的一致性。
环境营造:启动时的theme音效与视觉启动动画配合,共同营造出科幻环境的氛围感。
这种精心设计的好莱坞黑客风格音效系统,不仅提供了功能性的操作反馈,更重要的是为用户创造了一种身临其境的未来科技体验,让普通的命令行操作变得充满戏剧性和情感张力。
音频管理器类的实现原理
eDEX-UI的音频系统是其科幻用户体验的核心组成部分,AudioManager类作为音效系统的核心控制器,采用了现代化的音频处理技术和设计模式,为用户提供沉浸式的操作反馈。
核心架构设计
AudioManager类采用了单例模式的设计理念,通过构造函数初始化所有的音效资源,并利用JavaScript的Proxy模式提供安全的访问机制。这种设计确保了音效系统的稳定性和可靠性。
classDiagram
class AudioManager {
-stdout: Howl
-stdin: Howl
-folder: Howl
-granted: Howl
-keyboard: Howl
-theme: Howl
-expand: Howl
-panels: Howl
-scan: Howl
-denied: Howl
-info: Howl
-alarm: Howl
-error: Howl
+constructor()
-initSounds()
-setupProxy()
}
class Howl {
+src: string[]
+volume: number
+play(): void
+stop(): void
}
class Howler {
+volume: number
+mute(): void
+unmute(): void
}
AudioManager --> Howl
AudioManager --> Howler
音效资源初始化机制
AudioManager在构造函数中通过动态路径解析技术加载所有音效文件:
constructor() {
const path = require("path");
const {Howl, Howler} = require("howler");
if (window.settings.audio === true) {
if(window.settings.disableFeedbackAudio === false) {
this.stdout = new Howl({
src: [path.join(__dirname, "assets", "audio", "stdout.wav")],
volume: 0.4
});
// 其他音效初始化...
}
// 更多音效初始化...
}
}
音效分类与功能对应
AudioManager管理的音效分为多个类别,每个类别对应特定的用户交互场景:
| 音效类型 | 文件名称 | 音量设置 | 使用场景 |
|---|---|---|---|
| 标准输出 | stdout.wav | 0.4 | 终端命令输出时播放 |
| 标准输入 | stdin.wav | 0.4 | 用户输入命令时播放 |
| 文件夹操作 | folder.wav | 默认 | 文件浏览器操作时播放 |
| 权限授予 | granted.wav | 默认 | 操作成功授权时播放 |
| 键盘输入 | keyboard.wav | 默认 | 每次按键时播放 |
| 主题切换 | theme.wav | 默认 | 更换界面主题时播放 |
| 面板展开 | expand.wav | 默认 | 展开功能面板时播放 |
| 面板操作 | panels.wav | 默认 | 面板切换操作时播放 |
| 扫描效果 | scan.wav | 默认 | 系统扫描过程中播放 |
| 操作拒绝 | denied.wav | 默认 | 操作被拒绝时播放 |
| 信息提示 | info.wav | 默认 | 显示信息提示时播放 |
| 警报通知 | alarm.wav | 默认 | 系统警报触发时播放 |
| 错误提示 | error.wav | 默认 | 发生错误时播放 |
智能代理保护机制
AudioManager采用了Proxy设计模式来确保音效系统的稳定性:
return new Proxy(this, {
get: (target, sound) => {
if (sound in target) {
return target[sound];
} else {
return {
play: () => {return true;}
}
}
}
});
这种机制确保了即使某个音效未正确加载,调用其play方法也不会导致程序崩溃,而是静默返回成功状态。
音量控制体系
音效系统支持全局音量控制和个性化音量设置:
flowchart TD
A[音频设置检查] --> B{音频启用?}
B -->|是| C{反馈音效启用?}
B -->|否| D[设置Howler音量为0]
C -->|是| E[初始化所有音效]
C -->|否| F[初始化部分音效]
E --> G[应用全局音量设置]
F --> G
G --> H[创建代理保护]
D --> H
配置驱动的音效管理
AudioManager完全由配置系统驱动,支持动态调整:
Howler.volume(window.settings.audioVolume);
这种设计使得用户可以通过设置界面实时调整音效音量,甚至完全禁用音效系统,提供了极大的灵活性。
性能优化策略
- 延迟加载:音效资源在构造函数中按需初始化
- 内存管理:通过Howler.js自动管理音频缓冲区和内存
- 错误隔离:Proxy模式确保单个音效故障不影响整体系统
- 资源复用:相同的音效实例被多个组件共享使用
AudioManager类的实现展现了现代JavaScript应用程序中音效系统的最佳实践,通过精心的架构设计和错误处理机制,为用户提供了既炫酷又稳定的音频体验。这种设计模式不仅适用于eDEX-UI,也可以为其他需要复杂音效管理的应用程序提供参考。
触摸屏支持与虚拟键盘集成
eDEX-UI作为一款面向未来科技感的终端模拟器,其触摸屏支持和虚拟键盘集成是其最突出的特色功能之一。这一功能不仅提供了完整的触摸交互体验,还通过精心设计的音频反馈系统,为用户创造了沉浸式的科幻操作感受。
多触点触摸事件处理机制
eDEX-UI的虚拟键盘实现了完整的触摸事件支持,通过监听touchstart、touchend和touchcancel事件来处理多触点交互。系统能够同时识别和处理多个触摸点,为真正的多指操作提供了技术基础。
// 多触点支持实现 (#100)
this.container.addEventListener("touchstart", e => {
e.preventDefault();
for (let i = 0; i < e.changedTouches.length; i++) {
let key = e.changedTouches[i].target.parentElement;
if (key.tagName === 'svg') key = key.parentElement;
if (key.getAttribute("class").startsWith("keyboard_key")) {
key.setAttribute("class", key.getAttribute("class")+" active");
key.onmousedown({preventDefault: () => {return true}});
}
}
});
虚拟键盘架构设计
eDEX-UI的虚拟键盘采用模块化设计,支持多种键盘布局配置。系统通过JSON文件定义键盘布局,每个按键都包含完整的元数据信息:
| 属性字段 | 描述 | 示例值 |
|---|---|---|
name |
主键显示名称 | "Q" |
cmd |
基础命令字符 | "q" |
shift_name |
Shift状态显示名 | "Q" |
shift_cmd |
Shift状态命令 | "Q" |
alt_cmd |
Alt组合键命令 | "~ |
fn_name |
功能键显示名 | "F1" |
fn_cmd |
功能键命令 | "~ |
音频反馈系统集成
虚拟键盘与音频系统的深度集成是eDEX-UI用户体验的核心特色。每次按键操作都会触发相应的音效反馈:
sequenceDiagram
participant User
participant Keyboard
participant AudioManager
participant Terminal
User->>Keyboard: 触摸按键
Keyboard->>AudioManager: 播放stdin音效
Keyboard->>Terminal: 发送字符命令
AudioManager-->>User: 音频反馈
Terminal-->>User: 字符显示反馈
系统支持多种音效类型,每种音效都有特定的使用场景:
| 音效类型 | 文件 | 使用场景 | 音量 |
|---|---|---|---|
stdin |
stdin.wav | 普通按键 | 0.4 |
granted |
granted.wav | Enter键 | 默认 |
keyboard |
keyboard.wav | 键盘显示 | 默认 |
theme |
theme.wav | 主题切换 | 默认 |
动态键盘状态管理
虚拟键盘实现了复杂的状态管理系统,能够实时跟踪和显示各种修饰键状态:
// 键盘状态管理
this.container.dataset.isShiftOn = false;
this.container.dataset.isCapsLckOn = false;
this.container.dataset.isAltOn = false;
this.container.dataset.isCtrlOn = false;
this.container.dataset.isFnOn = false;
this.container.dataset.passwordMode = false;
状态变化会实时反映在键盘的视觉表现上,通过CSS选择器实现动态样式切换:
section#keyboard[data-is-shift-on="true"] > div.keyboard_row > div.keyboard_key > h2:not(:empty) {
position: relative;
top: 0.278vh;
font-size: 2.4vh;
margin: 0vh 0.46vh;
}
国际化键盘布局支持
eDEX-UI提供了丰富的键盘布局选择,支持全球多种语言和键盘标准:
graph TB
A[键盘布局系统] --> B[美式布局]
A --> C[英式布局]
A --> D[德语布局]
A --> E[法语布局]
A --> F[西语布局]
A --> G[特殊布局]
G --> G1[Dvorak]
G --> G2[Colemak]
G --> G3[Workman]
G --> G4[Norman]
每种布局都经过精心设计,确保字符映射和功能键配置符合当地使用习惯。
响应式设计与动画效果
虚拟键盘采用响应式设计,能够适应不同屏幕尺寸和设备类型。键盘的显示和隐藏都配有流畅的动画效果:
section#keyboard.animation_state_2 > div.keyboard_row:nth-child(1) {
transition: width .7s cubic-bezier(0.4, 0, 1, 1) .3s, filter .1s linear .8s;
}
section#keyboard.animation_state_2 > div.keyboard_row:nth-child(2) {
transition: width .7s cubic-bezier(0.4, 0, 1, 1) .2s, filter .1s linear .6s;
}
物理键盘同步机制
eDEX-UI还实现了物理键盘与虚拟键盘的同步机制,当用户使用物理键盘时,虚拟键盘会相应显示按键状态:
this.keydownHandler = e => {
if (e.code === "ControlLeft" || e.code === "ControlRight")
this.container.dataset.isCtrlOn = true;
if (e.code === "ShiftLeft" || e.code === "ShiftRight")
this.container.dataset.isShiftOn = true;
// ... 其他按键处理
};
这种双向同步确保了无论用户使用触摸屏还是物理键盘,都能获得一致的操作体验。
性能优化与用户体验
考虑到触摸屏设备的性能特点,eDEX-UI对虚拟键盘进行了多项优化:
- 事件委托:使用事件委托减少事件监听器数量
- 防抖处理:对快速连续触摸进行优化处理
- 内存管理:及时清理不再使用的DOM元素和事件监听器
- CSS硬件加速:使用transform和opacity实现流畅动画
通过这种全面的触摸屏支持和虚拟键盘集成,eDEX-UI成功地将传统的命令行界面转化为适合现代触摸设备的交互体验,同时保持了其标志性的科幻美学风格。
快捷键系统与用户交互优化
eDEX-UI的快捷键系统是其科幻界面体验的核心组成部分,通过精心设计的键盘交互机制,为用户提供了高效、直观的操作方式。该系统不仅支持传统的键盘快捷键,还实现了虚拟屏幕键盘与物理键盘的无缝集成,创造出独特的未来科技感用户体验。
快捷键架构设计
eDEX-UI的快捷键系统采用分层架构设计,通过Keyboard类统一管理所有键盘交互逻辑。系统支持多种类型的快捷键操作:
classDiagram
class Keyboard {
+constructor(opts)
+pressKey(key)
+detach()
+attach()
-_shortcuts: Object
-container: HTMLElement
}
class ShortcutManager {
+registerKeyboardShortcuts()
+useAppShortcut(action)
}
class AudioManager {
+stdout: Howl
+stdin: Howl
+granted: Howl
+playFeedbackSound()
}
Keyboard --> ShortcutManager : 触发
Keyboard --> AudioManager : 音效反馈
系统将快捷键分为两大类别:
- 应用快捷键:控制eDEX-UI本身的界面功能
- Shell快捷键:直接向终端发送命令序列
快捷键配置与注册
eDEX-UI使用JSON配置文件管理快捷键设置,支持动态加载和注册:
// 快捷键配置示例
{
"trigger": "Ctrl+Shift+T",
"action": "NEW_TAB",
"type": "app",
"enabled": true
}
系统启动时通过registerKeyboardShortcuts()函数自动注册所有启用的快捷键:
window.registerKeyboardShortcuts = () => {
window.shortcuts.forEach(cut => {
if (!cut.enabled) return;
if (cut.type === "app") {
globalShortcut.register(cut.trigger, () => {
window.useAppShortcut(cut.action);
});
}
});
};
核心快捷键功能
eDEX-UI内置了丰富的快捷键功能,涵盖界面导航、终端操作和系统控制:
| 快捷键组合 | 功能描述 | 类型 |
|---|---|---|
| Ctrl+Tab | 切换到下一个终端标签 | 应用 |
| Ctrl+Shift+Tab | 切换到上一个终端标签 | 应用 |
| Ctrl+1 到 Ctrl+5 | 快速切换到指定标签页 | 应用 |
| Ctrl+C | 终端复制操作 | Shell |
| Ctrl+V | 终端粘贴操作 | Shell |
| Ctrl+Shift+S | 打开设置面板 | 应用 |
| Ctrl+Shift+F | 启动模糊搜索 | 应用 |
虚拟键盘交互机制
eDEX-UI的虚拟键盘系统实现了完整的触摸交互支持:
sequenceDiagram
participant User
participant VirtualKey
participant Keyboard
participant Terminal
User->>VirtualKey: 触摸/点击
VirtualKey->>Keyboard: pressKey()
Keyboard->>Keyboard: 处理修饰键状态
Keyboard->>Keyboard: 检查快捷键匹配
alt 快捷键触发
Keyboard->>ShortcutManager: useAppShortcut()
ShortcutManager->>Terminal: 执行对应操作
else 普通按键
Keyboard->>Terminal: 发送字符序列
end
Keyboard->>AudioManager: 播放反馈音效
虚拟键盘支持多种交互模式:
- 单点触控:标准按键操作
- 多点触控:同时按下多个按键
- 长按支持:实现按键重复输入功能
- 修饰键状态跟踪:实时显示Shift、Ctrl、Alt状态
音效反馈系统
eDEX-UI为键盘操作配备了丰富的音效反馈,增强用户体验的真实感:
// 键盘音效反馈实现
key.onmousedown = e => {
this.pressKey(key);
if(this.container.dataset.passwordMode == "false")
window.audioManager.stdin.play(); // 按键音效
e.preventDefault();
};
系统包含多种音效类型:
stdin.wav:普通按键音效stdout.wav:命令输出音效granted.wav:操作成功音效denied.wav:操作拒绝音效
用户交互优化策略
eDEX-UI通过多种策略优化键盘交互体验:
1. 视觉反馈优化
div.keyboard_key:active {
background-color: rgba(var(--color_r), var(--color_g), var(--color_b), 1);
border: 0.18vh solid rgba(var(--color_r), var(--color_g), var(--color_b), 0.0);
}
div.keyboard_key.blink {
animation: blink .5s infinite linear;
}
2. 状态同步机制
系统确保虚拟键盘与物理键盘状态完全同步:
// 物理键盘事件映射到虚拟键盘
this.keydownHandler = e => {
if (e.code === "ControlLeft" || e.code === "ControlRight")
this.container.dataset.isCtrlOn = true;
if (e.code === "ShiftLeft" || e.code === "ShiftRight")
this.container.dataset.isShiftOn = true;
};
3. 智能快捷键处理
系统智能处理特殊快捷键场景:
// 特殊TAB_X快捷键处理
if (cut.type === "app" && cut.action === "TAB_X" && cut.trigger === "X") {
for (let i = 1; i <= 5; i++) {
let ncut = Object.assign({}, cut);
ncut.trigger = `${i}`;
ncut.action = `TAB_${i}`;
this._shortcuts[cat].push(ncut);
}
}
自定义快捷键配置
用户可以通过编辑shortcuts.json文件完全自定义快捷键行为:
{
"shortcuts": [
{
"trigger": "Ctrl+Alt+L",
"action": "ls -la",
"type": "shell",
"enabled": true,
"linebreak": true
},
{
"trigger": "Ctrl+Shift+D",
"action": "DEV_DEBUG",
"type": "app",
"enabled": false
}
]
}
性能优化措施
eDEX-UI在快捷键处理上实施了多项性能优化:
- 事件委托:使用单个事件监听器处理所有键盘事件
- 懒加载:音效资源按需加载
- 状态缓存:修饰键状态缓存避免重复计算
- DOM操作优化:最小化虚拟键盘的DOM操作
无障碍访问支持
系统为特殊需求用户提供了无障碍访问功能:
- 高对比度模式:增强键盘可视性
- 密码模式:隐藏按键输入内容
- 音效开关:支持静音操作
- 键盘布局切换:支持多种国际键盘布局
eDEX-UI的快捷键系统通过精心的设计和实现,成功地将科幻电影中的交互体验转化为现实可用的功能,为用户提供了既美观又实用的操作方式。系统的模块化设计和扩展性保证了未来功能的持续演进和优化。
eDEX-UI的音效系统和用户交互设计成功再现了好莱坞科幻电影中的黑客操作体验,通过精心设计的音频反馈机制、虚拟键盘集成和快捷键系统,创造了多感官的沉浸式体验。系统采用模块化架构,支持12种音效类型,每种都有明确的应用场景和情感表达。技术实现上采用AudioManager类统一管理、Proxy模式错误保护、音频性能优化等策略,确保了系统的稳定性和流畅性。虚拟键盘支持多触点操作和物理键盘同步,快捷键系统提供高效的操作方式。这种综合的音效与交互设计不仅提供了功能性的操作反馈,更重要的是为用户创造了一种身临其境的未来科技体验,展现了现代应用程序音效系统的最佳实践。
Kimi-K2.5Kimi K2.5 是一款开源的原生多模态智能体模型,它在 Kimi-K2-Base 的基础上,通过对约 15 万亿混合视觉和文本 tokens 进行持续预训练构建而成。该模型将视觉与语言理解、高级智能体能力、即时模式与思考模式,以及对话式与智能体范式无缝融合。Python00- QQwen3-Coder-Next2026年2月4日,正式发布的Qwen3-Coder-Next,一款专为编码智能体和本地开发场景设计的开源语言模型。Python00
xw-cli实现国产算力大模型零门槛部署,一键跑通 Qwen、GLM-4.7、Minimax-2.1、DeepSeek-OCR 等模型Go06
PaddleOCR-VL-1.5PaddleOCR-VL-1.5 是 PaddleOCR-VL 的新一代进阶模型,在 OmniDocBench v1.5 上实现了 94.5% 的全新 state-of-the-art 准确率。 为了严格评估模型在真实物理畸变下的鲁棒性——包括扫描伪影、倾斜、扭曲、屏幕拍摄和光照变化——我们提出了 Real5-OmniDocBench 基准测试集。实验结果表明,该增强模型在新构建的基准测试集上达到了 SOTA 性能。此外,我们通过整合印章识别和文本检测识别(text spotting)任务扩展了模型的能力,同时保持 0.9B 的超紧凑 VLM 规模,具备高效率特性。Python00
KuiklyUI基于KMP技术的高性能、全平台开发框架,具备统一代码库、极致易用性和动态灵活性。 Provide a high-performance, full-platform development framework with unified codebase, ultimate ease of use, and dynamic flexibility. 注意:本仓库为Github仓库镜像,PR或Issue请移步至Github发起,感谢支持!Kotlin07
VLOOKVLOOK™ 是优雅好用的 Typora/Markdown 主题包和增强插件。 VLOOK™ is an elegant and practical THEME PACKAGE × ENHANCEMENT PLUGIN for Typora/Markdown.Less00