如何把org-pomodoro正在执行的番茄钟信息显示在Mac menuBar菜单栏上?

例如:显示当前的任务名称和剩余时间 截屏2021-03-31 下午4.18.04

借鉴了评论大牛的推荐,最终没有达到期望,在github发现了使用objc和Appscript交互的想法,通过脚本调用emacsclient -e '(org-clock-get-clock-string)'方法,获取emacs中定时器的信息,让后使用objc新建NSStatusBar显示即可:

#pragma mark - emacs
-(NSString *)emacsTaskName
{
    NSString *active = [self outOfAppScriptcommand:@"org-clock-is-active"];
    if ([active isEqualToString:@"nil"]) {
        return @"无安排";
    }
    NSString *clock = [self outOfAppScriptcommand:@"org-clock-get-clock-string"];
    //处理字符串:#(" [22:54] (org-agenda 科学使用 [0%])" 0 31
    //(face org-mode-line-clock))
    clock = [RX(@"\\[\\d.*\\)") firstMatch:clock];
    return clock;
}

//通过AppScript脚本获取任务
-(NSString *)outOfAppScriptcommand:(NSString *)command
{
    NSString *script = [NSString stringWithFormat:@"on run\ndo shell script \"/usr/local/bin/emacsclient -e '(%@)'\"\nend run",command];
    NSAppleScript* scriptObject = [[NSAppleScript alloc] initWithSource:script];
    NSString *result = @"nil";
    NSDictionary* errorDict;
    NSAppleEventDescriptor* returnDescriptor = [scriptObject executeAndReturnError: &errorDict];
    if (!errorDict)
    {
        result = returnDescriptor.stringValue;
    }
    return result;
}

项目见:

可以参考: Org mode clocking in the menu bar with Hammerspoon

Org Pomodoro and Polybar - Cole Killian Linux 下的实现参考,大部份工作还是在Emacs Lisp里完成,通过命令行用emacsclient拿到状态后显示出来

(setq frame-title-format
 '((:eval (concat
           (if (and (boundp 'org-pomodoro-mode-line) org-pomodoro-mode-line)
               (if (listp org-pomodoro-mode-line)
                   (apply #'concat org-pomodoro-mode-line)
                 org-pomodoro-mode-line)
             "")
           (if (and (boundp 'org-mode-line-string) org-mode-line-string)
               org-mode-line-string
             "")
           (if (buffer-file-name)
               (abbreviate-file-name (buffer-file-name))
             "%b")))))

简单实用

1 个赞

如何添加这个功能,设置frame-title-format怎么使用,没有看明白?

只是在 emacs 标题栏显示,可能不太符合你的要求,不过我的日常体验感觉够了

我用的 Vitamin-R,配置可以看 dotemacs.d/init-pomo.el at master · shuxiao9058/dotemacs.d · GitHub

image

local function startUpdatingClockingMenu()
   hs.timer.doEvery(10, updateClockingMenu)
end

使用hammerspoon调用clocking指定的是10s刷新一次番茄时间信息,但是,经常出现长时间不刷新的,又遇到这个问题吗?

这个不是很清楚,因为我自己没在用,你试试每十秒执行一个别的内容?

嗯,尝试了,在init.lua中,使用hs.timer.doEvery(1,test)每次都会打印,但是把test打印封装到cloking.lua执行定时打印,就出现中断的情况。

不清楚了,抱歉