怎样美化 posframe

比较土鳖的方法是启动一个timer监听某种变化,有变化时,隐藏posframe

不一定,具体情况具体看

不容易 debug 啊

有一个法子是: 你可以将posframe的窗口固定到当前窗口的右上角,然后操作posframe-buffer,posframe有一个自动刷新参数,它根据buffer的内容自动调整窗口大小

一直显示不删除?这不太符合词典应用的使用场景吧?

说不准哟,首先在右上角,posframe小的话,不影响看代码,其次,你清空posframe buffer后,posframe窗口会缩小成绿豆大,更不影响了

我从别人那偷来的,可以防止闪退。但是带来其它一些bug,比如影响 eldoc 显示,主要因为不理解这个代码的含义。

               (unwind-protect
                   (push (read-event) unread-command-events)
                 (posframe-hide))

这是我从别人 postip 处理的方式那借鉴来的,但是 postip 不用放到 post-command-hook 中去

我以前准备让posframe显示一个webkit控件,调用百度翻译,后来懒得搞,很简单,估计效果也不错

因为这个闪退的原因,我还是换回 pos-tip 了,等到有解决办法了再换回来。

闪退是指啥呀? 我hook到post-command-hook好像没啥问题啊?

(defun webkit-katex-render-update ()
  (let ((math-at-point (webkit-katex-render--math-at-point)))
    (if math-at-point
        (if (not (eq math-at-point webkit-katex-render--previous-math))
            (progn
              (webkit-katex-render-show math-at-point)
              (setq webkit-katex-render--previous-math math-at-point)))
      (webkit-katex-render-hide))))

;;;###autoload
(define-minor-mode webkit-katex-render-mode
  "Toggle Katex preview"
  nil nil nil
  (if webkit-katex-render-mode
      (progn
        (unless (featurep 'xwidget-internal)
          (user-error "Your Emacs was not compiled with xwidgets support"))
        (unless (display-graphic-p)
          (user-error "webkit-katex-render only works in graphical displays"))
        (add-hook 'post-self-insert-hook #'webkit-katex-render--resize)
        (add-hook 'post-command-hook #'webkit-katex-render-update))
    (remove-hook 'post-command-hook #'webkit-katex-render-update)
    (remove-hook 'post-self-insert-hook #'webkit-katex-render--resize)
    (webkit-katex-render-cleanup)))
1 个赞

具体来说,就是选中区域的时候弹出posframe会闪退

这肯定不是posframe的锅。。你看看是不是选中的时候词典有什么特殊处理

1 个赞

比较难 debug 啊,spacemacs 的 post-command 里 hook 了一堆东西,词典插件是我自己又写的,倒是没什么特殊处理。

要不hook到h/j/k/l上?

不对那些没有hook。。除非advice。。。

要么你就把post command hook清空看看有没有问题? 二分查找一下。。

spacemacs 上 2017 年就有人提出来相关 issue 了,

是pos-tip的,但是pos-tip有 workaround,我现在用的就是。posframe 比较新,用的人少,还没有相应的 workaround。

看来也只能这样了

能看看你的 post-command-hook 吗? @fuxialexander

这是我的:

post-command-hook is a variable defined in ‘C source code’.
Its value is
(evil-normal-post-command company-post-command eldoc-schedule-timer hl-paren-initiate-highlight yas--post-command-handler t)
Local in buffer stardict.el; global value is 
(global-font-lock-mode-check-buffers global-eldoc-mode-check-buffers global-spacemacs-leader-override-mode-check-buffers global-undo-tree-mode-check-buffers evil-mode-check-buffers ace-pinyin-global-mode-check-buffers global-edit-server-edit-mode-check-buffers global-anzu-mode-check-buffers evil-snipe-mode-check-buffers evil-snipe-override-mode-check-buffers global-page-break-lines-mode-check-buffers global-vi-tilde-fringe-mode-check-buffers global-spacemacs-whitespace-cleanup-mode-check-buffers ws-butler-global-mode-check-buffers yas-global-mode-check-buffers show-smartparens-global-mode-check-buffers global-flycheck-mode-check-buffers global-display-line-numbers-mode-check-buffers global-magit-file-mode-check-buffers flycheck-pos-tip-hide-messages sp--post-command-hook-handler winner-save-old-configurations clean-aindent--check-last-point evil-repeat-post-hook global-hl-line-maybe-unhighlight global-hl-line-highlight mode-local-post-major-mode-change)

posframe由于bug,不能点,所以我在posframe里面设置,一点就隐藏

你说的 bug 和我说的可能是同一个根源吗?看了 @fuxialexander 所说,我现在又有点怀疑是 spacemacs 的某个包造成的 bug

(eldoc-schedule-timer
 evil-normal-post-command
 company-post-command
 hl-line-maybe-unhighlight
 hl-line-highlight
 yas--post-command-handler
 git-gutter:post-command-hook
 t)

好像差别也不大?

这个就不知道了

嗯,甚至也不一定是 post-command-hook 的毛病,是有什么命令在选中区域的时候移动光标了?不知道这个命令就没法 debug。

我能想到一个 workaround 就是在选中区域的时候用 pos-tip 代替 posframe