QuickAdd 设置光标位于代码块内时 Tab 缩进输入 2 空格

我关闭了“选项 - 编辑器 - 使用制表符”,所以按 Tab 键不会输入制表符,而是输入制表符宽度对应的空格数。

基本配置参 QuickAdd JS & Templater JS 简介及相互修改
“QuickAdd Macro 加载 QuickAdd Capture”。

效果 GIF,点击展开

一个紫点表一个空格。

20240504_163712

js quickadd 代码
const codeTab = shift=> {
  const act = app.workspace.activeEditor; if (!act) return; const { editor, containerEl } = act
  , pos = containerEl.querySelector('.cm-active.cm-line').classList.contains('HyperMD-codeblock')
  if (!pos) return; const from = editor.getCursor('from'), to = editor.getCursor('to')
  , lead = line=> editor.getLine(line).slice(0, 2).match(/ /g)?.length, offset = lead(to.line)
  for (let line = from.line; line <= to.line; line++) {
    if (shift) {
      if (!lead(line)) continue; editor.replaceRange('', {line, ch: 0}, {line, ch: lead(line)})
    } else editor.replaceRange('  ', {line, ch: 0})
  }
  (from.line == to.line && from.ch == to.ch) ? from.ch == 0 && editor.setCursor(from.line, 2)
  : editor.setSelection(from, {line: to.line, ch: shift ? to.ch-offset : to.ch+2}); return false
}
app.scope.register([], 'Tab', ()=> codeTab(0)); app.scope.register(['Shift'], 'Tab', ()=> codeTab(1))

要想自定义 Tab 键行为,先要阻止软件默认 Tab 键行为。
很神奇试图使用 .onkeydown = ev=> ev.preventDefault() 不起作用,
最后使用了现在的方案。
若有坛友能成功使用这个方法,希望告知。

另,我知道一些坛友希望在行中间按下 Tab 时,空格插入到光标位置而不是行首,
【已解决】类似其他软件的 tab 功能
本话题代码提供了阻止 Tab 默认行为的方法,可基于此修改实现期望效果。
// 代码使用 editor.replaceRange() 替换,想输入制表符只需将空格改为制表符。
// 查询“制表符宽度”设置值的 API 是 app.vault.getConfig('tabSize')

另,可能有坛友觉得把制表符宽度全部设置为 2 不就好了吗?
我曾想过统一文章缩进和代码缩进的空格数,
花了一晚上将所有用 4 空格缩进的列表改为 2 空格,又花了一晚上改回去。
改回去的原因已记不清,但结论是不建议更改。
不知有无坛友长期使用 2 空格缩进,可以说说感受和建议,
若确有优势,也许我还会改回统一用 2 空格。