obsidian与xmind联动之all in one vs 组合大法

1,439 阅读5分钟

在构建自己的第二大脑(PKM、数字花园等等)过程中,面对品类繁多的笔记软件,各种效能工具(白板、思维导图工具),是选一个最好的软件,全部投入其中,还是组合各个不同的软件,构成自己的工具箱呢?

先说结论:组合大法好

基于以下几个朴素的理由:

  • 要整合优势而不是逼死短板。
  • 真正做功的是“系统”,而不只是特定软件。
  • 工具要能跟上时代发展,如果工具变强大,系统也要有所收益。

概要

image.png

all in one

所有的操作都在一个软件中完成

例如有些朋友会使用obsidian作为个人知识的管理工具,就会使用obsidian的白板、绘图和思维导图等。

不得不说,obsidian的确很强大,自带的白板、插件库中的excalidraw都非常优秀,但是目前思维导图相关插件的表现还差强人意,尤其是对一个我这样的重度思维导图用户,很难满足一些已经习以为常的功能需求。

如果采用all in one的哲学,我就不得不忍受在我看来并不好用的思维导图工具,降低我的生产效率。那这一妥协能带来什么好处呢?

我没有想到有什么切实的收益。

组合大法

取长补短,有机结合

我们常常在工作学习中强调要取长补短、发挥优势,到了个人知识管理系统(PKM、第二大脑等其他称谓)这里也是一样的。

我们需要的是一个系统,它由具体的软件承载功能,结合工作流程输出实际战斗力。(书籍推荐:《用系统来工作》)

在这个系统中会有各个模块承担自己的职责,相互协作,形成一个有机的整体。在这个有机整体中就要允许各个模块发挥自己的优势,而不是薅着其中的短板、缺点往死里耗。

所以,obsidian作为个人知识库的载体,md编辑、白板好用,就应该用它,xmind作为思维导图的专业工具,在思维导图方面比obsidian好用,那就用xmind来制作思维导图。

到目前为止,这只不过是使用了两个软件而已,有机结合在哪里呢?

一些工程思考

首先引入一些工程上的思考,相信很多程序员同学都看过《UNIX编程艺术》这本书,摘录其中几条原则:

  • 模块原则:使用简洁的接口拼合简单的部件。
  • 组合原则:设计时考虑拼接组合。
  • 扩展原则:设计着眼未来,未来总比预想来得快。 这些原则也同样适用于我们构建的个人知识库系统。

模块

划分

在当前创景下,我们可以粗放一点,将一个软件当成一个模块,也可以细致一些,将用到的主要功能分成模块,例如:

  • markdown编辑、展示以及双链
  • 白板
  • 绘图
  • 思维导图 根据自己常用的核心功能,分为几个模块。而我们使用的软件可以提供其中一个或多个的功能。

组合

那么如何将模块与模块组合起来呢?

组合大法的回答:文件系统。

通过将文件放到项目根目录的不同文件夹下,通过文件系统可以访问不同文件夹下的文件。

image.png

接口

模块和模块之前信息流转的承载物,在个人知识系统中是markdown文件。

不开发的方案

以obsidian和xmind的融合为例。

obsidian-->xmind

obsidian看见xmind文件

如图所示,在obsidian的设置中打开检测所有类型文件的选项,就能“看见”obsidian还不支持的文件类型,点击它会触发系统打开对应的软件。

image.png

2023-11-21_all-in-one_vs_组合大法-3.png

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不会包含思维导图中的图片,以及一些结构信息会丢失(概要、外框、联系等)。

image.png

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中的分栏效果,愿意折腾的还可以通过窗口管理软件来快速实现分屏,保留分屏配置等功能,不愿意折腾的,系统自带的功能也能满足需求了。

image.png

窗口管理软件

目前来说还没有一个跨平台的、好用的窗口管理软件,现状是每个平台会有一些针对当前平台的好用的窗口管理软件,这个也可以理解,毕竟窗口管理需要和系统的图形界面打交道,每个系统的设计和实现也不一样,很难做到统一。

折腾

以下内容需要一些开发知识,有一定门槛。

脚本

注意: 仅支持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插件的篇幅太长,就不在这里赘述,会找机会专门说一下。