Copie a última mensagem do Emacs para o buffer atual

7

Existe uma função que eu poderia usar para copiar rapidamente a mensagem na área de eco (se houver) no meu buffer de trabalho? Devo definir o atalho para essa função com define-key ou global-set-key ou de alguma outra forma?

    
por Marcus Junius Brutus 06.09.2014 / 16:26

1 resposta

8

A função current-message retorna a mensagem exibida atualmente na área de eco , se houver. Você pode inseri-lo com (insert (current-message)) . No entanto, qualquer coisa que faça com que outra coisa ocupe a área de eco fará com que current-message retorne nil .

Mensagens do Emacs são arquivadas no buffer *Messages* . Seria mais útil pegar a última linha de lá. Isso não é perfeitamente confiável, já que é possível ter uma mensagem de várias linhas, mas isso é raro: a função message serve para mensagens curtas que cabem em uma linha.

A função a seguir insere a última mensagem (mais precisamente, a última linha do buffer *Messages* . Com um argumento de prefixo, ela retorna mensagens mais antigas: 1 para a última mensagem, 2 para a penúltima, etc. O argumento 0 insere (current-message) , se houver.

(defun last-message (&optional num)
  (or num (setq num 1))
  (if (= num 0)
      (current-message)
    (save-excursion
      (set-buffer "*Messages*")
      (save-excursion
    (forward-line (- 1 num))
    (backward-char)
    (let ((end (point)))
      (forward-line 0)
      (buffer-substring-no-properties (point) end))))))
(defun insert-last-message (&optional num)
  (interactive "*p")
  (insert (last-message num)))

Vincule-o a uma chave da maneira normal. Por exemplo, se você quiser o comando disponível em C-c m em todos os momentos:

(global-set-key "\C-cm" 'insert-last-message)

Pode haver maneiras mais fáceis de invocar dois comandos personalizados para inserir o nome do arquivo, consulte o wiki do Emacs .

Para inserir a saída da avaliação de um snippet Lisp com C-x C-e , passe um argumento de prefixo: C-u C-x C-e .

    
por 07.09.2014 / 01:15

Tags