打通Obsidian和Alfred,提高笔记效率
今天介绍一个Alfred Workflow,能大幅提升Obsidian的操作效率,作者hauselin,项目地址:https://github.com/hauselin/obsidian-alfred
以下根据我自己用到的功能做些介绍,基本覆盖常用功能,深入研究参考上述项目地址。
安装
首先,你需要安装好Alfred。
然后,在这里下载最新的版本,双击Obsidian.alfredworkflow文件完成安装。
完成后,Alfred的Workflows菜单中出现「Obsidian」,看下图密密麻麻的节点,就知道多强大了。
设置
使用前,需要完成一些设置,即在Alfred中执行相关命令,具体包括:
- 添加vault:
oaddvault
- 添加日记所在的vault:
odailyvault
(要求已经安装日记插件并启用) - 设置日记标题格式:
odailyformat datetime_format
,比如odailyformat yymmdd~ddd
,表示使用格式211207~Tue
- 设置日记默认目录:
odailypath
- 设置日记的默认模板:
odailytemplate
第3步设置日记标题格式碰到一个问题:我的Obsidian是中文的,标题形如「211207~周二」,但Workflow生成的标题是英文,形如「211207~Tue」。
在Issues中找到解决方案:
在Alfred的Workflow设置界面,找到上图所示节点,双击修改其中的日期变量,支持months
、months_short
、days
、days_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
这个命令打开通知功能,当对笔记进行追加内容操作时,会提示内容添加成功。
搜索:os
、or
、ot
(或oss
、orr
、ott
)
前三个命令,搜索电脑中所有的markdown文件,如果是vault中的文件,则使用Obsidian打开,如果不是vault中的文件,则使用系统默认编辑器打开。三个命令的区别在于时间范围不同:
os
:搜索所有markdown文件or
:搜索近3天修改过的markdown文件ot
:搜索今天修改过的markdown文件
oss
、orr
和ott
三个命令类似,区别是只搜索vault中的markdown文件。使用时,输入命令后需要先回车,再输入搜索关键词。
Alfred本身就有强大的全局搜索能力,所以全局搜索大可不必使用os
、or
、ot
命令。在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' })
}
oaddvault也添加了,但只能or搜索系统的,不能orr搜索vault中的,这个是什么原因呢?
你可以在Alfred设置 -> Workflows -> 找到Obsidian的Workflow,右上角有个【X】按钮,点击看看value2和value2name是不是设置成功了(你的value)
不太清楚呢,我用的时候正常的。感觉你可以提个issue给作者。
感觉就适合你们这些懂技术的大佬😵💫
非技术出身,也是瞎折腾😃
这个就是为了提高记日记的效率吗?
是日记还是博客呢?
日记,主要是通过快捷键实现快速记录,特别是记录剪切板内容,太好用了。