Existe uma maneira geral conveniente de “pegar” o resultado ecoado de um comando no Emacs (de M-: ou M-!)?

5

Às vezes, quero inserir o resultado de um comando do Emacs (que foi ecoado na área de eco) para outro buffer ou outro programa X em execução. Então, gostaria de colocá-lo no kill-ring. Qual seria uma maneira conveniente de fazer isso?

Por exemplo: Eu poderia executar uma consulta com um comando shell no modo dired, digamos: ! rpm -qf (para descobrir qual pacote possui o arquivo selecionado na lista de diretórios), e então quer inserir o resultado em outro lugar.

Ou, outro exemplo: se eu precisasse do nome do arquivo do buffer atual (como em Existe uma interface de usuário no Emacs permitindo que alguém" pegue "o nome do arquivo do buffer convenientemente? ), e ainda não houve comando pré-definido para isso, eu poderia pelo menos fazer M -: (buffer-file-name) e, em seguida, usar essa forma de propósito geral para copiar o resultado mostrado para o kill-ring, a fim de colá-lo mais tarde. (Claro, eu poderia eval (kill-new (buffer-file-name)) , mas este exemplo aqui é para ilustrar que tipo de maneira geral para fazer a captura do resultado que estou procurando.)

    
por imz -- Ivan Zakharyaschev 20.03.2011 / 17:49

3 respostas

7

Digite C-u antes de M-: ou M-! para obter o resultado inserido em vez de ser enviado para a área de eco.

Para colocar as coisas diretamente no kill ring, você precisa se envolver no Elisp. Algo parecido com isto (não testado):

;;; kill ring version of M-!
(defun shell-command-to-kill-ring (command)
    (interactive
      (list
        (read-shell-command "Shell command: " nil nil
                (let ((filename
                       (cond
                    (buffer-file-name)
                    ((eq major-mode 'dired-mode)
                     (dired-get-filename nil t)))))
                  (and filename (file-relative-name filename))))
        current-prefix-arg
        shell-command-default-error-buffer))
    (kill-new (shell-command-to-string command)))

;;; kill-ring version of M-:
(defun eval-expression-to-kill-ring ()
    (interactive)
    (call-interactively 'eval-expression)
    (kill-new (car values)))
    
por 20.03.2011 / 18:41
2

Todas as mensagens ecoadas na área de mensagens são salvas no buffer *Messages* , portanto, basta alternar para ela ( C-h e , view-echo-area-messages ) e selecionar o que você deseja.

Se você deseja obter o valor de uma expressão que não depende do buffer atual, também é possível alternar para o buffer *scratch* . Digite sua expressão e pressione C-j ( eval-print-last-sexp ).

    
por 20.03.2011 / 18:07
2

Uma ligeira melhoria na solução do geekosaur. Isso faz a coisa certa, mesmo se a expressão for avaliada como algo diferente de uma string.

(defun c5-eval-to-kill-ring ()
  (interactive)
  (kill-new (with-output-to-string (princ (call-interactively 'eval-expression)))))

(global-set-key (kbd "C-;") 'c5-eval-to-kill-ring)
    
por 10.11.2011 / 03:25