Aqui está uma maneira. Você precisa vincular o comando a um evento do mouse. Mas se você clicar com o botão do mouse, provavelmente precisará vincular o evento para a outra parte do clique (por exemplo, para baixo) ignore
. Este é apenas um exemplo - você pode não querer desperdiçar C-mouse1
esse comando.
A principal função (comando, na verdade) é describe-char
. Ele descreve o ponto em uma determinada posição de buffer. Parte dessa descrição inclui as propriedades de texto e as sobreposições nessa posição e, se a propriedade face
for uma delas, você verá seu valor.
(defun foo (event)
(interactive "e")
(let* ((mouse-pos (event-start event))
(pos-pt (posn-point mouse-pos)))
(describe-char pos-pt)))
(global-set-key [(control down-mouse-1)] 'ignore)
(global-set-key [(control mouse-1)] 'foo)
Isso pode ser um pouco melhor - o acima pode não funcionar em alguns contextos:
(defun foo (event)
(interactive "e")
(let* ((mouse-pos (event-start event))
(mouse-buf (window-buffer (posn-window mouse-pos)))
(pos-pt (posn-point mouse-pos)))
(with-current-buffer mouse-buf (describe-char pos-pt))))
(Observe também que isso C-x =
está vinculado a what-cursor-position
, que usa describe-char
. Então você estava no caminho certo C-u C-x =
.)
No que diz respeito ao Ido: Ao contrário do Icomplete, que usa uma sobreposição, o modo Ido insere texto no minibuffer. Mas a razão pela qual o código acima não funciona nesse texto é que o modo Ido remove o texto no início de cada comando, usando pre-command-hook
. Portanto, quando o comando acima é executado, o texto que mostra as conclusões já foi removido.
O código a seguir soluciona esse problema, apenas no modo Ido. Ele reinsere o texto mostrando as conclusões no início e remove as conclusões no final.
(defun foo (event)
(interactive "e")
(when (and (boundp 'ido-mode) ido-mode) (ido-exhibit))
(let* ((mouse-pos (event-start event))
(mouse-buf (window-buffer (posn-window mouse-pos)))
(pos-pt (posn-point mouse-pos)))
(with-current-buffer mouse-buf (describe-char pos-pt)))
(when (and (boundp 'ido-mode) ido-mode) (ido-tidy)))