自 Eglot 不能补全函数参数吗? 继续讨论:
我之前说了用text property + overlay 应该很容易实现。实际上用不上overlay:
(defface placeholder (let ((display t)
(attributs '(:inherit highlight)))
(list (cons display attributs)))
"Face for argument placeholders."
:group 'company)
(defface placeholder-mouse (let ((display t)
(attributs '(:inherit highlight
:bold t)))
(list (cons display attributs)))
"Mouse face for argument placeholders."
:group 'company)
(defun make-placeholder (text tooltip)
"Return a placeholder TEXT with TOOLTIP."
(propertize " "
'display text
'help-echo tooltip
'insert-in-front-hooks (list (lambda (beg end)
(message "%d %d" beg end)
;; self-remove of placeholder
(save-excursion
(goto-char end)
(delete-char 1))))
'face 'placeholder
'font-lock-face 'placeholder
'mouse-face 'placeholder-mouse
'rear-nonsticky t))
(setq ph (make-placeholder "arg" "help"))
现在有两个小问题:
- 不知道为什么没法触发
insert-in-front-hooks
。 - 开启了font-lock-mode的话就不会显示
'face
,必须要设置'font-lock-face
才行,但是这样好像又影响了'mouse-face
。
tab跳转可以参考widget,应该不难实现,不过我想先把这几个问题修复了再说。
更新:
1)看起来像是bug:SO上有个相关的问题。确实关掉font-lock-mode就没有问题了……而且font-lock-mode还影响了help-echo……