지점에서 파일을 미리 볼 수있는 Dired“quick-view”키


19

파일의 "빠른보기"를 수행하는 함수를 만들고 싶습니다.

이 작업을 수행하는 방법은 기능 키를 누른 상태에서 파일을 버퍼에 표시하지만 키를 해제하면 버퍼가 닫히고 dired 버퍼가 반환되는 것입니다. 로 임시 버퍼를 닫고 싶지 않습니다 C-x k .

Emacs에서이 기능을 만드는 방법이 있습니까? keypress / depress에 함수를 바인딩 할 수 있다면 가능할 것 같습니다.


1
프레스 디 프레스 이벤트에 바인딩 할 수는 없지만이 기능은 사용자 지정 맵과 타이머를 사용하여 확실히 해킹 할 수 있습니다.
Jordon Biondo

미리보기가 표시되는 새 창에 대해 이야기하고 있습니까? 아니면 키를 누르고있는 동안 버퍼 내용이 dired 창에 표시됩니까?
nispio

1
우리가 사건에 묶 이도록 노력하고 있습니까? 이 기능을 원합니다.
wdkrnls

답변:


9

다음은 타이머를 활용하여 키 다운 / 업 이벤트 바인딩을 시뮬레이션하는 슈퍼 해키 방법입니다.

전반적으로 나는 시그마의 대답으로 가라고 제안하지만, 당신은 시도해야 할 의무가 있으므로 미리보기를 닫을 방법을 요청했습니다.

기본적으로 수행 할 수있는 작업은 "키 다운"기능인 일부 기능을 키 바인딩에 바인딩하고 해당 작업 내에서 "키업"기능인 기능을 실행하는 유휴 타이머를 시작하는 것입니다. 지정된 키가 있으면 "키 다운"기능이 계속 반복되어 유휴 타이머가 실행되지 않습니다. 물론 "keydown"기능에서 일종의 noop 기능에 키를 리 바인딩 한 다음 "keyup"기능에서 "keydown"기능을 리 바인딩하여 명령이 계속 실행된다는 사실을 보상해야합니다.

따라서 유스 케이스의 경우 "keydown"함수는 해당 시점의 파일 내용으로 미리보기 버퍼를 열고 해당 미리보기 버퍼에서 동일한 키 콤보를 noop like 명령에 바인딩합니다. "키 다운"기능은 또한 미리보기 버퍼를 삭제하고 원래 위치로 복원하는 유휴 타이머를 시작합니다.

짧은 이야기는 여기 코드입니다.

이 기능을 키 콤보에 바인딩합니다 (사용했습니다 C-M-v). 파일 이름 위에서 눌렀을 때 파일의 내용을 표시하는 새 버퍼가 열리고, 놓으면 원래대로 돌아갑니다. 완충기.

(setq lexical-binding t)

(defun quick-view-file-at-point ()
  "Preview the file at point then jump back after some idle time.

In order for this to work you need to bind this function to a key combo, 
you cannot call it from the minibuffer and let it work.

The reason it works is that by holding the key combo down, you inhibit
idle timers from running so as long as you hold the key combo, the 
buffer preview will still display."
  (interactive)
  (let* ((buffer (current-buffer))
         (file (thing-at-point 'filename t))
         (file-buffer-name (format "*preview of %s*" file)))
    (if (and file (file-exists-p file))
        (let ((contents))
          (if (get-buffer file)
              (setq contents (save-excursion
                               (with-current-buffer (get-buffer file)
                                 (font-lock-fontify-buffer)
                                 (buffer-substring (point-min) (point-max)))))
            (let ((new-buffer (find-file-noselect file)))
              (with-current-buffer new-buffer
                (font-lock-mode t)
                (font-lock-fontify-buffer)
                (setq contents (buffer-substring (point-min) (point-max))))
              (kill-buffer new-buffer)))
          (switch-to-buffer (get-buffer-create file-buffer-name))
          (setq-local header-line-format "%60b")
          (delete-region (point-min) (point-max))
          (save-excursion (insert contents))
          (local-set-key (kbd "C-M-v") (lambda () (interactive) (sit-for .2)))
          (run-with-idle-timer
           .7 
           nil
           (lambda ()
             (switch-to-buffer buffer)
             (kill-buffer file-buffer-name))))
      (message "no file to preview at point!"))))

또한 여기에 실제로 작동하는 GIF가 있습니다.

  • 커서를 파일 위에 놓으십시오
  • 내 키 바인딩을 길게 누릅니다
  • 미리보기가 표시됩니다
  • 내가 놓으면 미리보기가 종료되고 현재 위치로 돌아갑니다.

여기에 이미지 설명을 입력하십시오

유념해야 할 한 가지 중요한 점은 유휴 타이머의 초입니다. 내 코드에서는 사용 .7했지만 마법의 숫자입니다. 실제로 작게 유지하려고하지만 미리보기가 두 번 깜박이는 것을 볼 때마다 매초마다 1/10을 올리십시오. 기계에 적합한 지점을 찾을 때까지

* 또한 함수에서 미리보기 버퍼의 글꼴을 만들려고 시도했지만 작동시키지 못했습니다. 더 유용하게 만드는 다음 단계입니다. **


좋은! 이것은 우리가 여기서 볼 필요가있는 것입니다.
Malabarba

나는 Error running timer: (void-variable buffer)이것을 가지고, buffervar 내부에서 사용할 수없는 것처럼 보 run-with-idle-timer입니까?
Lee H

t는 어휘 결합 확인
조던 Biondo

이 대답을 반복 할 수 있습니다 저기 .
Malabarba

8

주석에서 지적했듯이 함수는 이벤트가 아닌 키에 바인딩됩니다. 그러나 한 걸음 물러서려면 파일의 내용을 읽는 동안 키를 계속 유지하는 것이 왜 중요한지 잘 모르겠습니다. 또한 더 많은 것을 얻기 위해 스크롤하는 것과 같은 기본적인 (그리고 합리적인) 동작과 호환되지 않습니다. 시간이 걸리면 불편할 수 있다는 사실은 말할 것도 없습니다. :)

대신 키를 반복 하는 것은 어떻습니까? 다음과 같은 것이 기능적으로 동등한 기본 골격이 될 수 있습니다.

(defun my-dired-view-file ()
  (interactive)
  (dired-view-file)
  (local-set-key (kbd "<f5>") 'View-quit))

(define-key dired-mode-map (kbd "<f5>") 'my-dired-view-file)

어쨌든,이 시점에서 귀하의 질문에 대답하는 것보다 사용 사례에 더 도전적입니다.


긴 파일 목록을 흐리게 생각하고 있습니다. 각 파일의 내용이 확실하지 않습니다. F5를 볼 수 있다면 F5를 사용 중지하고 다시 시청을 중단 한 후 다음 후보로 계속하십시오. 사용 사례를 반박하지 않았다고 생각하지만 좋은 대안을 제안했을 수 있습니다. F5를 다시 누르면보기가 중지됩니다.
Eric Brown

당신이 제안하는 것은 자정 사령관 (F3)의 기능을 비교할
에릭 브라운

1
@Sigma가 제출 한 답변은 흥미 롭습니다. 그러나 dired를 사용하여 디렉토리를 탐색 할 때는 이미 v를 눌러 파일을보고 해당 파일을 볼 때 q를 눌러 종료하고 디렉토리로 돌아갈 수 있습니다. 보고, 끝내기 위해 같은 키를 누르는 것이 더 쉽다고 생각합니다.
Nsukami _

@LeMeteore 저를 상기시켜 주셔서 감사합니다 dired-view-file! 코드를 활용하여 코드를 활용했습니다. 예, 이런 종류의 시나리오에서는 다른 키로 이동할 필요가없는 것 같습니다.
Sigma

4

구현하기가 매우 어려운 키를 누른 상태에서 파일을 표시하는 대신 다음 키를 누를 때까지 파일을 표시하는 것이 좋습니다.

(defun dired-find-file-until-key ()
  (interactive)
  (let ((filename (dired-file-name-at-point))
    (buffer-count (length (buffer-list))))
    (dired-find-file)
    (message "Showing %s temporarily..." filename)
    (isearch-unread-key-sequence (list (read-event)))
    (if (= (length (buffer-list)) buffer-count)
    (bury-buffer)
      (kill-buffer))))

다음은 파일을 다른 창에 표시하는 변형입니다. 더 편리한 사용자 인터페이스라고 생각합니다.

(defun dired-find-file-other-window-until-key ()
  (interactive)
  (let ((buffer-count (length (buffer-list))))
    (dired-find-file-other-window)
    (isearch-unread-key-sequence (list (read-event)))
    (if (= (length (buffer-list)) buffer-count)
    (delete-window)
      (kill-buffer-and-window))))

버퍼에서 스크롤하는 것만 큼 많은 것을 할 수는 없습니다. 스크롤 명령이 허용되는 "빠른보기"모드를 구현하는 것이 더 합리적이지만 다른 입력 이벤트로 인해 빠른보기 모드가 종료되고 Isearch와 같은 이전 모드에 따라 해석됩니다.

v( dired-view-file), 당신은 중간 뭔가를 얻을 : 버퍼가에서 편집 보기 모드 는, 주위 스크롤 검색 등하지만 버퍼를 폐쇄하는 것은 간단한 키 입력입니다 수있는 곳 q.


2

마우스를 사용하는 경우 원하는 미리보기를 툴팁 에 넣는 것도 가능합니다 . 그런 다음 마우스를 파일 이름 (속성 포함 help-echo) 위로 이동 하면 미리보기가 나타납니다.

예를 들어, 파일 이름 위에 마우스를 올릴 때 이미지 파일과 관련된 이미지의 미리보기를 표시하기 위해 Dired + 에서이 기술을 사용 합니다.

당신은 로딩 후이 작업을 수행하여이 효과를 볼 수있다 dired+.el:

  • tooltip-mode켜져 있는지 확인하십시오 (tooltip-mode 1)..

  • 옵션에 값 diredp-image-preview-in-tooltip이 아닌지 확인하십시오 nil(썸네일 크기 또는 full전체 크기 이미지).

  • Dired에서 이미지 파일 이름 위에 마우스 포인터를 놓습니다.

원하는 기능 diredp-mouseover-help을 수행하는 데 영감을주는 기능 으로 코드를 사용할 수 있습니다 (마우스 오버에 "빠른보기"표시). 사용 방법은 해당 함수의 호출을 참조하십시오. 다음은 그러한 전화 중 하나입니다.

 (add-text-properties (line-beginning-position) (line-end-position)
                      '(mouse-face highlight help-echo diredp-mouseover-help))

"마우스를 사용하면"에서 나를 잃었습니다. ;-) 이것은 나를 위해 작동하지 않습니다. image-dired잘 작동하지만 마우스를 mouse-1: visit this file/dir in another window
올렸을

dired+.el내가 준 다른 지시를 따르고 따르지 않으면 내가 한 말을 볼 수 없습니다 . 바닐라 이맥스 기능이 아닙니다. 원하는 코드를 작성하여 원하는 작업을 수행하는 방법에 대해 설명하려고했습니다. dired+.el코드는 아주 가까이, 내 생각, 당신은 당신이 원하는 무슨 말을하는 것입니다. 그러나 그렇습니다. 마우스 오버 툴팁을 사용하려면 마우스를 사용해야합니다. 그렇지 않으면 툴팁을 사용하라는 제안이별로 도움이되지 않습니다. ;-)
Drew

패키지를로드하고 지시 사항을 따르는 방법을 알고 있지만 작동하지 않습니다. 대화에서이 대화를 재개하는 방법을 잘 모르겠지만 아마도 그렇게해야합니다.
nispio


1

dired 버퍼 v에서보기 전용 모드로 파일을 방문하고 q보기 모드를 종료하고 dired 버퍼로 돌아갑니다. 이것은 파일을 미리 보는 빠른 방법이며, 버퍼를 스크롤하고 검색 할 수도 있습니다.

emacs가 운영 체제로부터받는 저수준 키 누르기 메시지를 전달할 수 있다고 생각하지 않습니다. 이것은 역사적인 이유로 부분적 일 수 있습니다. 1970 년대와 1980 년대에 이맥스가 개발 될 당시 해커 ( "프로그래머"라고 읽음)가 이용할 수있는 터미널은 실시간 키 업 / 다운 이벤트가 아니라 문자와 이스케이프 시퀀스의 간단한 입력으로 작동하지 않았습니다. 현재까지 emacs는 간단한 ASCII 문자와 이스케이프 시퀀스 만 사용하여 간단한 터미널 또는 SSH 세션의 범위에서 인상적으로 잘 작동 할 수 있습니다.

메뉴, 다중 프레임 관리 및 마우스 상호 작용과 같은 기능을 포함하여 기능이 수년 동안 크게 성장하지 않았다는 것은 아닙니다. 확장에 사용할 수있는 저수준 키 메시지를 만들기 위해 emacs를 변경 (핵심적으로) 할 수 없었던 이유는 없습니다.하지만 숨을 참지는 않습니다.

( 면책 조항 : 이 게시물은 어려운 사실이 아니라 의견과 추측으로 간주되어야합니다.)


1

나는이 SO 질문 /programming/26409768/how-to-show-buffer-content-in-real-time-in-other-window-when-focus-is-in- 완충기

내 대답은 네비게이션 키의 동작을 변경하는 것입니다 np다른 창에서 지점에있는 파일을 표시합니다. 포커스는 dired 버퍼에 유지되며 탐색을 계속할 때 방문한 버퍼를 종료합니다.

이 기능을 쉽게 활성화 / 비활성화하기위한 마이너 모드를 만들었습니다. «normal»탐색을위한 화살표 키가 여전히 있습니다. 전화하십시오 M-x dired-show-mode(또는 ranger-mode이것이 레인저 파일 관리자 에서 발견 된 기능이므로 ).

코드 : (모든 리뷰 및 버그 보고서에 감사드립니다!) https://gitlab.com/emacs-stuff/my-elisp/blob/master/dired-show.el

(defgroup dired-show nil
  "See the file at point when browsing in a Dired buffer."
  :group 'dired
  )

(setq show-next-current-buffer nil)

(defun show-next ()
     (interactive)
     (next-line 1)
     (dired-find-file-other-window)
     (if show-next-current-buffer (kill-buffer show-next-current-buffer))
     (setq show-next-current-buffer (current-buffer))
     (other-window 1)
     )

(defun show-previous ()
     (interactive)
     (previous-line 1)
     (dired-find-file-other-window)
     (if show-next-current-buffer (kill-buffer show-next-current-buffer))
     (setq show-next-current-buffer (current-buffer))
     (other-window 1)
     )


(define-minor-mode dired-show-mode
  "Toggle preview of files when browsing in a Dired buffer."
  :global t
  :group 'dired-show
  (if dired-show-mode
      (progn
        (define-key dired-mode-map "n" 'show-next)
        (define-key dired-mode-map "p" 'show-previous)
        )
  (define-key dired-mode-map "n" 'diredp-next-line)
  (define-key dired-mode-map "p" 'diredp-previous-line)
  ))

(defalias 'ranger-mode 'dired-show-mode)

(provide 'dired-show)
;;; dired-show ends here

0

다른 이벤트가 없거나 전혀 읽힐 때까지 이벤트 큐를 폴링해야합니다. CPU로드는 눈에 띄게 낮지 만 상당히 낮습니다.

(defun dired-preview-command ()
  (interactive)
  (let* ((file (or (dired-get-filename nil t)
                   (error "No file here")))
         (visited-p (get-file-buffer file))
         (buffer (or visited-p (find-file-noselect file)))
         (window
          (display-buffer buffer '(nil . ((inhibit-same-window . t)))))
         (event (read-event)))
    (while (and event (eq last-command-event event))
      (setq event (read-event nil nil 0.1)))
    (when event
      (setq unread-command-events
            (list event)))
    (quit-window (not visited-p) window)))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.