2014-04-27 5 views
4

Emacs에서는 광범위하게 recentf을 사용합니다. find-files을 호출하는 대신, 대개 사용자 정의 함수 xsteve-ido-choose-from-recentf을 호출하여 내 recentf 파일 중에서 선택할 수 있습니다.Emacs에서 최근 디렉토리 목록을 유지하는 방법은 무엇입니까?

최근 파일 목록과 별도로 최근 디렉토리 목록을 별도로 만들고 유지 관리하려면 어떻게합니까? 따라서 dired을 호출하는 대신 ido-choose-from-recent-directories과 같은 것을 호출 할 수 있습니까?

+1

'에서) (교체 - 정규 표현식 -에 - 문자열 집 "~ "path))'를'# 'abbreviate-file-name'과 함께 사용합니다. – Stefan

답변

2

Pragmatic Emacs이 솔루션을 찾았습니다. 여기

아이비 (swiper의 일부) 동적 범위를 좁히려면 다음 dired에서 선택한 하나를 열 수를 사용하여, 당신에게 최근 디렉토리의 목록을 제공하는 기능입니다.

;; open recent directory, requires ivy (part of swiper) 
;; borrows from http://stackoverflow.com/questions/23328037/in-emacs-how-to-maintain-a-list-of-recent-directories 
(defun bjm/ivy-dired-recent-dirs() 
    "Present a list of recently used directories and open the selected one in dired" 
    (interactive) 
    (let ((recent-dirs 
     (delete-dups 
      (mapcar (lambda (file) 
        (if (file-directory-p file) file (file-name-directory file))) 
        recentf-list)))) 

    (let ((dir (ivy-read "Directory: " 
         recent-dirs 
         :re-builder #'ivy--regex 
         :sort nil 
         :initial-input nil))) 
     (dired dir)))) 

(global-set-key (kbd "C-x C-d") 'bjm/ivy-dired-recent-dirs) 

출처 : xsteve - 이도는 - 선택 -에서 - recentf`, 당신이 당신`(람다 (경로를 대체 할 수 Open a recent directory in dired: revisited | Pragmatic Emacs

3

별도의 목록을 유지할 필요가 없습니다 (많은 작업). 대신, 최근 목록에서 해당 목록을 추출 할 수 있습니다. 예 :

(delete-dups 
(mapcar (lambda (file) 
      (if (file-directory-p file) file (file-name-directory file))) 
     recentf-list)) 
+0

감사합니다. 그리고 위의 목록에서 최근 디렉토리 목록을 보는 방법은 무엇입니까? – incandescentman

3

당신은 스테판의 대답 @ 회신 의견에 질문 : 그리고 최근의 디렉토리의 목록을보기에 위에서 어떻게받을 수 있나요? -

대답은 당신이 작은 알려진 사실을 사용하는 것이입니다 diredDIRNAME 인수가 (b)는 파일 (또는 디렉토리) 이름, Dired 다음의 (a) 새로운 Dired 버퍼 이름의 목록입니다 경우 파일/디렉토리 만 열립니다. IOW : 예를 들어

M-: (dired (cons DIRED-BUFNAME YOUR-LIST-OF-RECENT-DIRECTORIES)) 

: 당신이 라이브러리 Dired+를 사용하는 경우

M-: (dired '("My Dired Buffer" "https://stackoverflow.com/a/recent/dir/" "/another/recent1/" "/another/")) 

당신은 dired과 비 양성 접두사 인수를 사용하여 대화 형 등의 목록을 제공 할 수 있습니다.

하지만이 경우 가장 최근 디렉토리 목록을 수집 한 다음 Dired를 열어 명령을 작성하고 싶습니다. 이 작업을 수행해야합니다.

(defun dired-recent (buffer) 
    "Open Dired in BUFFER, showing the recently used directories." 
    (interactive "BDired buffer name: ") 
    (let ((dirs (delete-dups 
       (mapcar (lambda (f/d) 
          (if (file-directory-p f/d) 
           f/d 
          (file-name-directory f/d))) 
         recentf-list)))) 
    (dired (cons (generate-new-buffer-name buffer) dirs)))) 

그게 효과가 있습니다. 그러나 바닐라 이맥스는 i을 사용하여 Dired 버퍼의 default-directory과 같은 디렉토리 트리에없는 디렉토리 목록을 삽입 할 수 없습니다. 즉 위의 코드는 정상적으로 작동하지만 목록에있는 디렉토리를 삽입 할 수는 없습니다.

라이브러리를로드하려면 dired+.el을로드하십시오. Dired+은 또한 바닐라 처리에 대한 몇 가지 부적절한 점을 dired으로 수정합니다.

위 코드는 과 함께 Dired +과 함께 제공해야합니다.


UPDATE는

난 그냥 Dired+이 추가되었습니다. 추가 된 명령은 diredp-dired-recent-dirsdiredp-dired-recent-dirs-other-window입니다. 2


UPDATE 나는 간단 포함하거나 제외하기 위해 최근에 사용 된 디렉토리의 어떤 선택했다.접두어 arg를 사용하여 그러한 선택을 시작하십시오. 접두어를 붙이지 않으면 모든 최근 dir을 얻을 수 있습니다. 또한 접두사 arg를 사용하여 ls 스위치에 대한 프롬프트를 표시 할 수있게했습니다. R가 + r 시프트입니다 C-x R (같은 창) 및 C-x 4 R (다른 창), 마지막으로, 나는 명령에 대한 바인딩을 추가

Open Dired in BUFFER, showing recently used directories. 
You are prompted for BUFFER. 

No prefix arg or a plain prefix arg (`C-u', `C-u C-u', etc.) means 
list all of the recently used directories. 

With a prefix arg: 
* If 0, `-', or plain (`C-u') then you are prompted for the `ls' 
    switches to use. 
* If not plain (`C-u') then: 
    * If >= 0 then the directories to include are read, one by one. 
    * If < 0 then the directories to exclude are read, one by one. 

When entering directories to include or exclude, use `C-g' to end. 

다음은 문서의 diredp-dired-recent-dirs의 트링입니다.