때때로 나는 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)