我加上了根据主题背景是黑还是白来自动选择颜色配色。
(defun my:org-agenda-time-grid-spacing ()
"Set different line spacing w.r.t. time duration."
(save-excursion
(let* ((background (alist-get 'background-mode (frame-parameters)))
(background-dark-p (string= background "dark"))
(colors (if background-dark-p
(list "#aa557f" "DarkGreen" "DarkSlateGray" "DarkSlateBlue")
(list "#F6B1C3" "#FFFF9D" "#BEEB9F" "#ADD5F7")))
pos
duration)
(nconc colors colors)
(goto-char (point-min))
(while (setq pos (next-single-property-change (point) 'duration))
(goto-char pos)
(when (and (not (equal pos (point-at-eol)))
(setq duration (org-get-at-bol 'duration)))
(let ((line-height (if (< duration 30) 1.0 (+ 0.5 (/ duration 60))))
(ov (make-overlay (point-at-bol) (1+ (point-at-eol)))))
(overlay-put ov 'face `(:background ,(car colors)
:foreground
,(if background-dark-p "black" "white")))
(setq colors (cdr colors))
(overlay-put ov 'line-height line-height)
(overlay-put ov 'line-spacing (1- line-height))))))))
(add-hook 'org-agenda-finalize-hook #'my:org-agenda-time-grid-spacing)
2 个赞
啊谢谢!我还没有了解过这种内置包的贡献方式,等有时间了看一下,不知道你有什么建议吗。然后我感觉这种方式有一个问题就是用背景色来区分不同时间块会不会有点激进,毕竟和主题背景和各种 face 都很容易冲突。我一开始用的是 box 但是效果不太好,有些左右边框不显示,所以用了色块来区分。另外一点就是终端下没有用。还有我也打算对当前正在计时的条目采用相同的显示方式,但还没试过太懒了。
你可以看看这两个页面:
如果是第一次贡献给FSF,你需要PDF电子签署一份声明,也就是你的代码版权问题。
如果是minor patch,比如2,3行代码,就不用的。你这个应该需要。签署一次以后,以后都不用签署了,所有FSF下的都能用。很快的。以前需要邮寄文本,现在电子PDF就能签了。
我看这个patch好像还没进入Org Mode,不知道楼主现在有时间提交patch么?
啊抱歉最近没怎么用 Emacs 就没上论坛 。我对贡献 patch 那一套不太熟,如果你有兴趣的话就提交试试?版权什么的不用带上我。
1 个赞
@hawnzug 好的,我在Org Mode邮件列表上问问,我把 commit的author设为你的邮箱和名字,把commiter设置为我。这样的代码量不知道是否超出了GNU的最低限制。
感谢。
1 个赞
Ok, 想要合并提交PATCH到Org contrib,但是维护者Bastien没同意,说应该放在Worg。于是推送到Worg上了。
3 个赞
好奇怪啊,我把这段代码放到了我的 spacemacs 的配置里,结果看到时间块颜色生效了,但是时间块的高度却没有生效
你是不是世间不够长,你clock in,然后clock out,然后手动把clock时间加长到2小时,看会不会有高度。
时间不短,好几个小时呢。
(if (< duration 30) 1.0 (+ 0.5 (/ duration 60)))
这是半小时内高度为1个单位,超过半小时的,每满1小时增加0.5个单位吧?
对了,我把 CLOCK 放到 LOGBOOK 里了: 这会不会导致识别不到 duration?
(setq org-log-into-drawer "LOGBOOK")
不会,我也是放在logbook里的。
你要不自己edebug调试下。我这边也想不到什么情况会导致这个问题。
额,我也遇到这个问题了,调试了好多地方,就是找不到原因。 @ziyuanjun 你找到原因了么?
- [X] 我 git bisect 了下 Org Mode “master” branch 里近4个月的commit,没有找到 bad commit
- [X] Edebug 调试了几个相关的函数 (所有调用了
org-agenda-finalize
这个函数的函数),有颜色重绘的效果,但是调用 hook上的自定义函数 从来没有被Edebug捕获到过,这个真是奇怪,当我edebug在 org-agenda-redo 函数上的时候,倒是能捕获edebug断点了。但是只有一次能够重现 overlay 被设置了高度。其他几次都看不到效果。这个也很奇怪。
- [X] 我bisect 了下我Emacs的配置,也没发现问题。
这个真是让我相当困惑。
你看截图,edebug调试的时候, overlay 确实在设置高度。这个就是那个唯一一次捕获到调用的情况。
即使我手动在 org agenda buffer 里执行函数 (org-agenda-log-mode-colorize-block)
也没效果。
我测试了下 emacs -q
然后加载 hook 函数,还是无法设置高度。不知道到底是哪里出了问题。怀疑是在绘制 colorized blocks 后又被什么操作给自动覆盖了。
只能求教原作者了。 @hawnzug 在么?求教下这个是什么原因导致的?
哇,您agenda中 category 前面的icon是怎么设置的呢?就是日历,电脑的小图标。
我这边不管是加到hook里还是手动调用都没问题,emacs -q
也可以。我也不清楚是什么神奇的原因。
也许可以试一下把光标移动到agenda里Clocked的那一行,然后describe-char看一下text properties里的duration对不对?虽然我感觉不是duration的问题。