[想法]Org agenda 显示时间块

好奇怪啊,我把这段代码放到了我的 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 后又被什么操作给自动覆盖了。

没有啊。我还不会Edebug 这么高级的操作

只能求教原作者了。 @hawnzug 在么?求教下这个是什么原因导致的?

哇,您agenda中 category 前面的icon是怎么设置的呢?就是日历,电脑的小图标。

这个是用 all-the-icons 设置的,可以参考我的配置。

我这边不管是加到hook里还是手动调用都没问题,emacs -q也可以。我也不清楚是什么神奇的原因。

也许可以试一下把光标移动到agenda里Clocked的那一行,然后describe-char看一下text properties里的duration对不对?虽然我感觉不是duration的问题。

@hawnzug 谢谢,我都没想到应该查看下字符属性。这里是我的结果。

             position: 1608 of 24792 (6%), column: 15
            character: SPC (displayed as SPC) (codepoint 32, #o40, #x20)
              charset: ascii (ASCII (ISO646 IRV))
code point in charset: 0x20
               script: latin
               syntax:   	which means: whitespace
             category: .:Base, a:ASCII, l:Latin
             to input: type "C-x 8 RET 20" or "C-x 8 RET SPACE"
          buffer code: #x20
            file code: #x20 (encoded by coding system utf-8)
              display: by this font (glyph code)
    ftcrhb:-PfEd-DejaVu Sans Mono-normal-normal-normal-*-24-*-*-*-m-0-iso10646-1 (#x03)

Character code properties: customize what to show
  name: SPACE
  general-category: Zs (Separator, Space)
  decomposition: (32) (' ')

There are 2 overlays here:
 From 1593 to 1719
  face                 hl-line
  priority             -50
  window               [Show]
 From 1593 to 1719
  face                 (:background "#FFFF9D" :foreground "black")
  line-height          1.5666666666666667
  line-spacing         0.5666666666666667


There are text properties here:
  breadcrumbs          nil
  date                 (5 1 2020)
  day                  737546
  done-face            org-agenda-done
  dotime               [Show]
  duration             32.0
  extra                [Show]
  face                 org-agenda-done
  format               [Show]
  help-echo            "mouse-2 or RET jump to org file ~/Org/Tasks/Computer Todos.org"
  level                " "
  mouse-face           highlight
  org-agenda-type      agenda
  org-category         "Computer"
  org-complex-heading-regexp [Show]
  org-day-cnt          1
  org-hd-marker        [Show]
  org-last-args        (nil nil day)
  org-marker           [Show]
  org-not-done-regexp  [Show]
  org-priority-highest 65
  org-priority-lowest  67
  org-redo-cmd         (org-agenda-list 'nil nil 'day nil)
  org-series-cmd       nil
  org-todo-regexp      [Show]
  priority             100000
  tags                 ("repeat")
  time                 " 8:25am- 8:57am "
  time-of-day          825
  txt                  [Show]
  type                 "clock"
  undone-face          org-warning

可以看到 duration 属性是 32.0 应该是没问题的。我之前Edebug的时候,也能看到duration正确计算了。 你能从这个输出里面看出什么端倪么?

看上去第二个overlay里的line-height和line-spacing也是对的,但是显示出来没有变化吗?

显示出来没有高度变化。真个正是问题所在,真的很奇怪。竟然查不出来是为啥。。。

我好像找到问题所在了。难怪一直edebug都找不出原因。这次我在Edebug的时候发现,当 (point) 在行前的时候,行高没变,而当 代码将 (point) 移动到行尾的时候,行高又正常工作了,变高了。于是我手动移动了下光标,确实如此。 然后我以为和光标有关系,于是取消了 hl-line-mode,但是没用。我想要截图的,但是我是两边分割的窗口,于是我想着关闭一边的窗口,结果当只剩下一个窗口的时候,行高显示正常了,当我左右分割两个窗口的时候,一行的长度超过窗口的宽度的时候,问题就出现了。

我估计是因为overlay的缘故。可能由于我使用的是最新德Emacs版本(最新的,从源代码编译的)

GNU Emacs 28.0.50 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.24.17, cairo version 1.17.3) of 2020-05-02

这是截图

The overlay line does not show line with line-height of overlay.

When I move cursor point to end of overlay line.

When window width is larger than line length:

I also recorded an demostration screencast:

我测试了,编译两个月前的commit编译的Emacs,也还是有这个问题。测试了Emacs26版本,也依然有这个问题。看来不是Emacs版本问题。

---- UPDATE----

查看了一下 Emacs 源代码的git历史变动, overlay-put 函数属于 buffer.c 文件,近期都没有什么改动。所以排除了Emacs的overlay功能改动而导致的可能。

万般无奈之下,我打算把这个问题报错给Emacs开发组邮件列表。

---- UPDATE -----

新进展,邮件列表回复最好写个最小的elisp代码片段测试。我写了一个,发现line-height其实没问题。真是奇怪了。以下是测试代码片段。

(let ((line-height 20)
      (ov (make-overlay (point-at-bol) (1+ (point-at-eol)))))
  (overlay-put ov 'face '(:background "yellow"))
  (overlay-put ov 'line-height line-height)
  (overlay-put ov 'line-spacing (1- line-height)))

十分感谢!把需要自己找图标的问题也解决了,您使用的domtronn/all-the-icons.el: A utility package to collect various Icon Fonts and propertize them within Emacs.看上去很方便!

能用上就好,同好嘛。

更新这个issue信息

我发邮件到emacs-devel了,有人说这不是ol问题,而是这个本来就不是ol的目的。链接在这里。

https://lists.gnu.org/archive/html/emacs-devel/2020-06/msg00083.html

主要和这一行有关 (make-overlay (point-at-bol) (1+ (point-at-eol))) 里面是 1+的话,就会overlay取到行尾以及换行。但是如果不要 1+ 就没法设置 overlay的行高属性了。

如果引用了cnfonts包做了中英文对齐的话就会出现行高固定问题, 我在停止引用该包后行高就按预期变化了