今天介绍一个Alfred Workflow,能大幅提升Obsidian的操作效率,作者hauselin,项目地址:https://github.com/hauselin/obsidian-alfred

以下根据我自己用到的功能做些介绍,基本覆盖常用功能,深入研究参考上述项目地址。

安装

首先,你需要安装好Alfred

然后,在这里下载最新的版本,双击Obsidian.alfredworkflow文件完成安装。

完成后,Alfred的Workflows菜单中出现「Obsidian」,看下图密密麻麻的节点,就知道多强大了。

设置

使用前,需要完成一些设置,即在Alfred中执行相关命令,具体包括:

  1. 添加vault:oaddvault
  2. 添加日记所在的vault:odailyvault(要求已经安装日记插件并启用)
  3. 设置日记标题格式:odailyformat datetime_format,比如odailyformat yymmdd~ddd,表示使用格式211207~Tue
  4. 设置日记默认目录:odailypath
  5. 设置日记的默认模板:odailytemplate

第3步设置日记标题格式碰到一个问题:我的Obsidian是中文的,标题形如「211207~周二」,但Workflow生成的标题是英文,形如「211207~Tue」。

Issues中找到解决方案:

在Alfred的Workflow设置界面,找到上图所示节点,双击修改其中的日期变量,支持monthsmonths_shortdaysdays_short。我的需求,修改days_short即可。

var months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
var months_short = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]

var days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', '星期四', 'Friday', 'Saturday']
var days_short = ['Sun', 'Mon', 'Tue', 'Wed', '周四', 'Fri', 'Sat']

功能

Workflow功能大多是命令式的,下面介绍常用命令。

打开valut:oo

oo your_vault_name打开vault,vault名称支持自动补全。我只有一个vault,个人不常用。

打开日记:od

打开今天的日记,如果没有则自动创建。这是非常高频的功能,所以我添加了快捷键。

找到下图所示节点,双击即可设置快捷键,全局有效,图中是我的快捷键。

我将Caps换键映射为⌃⌥⇧⌘,所以Caps + T就能打开今日日记,非常方便。

追加日记内容:odi

在今天的日记后面追加内容,内容会被加工为无序列表,且在前面添加格式为yyyymmdd_hhmmss的时间。

对日记内容,我有自己的格式,所以修改了时间变量格式及内容处理脚本,位于下图右侧这两个节点,我的脚本见文末附录。

这个功能支持使用快捷键将剪切板的内容追加到日记中,上图左侧节点中设置,图中是我的快捷键。

然后,当我阅读网页或文档时,有喜欢的段落,只需两步就能保存内容到日记中:

  • Command + C复制选中内容
  • Caps + C追加内容到日记

整个过程不用离开阅读界面,太方便了。

通知:onotify

这个命令打开通知功能,当对笔记进行追加内容操作时,会提示内容添加成功。

搜索:osorot(或ossorrott

前三个命令,搜索电脑中所有的markdown文件,如果是vault中的文件,则使用Obsidian打开,如果不是vault中的文件,则使用系统默认编辑器打开。三个命令的区别在于时间范围不同:

  • os:搜索所有markdown文件
  • or:搜索近3天修改过的markdown文件
  • ot:搜索今天修改过的markdown文件

ossorrott三个命令类似,区别是只搜索vault中的markdown文件。使用时,输入命令后需要先回车,再输入搜索关键词。

Alfred本身就有强大的全局搜索能力,所以全局搜索大可不必使用osorot命令。在vault内的搜索才是高频需求,所以我给oss设置了快捷键,如下图,Caps + F实现vault中搜索。

小结

Workflow很强大,为减少记忆负担,日常中我就使用下面四个功能:

  • 打开今日日记:快捷键Caps + T
  • 追加文本到今日日记:命令odi your_text(一般是简短的内容,长内容会打开今日日记再写)
  • 将剪切板内容追加到今日日记:快捷键Caps + C
  • 在vault中搜索:快捷键Caps + F

附录

我的日记格式是时间做标题,然后接整段内容,如下图。

修改后的脚本:

/* cSpell:disable */
ObjC.import('stdlib');
console.log('Running script: oi')

// get the current app to access the standard additions
app = Application.currentApplication();
app.includeStandardAdditions = true;

function interpolate_homepath(path) {
  homepath = app.pathTo('home folder')
  return path.replace(/^~/, homepath)
}

// get inbox note path
var inbox_md = $.getenv('dailytodaypath');
inbox_md = interpolate_homepath(inbox_md)

// where to add timestamp
var inbox_timestamp = $.getenv('inbox_timestamp');

// get timestamp
var timestamp = $.getenv('date');

// escape " 
var query = "{query}";
// query = query.replaceAll('"', '\"');
query = query.replace(/\"/g, '\"');  // github #25 @jamiew

if (inbox_timestamp == "append") {
    query += (" " + timestamp);
} else if (inbox_timestamp == "prepend") {
    query = "\n" + "## " + timestamp + "\n\n" + query;
}

// 把@NEWLISTITEM@替换为换行
//query = query.split("@NEWLISTITEM@")
query = query.replace(/@NEWLISTITEM@/g, '\n\n')
console.log("query: " + query)

// function to read utf
// https://github.com/JXA-Cookbook/JXA-Cookbook/issues/25
ObjC.import('Foundation')
const readFile = function (path, encoding) {
    !encoding && (encoding = $.NSUTF8StringEncoding)
    const fm = $.NSFileManager.defaultManager
    const data = fm.contentsAtPath(path)
    const str = $.NSString.alloc.initWithDataEncoding(data, encoding)
    return ObjC.unwrap(str)
}

// read file to append to it
var filetext = readFile(inbox_md);

// remove newline characters
while (filetext.endsWith("\n")) {
    filetext = filetext.slice(0, filetext.length - 1);
}
if (filetext == "") {
    console.log("EMPTY NOTE!")
} else {
    filetext += "\n"; // leave one newline character
}

console.log("CURRENT TEXT (string)");
console.log(filetext)


//var final_text = filetext + query; 
var final_text = filetext + query; 
console.log("FINAL TEXT")
console.log(final_text)

// write file
str2write = $.NSString.alloc.initWithUTF8String(final_text);
str2write.writeToFileAtomicallyEncodingError(inbox_md, true, $.NSUTF8StringEncoding, null);

// notification
var oinotify = $.getenv('oinotify');
if (oinotify == "on") {    
    // https://developer.apple.com/library/archive/documentation/LanguagesUtilities/Conceptual/MacAutomationScriptingGuide/DisplayNotifications.html
    app.displayNotification("Added text to inbox", { withTitle: 'Obsidian Alfred workfow' })
}
🔔 Email RSS订阅本博客

已有 7 条评论

  1. 嘉峰 嘉峰

    oaddvault也添加了,但只能or搜索系统的,不能orr搜索vault中的,这个是什么原因呢?

    1. 你可以在Alfred设置 -> Workflows -> 找到Obsidian的Workflow,右上角有个【X】按钮,点击看看value2和value2name是不是设置成功了(你的value)

    2. 不太清楚呢,我用的时候正常的。感觉你可以提个issue给作者。

  2. 感觉就适合你们这些懂技术的大佬😵‍💫

    1. 非技术出身,也是瞎折腾😃

  3. 这个就是为了提高记日记的效率吗?
    是日记还是博客呢?

    1. 日记,主要是通过快捷键实现快速记录,特别是记录剪切板内容,太好用了。

添加新评论