在构建自己的第二大脑(PKM、数字花园等等)过程中,面对品类繁多的笔记软件,各种效能工具(白板、思维导图工具),是选一个最好的软件,全部投入其中,还是组合各个不同的软件,构成自己的工具箱呢?
先说结论:组合大法好。
基于以下几个朴素的理由:
- 要整合优势而不是逼死短板。
- 真正做功的是“系统”,而不只是特定软件。
- 工具要能跟上时代发展,如果工具变强大,系统也要有所收益。
概要
all in one
所有的操作都在一个软件中完成
例如有些朋友会使用obsidian作为个人知识的管理工具,就会使用obsidian的白板、绘图和思维导图等。
不得不说,obsidian的确很强大,自带的白板、插件库中的excalidraw都非常优秀,但是目前思维导图相关插件的表现还差强人意,尤其是对一个我这样的重度思维导图用户,很难满足一些已经习以为常的功能需求。
如果采用all in one
的哲学,我就不得不忍受在我看来并不好用的思维导图工具,降低我的生产效率。那这一妥协能带来什么好处呢?
我没有想到有什么切实的收益。
组合大法
取长补短,有机结合
我们常常在工作学习中强调要取长补短、发挥优势,到了个人知识管理系统(PKM、第二大脑等其他称谓)这里也是一样的。
我们需要的是一个系统,它由具体的软件承载功能,结合工作流程输出实际战斗力。(书籍推荐:《用系统来工作》)
在这个系统中会有各个模块承担自己的职责,相互协作,形成一个有机的整体。在这个有机整体中就要允许各个模块发挥自己的优势,而不是薅着其中的短板、缺点往死里耗。
所以,obsidian作为个人知识库的载体,md编辑、白板好用,就应该用它,xmind作为思维导图的专业工具,在思维导图方面比obsidian好用,那就用xmind来制作思维导图。
到目前为止,这只不过是使用了两个软件而已,有机结合在哪里呢?
一些工程思考
首先引入一些工程上的思考,相信很多程序员同学都看过《UNIX编程艺术》这本书,摘录其中几条原则:
- 模块原则:使用简洁的接口拼合简单的部件。
- 组合原则:设计时考虑拼接组合。
- 扩展原则:设计着眼未来,未来总比预想来得快。 这些原则也同样适用于我们构建的个人知识库系统。
模块
划分
在当前创景下,我们可以粗放一点,将一个软件当成一个模块,也可以细致一些,将用到的主要功能分成模块,例如:
- markdown编辑、展示以及双链
- 白板
- 绘图
- 思维导图 根据自己常用的核心功能,分为几个模块。而我们使用的软件可以提供其中一个或多个的功能。
组合
那么如何将模块与模块组合起来呢?
组合大法的回答:文件系统。
通过将文件放到项目根目录的不同文件夹下,通过文件系统可以访问不同文件夹下的文件。
接口
模块和模块之前信息流转的承载物,在个人知识系统中是markdown文件。
不开发的方案
以obsidian和xmind的融合为例。
obsidian-->xmind
obsidian看见xmind文件
如图所示,在obsidian的设置中打开检测所有类型文件
的选项,就能“看见”obsidian还不支持的文件类型,点击它会触发系统打开对应的软件。
obsidian看见xmind文件内容
xmind文件本质上其实是个zip包,zip中包含xmind文件的缩略图,如果我们把缩略图导入到obsidian项目中,我们就可以通过![[图片.png]]
的展示直接展现xmind的缩略图,也就能直接看到xmind中的内容了。
unzip -p $mindmap_file Thumbnails/thumbnail.png > $thumbnail_output_dir/$thumbnail_file
并且在md中可以通过[[文件.xmind]]
单击直接触发xmind打开该文件,所以还可以在图片下方加一个xmind文件链接,方便操作。
xmind生成md
xmind官方自带了导出md的功能,但是这个导出的md不会包含思维导图中的图片,以及一些结构信息会丢失(概要、外框、联系等)。
xmind-->obsidian
obsidian url
obsidian://open?vault=vault_name&file=file_name
,可以通过这样的url
来访问obsidian中的文件。
参考:help.obsidian.md/Concepts/Ob…
占位符
虽然在xmind中不能像在obsidian中直接通过双链可以预览查看md内容,但是有个取巧的方法是,在将xmind转成md之后,原本只是一个占位符作用的双链地址就会变成正常的双链。
一屏多窗口
通过把两个软件拼合在一起,类似于IDE中的分栏效果,愿意折腾的还可以通过窗口管理软件来快速实现分屏,保留分屏配置等功能,不愿意折腾的,系统自带的功能也能满足需求了。
窗口管理软件
目前来说还没有一个跨平台的、好用的窗口管理软件,现状是每个平台会有一些针对当前平台的好用的窗口管理软件,这个也可以理解,毕竟窗口管理需要和系统的图形界面打交道,每个系统的设计和实现也不一样,很难做到统一。
折腾
以下内容需要一些开发知识,有一定门槛。
脚本
注意: 仅支持linux和macos,没有在window上测试过。
自动提取xmind缩略图
提取缩略图
#!/bin/bash
if [ $# -ne 2 ]; then
echo "Usage: $0 <mindmap_file> <thumbnail_output_dir>"
exit 1
fi
mindmap_file=$1
thumbnail_output_dir=$2
if [ ! -f $mindmap_file ]; then
echo "Error: $mindmap_file does not exist"
exit 1
fi
if [ ! -d $thumbnail_output_dir ]; then
echo "Error: $thumbnail_output_dir does not exist"
exit 1
fi
if [[ ${mindmap_file##*.} == "xmind" ]]; then
thumbnail_file=$(basename $mindmap_file .xmind).png
unzip -p $mindmap_file Thumbnails/thumbnail.png > $thumbnail_output_dir/$thumbnail_file
echo "Thumbnail saved to $thumbnail_output_dir/$thumbnail_file"
fi
githook
如果是用git来管理obsidian仓库,正好可以使用githook来完成自动化。
#!/bin/bash
# Define the path to the get_mindmap_thumbnail script
GET_THUMBNAIL_SCRIPT="./tools/bin/get_mindmap_thumbnail"
# Get the list of changed files
CHANGED_FILES=$(git diff --name-only --diff-filter=AMD HEAD@{1} HEAD)
echo "check map modify"
updated_images=false
deleted_images=false
for FILE in $CHANGED_FILES
do
FILE=`echo $FILE | sed -e 's/"//g'`
file_extension=${FILE##*.}
if [ "$file_extension" = "xmind" ]
then
# Check if the file was deleted
if [ ! -e "$FILE" ]
then
echo "Delete map image"
deleted_images=true
# Remove the corresponding png file
png_filename="./assets/image/$(basename $FILE .$file_extension).png"
rm -f $png_filename
else
echo "Update map image"
updated_images=true
$GET_THUMBNAIL_SCRIPT $FILE ./assets/image
fi
fi
done
# Add any updated or deleted thumbnail images to the commit if the flags are true
if $updated_images || $deleted_images; then
git add *.png
git commit -m 'update mindmap png'
fi
GET_THUMBNAIL_SCRIPT
写的是提取缩略图脚本的路径,将脚本也一起放到obsidian仓库中。
让githook
生效:
# 首先进入到git hook目录下
cd .git/hooks/
# 建立软链接
ln -s ../../tools/bin/githook_thumbnail post-commit
# 注意脚本的路径,这里用的是相对位置
插件
以上的折腾效果还不够理想,比如我还想要能直接从xmind生成md文档,自动拷贝图片、把缩略图作为概要放到文档中等等功能,这些功能是xmind官方提供的导出md文档所达不到的,且操作不够便捷。
考虑到我是个重度思维导图用户,也有长期在obsidian投资时间精力,打造自己的第二大脑的计划,所以,写一个obsidian的插件,能够满足xmind和obsidian深度融合的功能,对我来说就成了一个不错的折腾方案。
鉴于如何写一个obsidian插件的篇幅太长,就不在这里赘述,会找机会专门说一下。