Emacs에서 명령의 에코 결과(M-: 또는 M-!)를 "잡는" 편리한 일반적인 방법이 있습니까?

Emacs에서 명령의 에코 결과(M-: 또는 M-!)를 "잡는" 편리한 일반적인 방법이 있습니까?

때때로 나는 Emacs 명령의 결과(에코 영역에 에코된)를 다른 버퍼나 실행 중인 다른 X 프로그램에 삽입하고 싶습니다. 그래서 킬링링에 넣고 싶었어요. 이를 수행하는 편리한 방법은 무엇입니까?

예를 들어, dired 모드에서 셸 명령을 사용하여 다음과 같은 쿼리를 실행할 수 있습니다( !rpm -qf디렉토리 목록에서 선택한 파일을 소유한 패키지 찾기). 그런 다음 결과를 다른 곳에 삽입하려고 합니다.

또는 또 다른 예: 현재 버퍼의 파일 이름이 필요한 경우(예:버퍼의 파일 이름을 쉽게 "가져올" 수 있는 사용자 인터페이스가 Emacs에 있습니까?), 아직 미리 정의된 명령이 없습니다. 적어도 이 작업을 수행 M-:(buffer-file-name)한 다음 이 일반적인 방법을 사용하여 나중에 붙여넣기 위해 표시된 결과를 킬 링에 복사할 수 있습니다. (물론 eval 을 할 수도 있지만 (kill-new (buffer-file-name)), 여기의 예는 내가 찾고 있는 결과를 얻기 위한 일반적인 접근 방식을 보여주기 위한 것입니다.)

답변1

C-u결과를 에코 영역으로 보내는 대신 결과를 삽입하려면 앞에 또는 를 입력하세요.M-:M-!

킬링 링에 직접 물건을 넣으려면 Elisp를 사용해 봐야 합니다. 다음과 같은 것(테스트되지 않음):

;;; 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)))

답변2

메시지 영역에 에코된 모든 메시지는 버퍼에 저장되므로 *Messages*버퍼( C-h e, view-echo-area-messages)로 전환하여 원하는 것을 선택하면 됩니다.

현재 버퍼에 의존하지 않는 표현식의 값을 얻으려는 경우 버퍼로 전환할 수도 있습니다 *scratch*. 표현식을 입력하고 C-j( eval-print-last-sexp)를 누르세요.

답변3

geekosaur의 솔루션을 약간 개선했습니다. 이 메서드는 표현식이 문자열이 아닌 것으로 평가되는 경우에도 올바르게 실행됩니다.

(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)

관련 정보