삭제 된 버퍼에서 해당 디렉토리의 가장 중요한 파일을 가리 킵니다.


14

내가 Emacs에서 디렉토리를 방문했을 때의 90 %는 내가 가장 먼저하는 일은 특정 파일로 포인트를 옮겨서 여는 것이다. 많은 경우에, 내가 열어야하는 파일은 매우 예측 가능합니다. 예를 들어 :

  • .tex이 디렉토리에 파일이 있으면 보통으로 이동합니다 master.tex.
  • 안드로이드 프로젝트의 근원은 일반적으로 AndroidManifest.xml입니다.
  • emacs 패키지를 개발하는 디렉토리에서는 거의 항상 패키지의 기본 소스 파일입니다. 일반적 .el으로이 디렉토리 의 유일한 파일 은 아닙니다 .

이 디렉토리를 열 때 자동으로이 파일들을 가리킬 수있는 방법이 있습니까?

이것은 많은 편의를 제공 RET하지만 (방문하여 열 수 있기 때문에 ) 다른 파일을 방문하는 유연성을 여전히 제공합니다.

답변:


16

에 대한 사용자 정의 함수를 작성하십시오 dired-initial-position-hook. 이 함수에서 다양한 dired 함수를 사용하여 파일을 검색하고 결국 dired-goto-file"최상의"파일로 포인트를 이동하도록 호출 할 수 있습니다.

(defun my-dired-goto-important-file ()
  "Go to an important file in the current dired buffer."
  (unless (bound-and-true-p save-place)
    (let ((candidates '("master.tex" "AndroidManifest.xml"))
          candidate)
      (while (and candidates
                  (not (dired-goto-file (expand-file-name (pop candidates)))))
        nil))))

(add-hook 'dired-initial-position-hook #'my-dired-goto-important-file)

다음에서는이 기능의 특정 측면을 설명하고 잠재적 인 확장을 강조합니다.

파일로 점프

dired-goto-filenil파일이 현재 dired 버퍼에 존재하지 않으면를 반환 하므로 사전 확인없이 호출하는 것이 안전합니다. 그러나 dired-goto-file필요 절대 따라서, 파일 이름 (상대 이름에 오류) expand-file-name.

파일 검색

Dired는 파일을 검색하기위한 간단한 API를 제공하지 않습니다. 일반적으로 버퍼의 모든 줄을 반복하는 것처럼 모든 파일을 반복 할 수 있습니다.

(let (files)
  (goto-char (point-min))
  (while (not (eobp))
    (let ((filename (dired-get-filename nil 'no-error)))
      (when filename
        (push filename files)))
    (forward-line 1))
  ;; Now `files' is a list of files, which you can search for patterns
  ;; …
  )

그러나 표시 기능을 사용하는 것이 더 편리합니다. 기존의 대화식 표시를 풀지 않도록 "비정상적인"표시 문자를 사용하십시오.

(unwind-protect
    (when (dired-mark-files-regexp (rx ".tex" string-end) ?t)
      (dired-goto-file (expand-file-name "master.tex")))
  (dired-unmark-all-files ?t))

장소 모드 저장

또한 장소 저장 모드를 사용하도록 설정 한 경우 신중하게 설정해야합니다. Dired 버퍼에서, 장소 저장 모드는 다른 모드에서와 같이 포인트 값을 기억하지 않고 마지막 파일 이름 포인트가 켜져 있습니다. 그것은 우리가하는 것처럼이 파일 이름을 복원합니다 : 그것은 연결 dired-initial-position-hook하고 호출합니다 dired-goto-file(사실, 내가 그 코드를 훔친 곳 :)).

우리 장소가 장소를 저장하기 전에 온다면, 장소 저장 모드는 우리의 위치를 ​​무조건 덮어 씁니다. 그러나이 후크를 설정 한 후 저장 장소가 활성화 된 경우와 같이 후크 앞에 오면 실제로는 저장 장소를 덮어 쓰게되므로 바람직하지 않습니다. 그러나 모든 버퍼에서와 같이 Save Place는 로컬 변수 save-place를 0이 아닌 값으로 설정하므로 간단히 확인할 수 있으며 Save Place는 파일 이름을 복원하지 않습니다.

장소 저장이“느슨하게”되려면를 save-place확인하고 장소 저장 모드를 먼저 활성화 한 다음 인수가 0이 아닌 값으로 호출 하여 장소 저장 후에 후크가 실행되는지 확인하십시오 .add-hookAPPEND


좋은 대답입니다. 당신은 정의 할 수 있습니다bound-and-true-p . :-)
Malabarba

@Malabarba bound-and-true-p는의 내장 매크로입니다 bindings.el.
lunaryorn

사랑하는 하나님, 나는 내가 더 나쁘게 느끼지 않는 이유, 내가 알지 못했던 사실 또는 심지어 확인조차하지 않은 사실.
Malabarba

@Malabarba이 기능의 존재를 발견하는 데 1 년이 걸렸습니다.
lunaryorn

예, 그것은 지금까지 들어 본 적이없는 훌륭한 기능입니다!
sanityinc
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.