Obsidian 搭配 Vim Mode,提升笔记体验

2023-01-30 20:41:02 +08:00
 jiyee

过去一段时间我开始认真地体验 Obsidian (黑曜石)这款软件,深度使用了一段时间之后便退订了 Ulysses 订阅,将全部的文档都迁移到了 Obsidian 。由于其平台的开放性,Obsidian 的定位不仅仅是笔记软件,更适合作为 PKM 工具使用。

关于 Obsidian 介绍的文章和视频已经不计其数,通过阅读这些优秀的经验分享,让我快速掌握 Obsidian 的使用技巧。之前在论坛里看到一篇文章 「VIM Mode - Quality of Life Improvements - Share & showcase - Obsidian Forum」,介绍了 Obsidian 里如何高效地使用 Vim Mode ,而 Obsidian 吸引我的其中最重要的一点就是支持 Vim Mode 。过去我一直在各种 IDE 里使用 Vim Mode ,已经熟悉了 Vim Mode 操作习惯,在最早支持 Vim Mode 的 Markdown 笔记软件里,我还使用过一段时间的 Haroopad,可惜软件很久没有更新了。Obsidian 经过 2 年多迭代和各类 Vim Mode 周边插件支持,目前 Obsidian 支持的 Vim Mode 功能已经能够我满足日常写作使用,这篇文章就总结一下目前我是如何在 Obsidian 使用 Vim Mode 以及对其周边插件进行完善。

Vim Mode 周边插件

1. Vimrc Support

使用 Vim Mode 一定会使用到 Vimrc Support 这个插件,配合自定义 .obsidian.vimrc 文件,可以实现 Vim Mode 指令管理。经过各种摸索,我自己的配置文件目前如下:.obsidian.vimrc

" Surround Admonition
" https://github.com/esm7/obsidian-vimrc-support/discussions/146
exmap CodeBlockAdmonitionNote obcommand code-block-from-selection:17f30753-d5f4-4953-abed-5027a25ede58
map san :CodeBlockAdmonitionNote
exmap CodeBlockSelectionAdmonitionNote jscommand { editor.setSelections([selection]); this.app.commands.commands['code-block-from-selection:17f30753-d5f4-4953-abed-5027a25ede58'].callback() }
vmap san :CodeBlockSelectionAdmonitionNote

exmap scrollToCenterTop70p jsfile .obsidian.markdown-helper.js {scrollToCursor(0.7)}
nmap zz :scrollToCenterTop70p
" Have j and k navigate visual lines rather than logical ones
nmap j gj
nmap k gk

" I like using H and L for beginning/end of line
nmap H ^
nmap L $
" nmap J 5j
" nmap K 5k
" Moving to next/prev paragraph
nmap [ {
nmap ] }
exmap nextHeading jsfile .obsidian.markdown-helper.js {jumpHeading(true)}
exmap prevHeading jsfile .obsidian.markdown-helper.js {jumpHeading(false)}
nmap g] :nextHeading
nmap g[ :prevHeading
" Emulate Tab Switching https://vimhelp.org/tabpage.txt.html#gt
" requires Pane Relief: https://github.com/pjeby/pane-relief
exmap tabnext obcommand pane-relief:go-next
nmap gt :tabnext
exmap tabprev obcommand pane-relief:go-prev
nmap gT :tabprev
nmap g\ :tabnext
" Zoom in/out
exmap zoomIn obcommand obsidian-zoom:zoom-in
exmap zoomOut obcommand obsidian-zoom:zoom-out
nmap zi :zoomIn
nmap zo :zoomOut

nmap &a :zoomOut
nmap &b :nextHeading
nmap &c :zoomIn
nmap &d :prevHeading
nmap z] &a&b&c
nmap z[ &a&d&c

exmap toggleStille obcommand obsidian-stille:toggleStille
nmap zs :toggleStille
nmap ,s :toggleStille

2. obsidian-vim-reading-view-navigation

这个插件实现了在 Preview 模式下简单的 j/k/gg/G 等光标移动指令,不过该插件没有发布到 Community plugins 市场,只能手动安装。obsidian-vim-reading-view-navigation Allows navigating Obsidian's Reading View with j, k, gg and G

3. obsidian-vim-yank-highlight

高亮 yy 复制行,同样没有发布到 Community plugins 市场,只能手动安装。obsidian-vim-yank-highlight Highlights the current yank. 不过我使用得不多,觉得实用性不强。

中文编辑体验优化

常见的 Vim Mode 里对于中文的支持都是非常差的,Vim 的中文支持及解决思路 - 少数派,这篇文章总结了不少经验。得益于 Obsidian 的插件开放性,能够专门针对中文编辑体验进行优化。

中英文输入法自动切换

第一个想到扩展功能就是中英文输入法切换,希望在切换到 insert 模式自动切换到中文输入法,回到 normal 模式自动切换到英文输入法。已经有一个插件实现了该功能 obsidian-vim-im-switch-plugin,需要搭配 fcitx-remote-for-osx 这个命令行工具使用,我直接修改了源文件 main.m ,替换默认输入法配置( com.apple.keylayout.ABC 和 im.rime.inputmethod.Squirrel.Rime ),重新编译安装即可使用。不过该插件存在 bug ,经常出现切换失灵的问题,提了 PR 修复,不过暂时还没有合入主干发布新版本。

中文分词跳转光标

在 Vim Mode 使用过程中会遇到的一个问题是对于中文分词的逻辑跟英文不一样,Vim 的中文支持及解决思路 - 少数派 这篇文章里详细讲述了可能的三种解决思路,在 Community plugins 市场里找了一圈也没有现成的解决方案,不过发现一个插件 cm-chs-patch 已经实现了中文分词和双击选中的功能,于是花了一点时间在此基础上实现了 Vim Mode 按中文分词跳转光标特性,支持 Vim 模式 by jiyee · Pull Request 19 · cm-chs-patch。最新的 1.10.0 版本已经支持按中文分词跳转光标。不过,因为不能直接修改 Obsidian 里内置的 vim.js 内部实现,只能将 vim.js 的内部实现 fork 出来,好在相关实现属于比较稳定的部分,之后的升级应该不存在太大的困难。

中文标点跳转光标

在中文编辑过程中经常需要按断句跳转或编辑,开发支持了 f<charactor> 键盘映射输入英文标点跳转到对应的中文标点,我自己觉得这个特性还蛮实用的,在词语粒度和段落粒度之间补齐了断句粒度。因为实现相似,同样提交到了cm-chs-patch 插件,不过我觉得放在的这个插件里并不是最恰当的,只不过当时提 PR 的时候一起带上了。

自定义插件开发

另外,还有几个特性是我自己日常使用中的习惯,我正在开发一个 Obsidian-VimEx 插件,目前包括以下几个特性:

之前通过定义 gr<C-w>r 键盘映射到文件重命名功能,在启用 Show inline title 之后, 默认的 Rename file 行为会是跳转到文档头部的 inline title ,且全选标题文字,并不是很方便,实现了一个简单的文件重命名弹窗,重命名行为不会干扰到现有的编辑状态。

我之前一直很少用 Vim Mode 里的 Mark 功能,主要的原因是经常忘记之前 Mark 的标记名称。如果能直接在编辑器里可视化标记 Mark 标记名称或者有一个 Mark 标记名称列表的话,对于跨段落的来回跳转会方便很多。目前实现的是,在行号右侧添加自定义的 Mark 标记名称,会联动 m{x} 键盘映射。

配置 .obsidian.vimrc 过程中发现想找到一个合适的参考配置其实挺不方便的,只有通过 GitHub 或论坛搜索的方式。如果能可视化配置,将全部特性都列出来,直接配置指令即可,甚至能够以社区共享配置的话就更方便了。这个可能会作为一个功能加到插件里。

最后,有其他好的插件,或者有其他特性需求或建议欢迎留言或者提 issue,共同完善 Obsidian Vim Mode 体验。

#Obsidian #Vim

3527 次点击
所在节点    程序员
17 条回复
xell
2023-01-30 20:53:25 +08:00
非常感谢分享,看得出楼主非常喜爱 Vim 操作,也有相当代码基础。那我建议可以尝试考虑 VS Code + Neovim [1],可以获得一个功能接近满血的真·vim ,而非捉襟见肘的插件或模拟。另外,VS Code 也可以很好地实现 Obsidian 类似的笔记功能,例如 Dendron [2] 等。

[1] https://github.com/vscode-neovim/vscode-neovim
[2] https://www.dendron.so
jiyee
2023-01-30 21:11:08 +08:00
@xell 感谢,我了解看看。
acerphoenix
2023-01-30 22:04:09 +08:00
写中文用 vim 想不开,基于 text object 的操作都不能用,模式切换和输入法切换麻烦,不用 emacs 键位方便。
zooo
2023-01-30 22:35:28 +08:00
好复杂,目前自带 vim 模式够用...
pandachow
2023-01-30 23:44:09 +08:00
中文分词跳转的确是大问题,因为修改是一个比较频繁的操作。
wizardyhnr
2023-01-31 00:58:38 +08:00
分词是个问题,但是这个输入法我用着已经比以前体验好太多了
https://github.com/ZSaberLv0/ZFVimIM
yuancoder
2023-01-31 10:03:41 +08:00
太折腾了, 编辑的时候我都是直接用 vim 编辑的
fds
2023-01-31 10:56:15 +08:00
太厉害了!我编辑量没那么大,所以就不折腾了(也折腾不出楼主这样的)。
zwpaper
2023-01-31 11:18:53 +08:00
op 用的什么录屏软件,看起来效果挺不错的
Jaosn
2023-01-31 15:13:12 +08:00
@xell #1 neovim for vscode 这个插件大大小小的 Bug 太多了,只能使用 vim 插件
jiyee
2023-01-31 15:25:58 +08:00
@zwpaper GIPHY
xell
2023-01-31 15:48:07 +08:00
@Jaosn 我倒是还没有遇到关键性的问题,总之可以愉快地使用 neovim/vim 的各类插件就已经是赚到了。
chancat
2023-02-01 02:03:31 +08:00
额看看先
rich1e
2023-02-01 10:49:24 +08:00
收获满满。不过需要一段时间来学习和适应。
zwpaper
2023-02-01 11:27:27 +08:00
@jiyee 字幕是自己加的啊🤣,我以为会自动捕获
jiyee
2023-02-01 14:03:18 +08:00
@zwpaper 我之前见过一个录屏软件能自动捕获,我没找到,就找了款简单的用用。
zapan
2023-02-20 16:57:34 +08:00
@xell 类似方案没有貌似没有很好的移动端支持,感觉这是最大硬伤。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/911769

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX