3

我有一个非常复杂和密集的文件夹和文件结构。我想在emacs中快速打开一个离我家很远的文件。

C-x C-f不够快,因为我必须编写可能很长的路径(例如/very/long/and/boring/path/which/make/me/use/tab/for/autocompletion/too/much/and/ruins/my/hands/with/repetitive/strain/injuries/my_file_finally.tex:)

那么,是否有另一种方式(比C-x C-f)更快地打开此类文件,如果没有,是否有办法为最常用的文件创建快捷方式?

PS:我不想移动文件(长路径对我来说意味着干净有序的计算机)。

4

4 回答 4

8

除了上面的答案,helm可能是一个很好的解决你的问题的方法。虽然它在复杂的模式匹配和创建/管理/保存复杂的文件集方面做得比冰柱少,但 helm 做得既好又快(从击键的角度和软件/延迟的角度来看)。只要M-x package-install <ret> helm <ret>你准备好了。

首先,helm 可以跟踪recenf,你最近使用的文件的列表。只需M-x helm-recentf键入与您想要的文件名匹配的字符串/正则表达式,它将与您最近打开的文件名实时匹配。滚动并输入以选择一个。

可是等等!还有更多:(对不起,如果这开始听起来像广告)如果你在 Linux 上(我假设你在路径中使用斜杠并且似乎 emacs+linux > mac+linux),你可以使用 GNU locate,这是一个在系统上任何地方查找文件的工具,只要 locate 守护进程以前见过它,如果文件已经存在了任何时间,它可能已经存在(见下文何时它没有) . 这几乎是实时的。定位过程很快,并且 helm 实时流式传输结果。的命令是M-x helm-locate

现在,如果你想在 git/mercurial/bazaar/etc 中查找文件怎么办?项目?您可以使用projectile,一个“项目交互库”。使用 helm-projectile(您需要同时安装 projectile 和 helm-projectile,就像安装 helm 本身一样)。它将文件/目录名称和其他任何内容流式传输到 helm。再次。您只需要输入一个匹配任何地方的子字符串,helm 就会为您找到它。M-x helm-projectile

它的 Github README 说“helm 有很多能力”。要掌舵的还有很多很多。尝试 helm-moccur、helm-ack(外部包)、helm-imenu、helm-browse-code、helm-tracker-search、helm-dabbrev 等等等等。

最后:为什么要选择一个?helm 做得很好的一件事是创建你自己的命令。这是一个搜索上述所有内容的函数。

;; you'll need to require helm-config and helm-projectile somewhere above
(defun my-helm-omni (&rest arg) 
  ;; just in case someone decides to pass an argument, helm-omni won't fail.
  (interactive)
  (helm-other-buffer
    (append '(helm-c-source-buffers-list ;; list of all open buffers
               helm-c-source-recentf)    ;; all recent files

      ;; projectile errors out if you're not in a project 
      (if (projectile-project-p) ;; so look before you leap
        '(helm-source-projectile-files-list
           helm-source-projectile-recentf-list
           helm-source-projectile-buffers-list)
        '())

      '(
         helm-c-source-files-in-current-dir ;; files in current directory
         helm-c-source-locate               ;; file anywhere
         helm-c-source-bookmarks            ;; bookmarks too
         helm-c-source-buffer-not-found     ;; ask to create a buffer otherwise
         ))
    "*helm-omni*"))

我有这个必然C-c o

于 2013-10-09T23:24:13.297 回答
6

选项#1 - 每个分配的键一个功能:

(global-set-key (kbd "<f6>") (lambda () (interactive)
  (find-file "/Users/HOME/.0.data/todo.org")
  (message "Opened:  %s" (buffer-name))))

选项 # 2 -- 带有选项的函数:

(global-set-key (kbd "<f5>") 'lawlist-bookmark)

(defun lawlist-bookmark (choice)
  "Choices for directories and files."
  (interactive "c[D]ired | [v]ocab.org | [g]td.org | [d]iary.org | [n]otes.org")
    (cond
           ((eq choice ?D)
           (dired "/very/long/and/boring/path/which/make/me/use/tab/for/..."))
           ((eq choice ?v)
           (find-file "/Users/HOME/.0.data/vocab.org")
            (message "Opened:  %s" (buffer-name)))
          ((eq choice ?g)
           (find-file "/Users/HOME/.0.data/gtd.org")
            (message "Opened:  %s" (buffer-name)))
          ((eq choice ?d)
           (find-file "/Users/HOME/.0.data/diary.org")
            (message "Opened:  %s" (buffer-name)))
          ((eq choice ?n)
           (find-file "/Users/HOME/.0.data/notes.org")
            (message "Opened:  %s" (buffer-name)))
          (t (message "Quit"))))

选项#3 - 右键单击​​上下文菜单(弹出):

(global-set-key [mouse-3] 'lawlist-popup-context-menu)

(defvar lawlist-context-menu-map
  (let ((map (make-sparse-keymap "Context Menu")))
    (define-key map [find-file-todo] (cons "ToDo" (lambda () (interactive)
      (find-file "/Users/HOME/.0.data/todo.org"))))
    (define-key map [find-file-gtd] (cons "GTD" (lambda () (interactive)
      (find-file "/Users/HOME/.0.data/gtd.org"))))
    (define-key map [find-file-notes] (cons "Notes" (lambda () (interactive)
      (find-file "/Users/HOME/.0.data/notes.org"))))
    (define-key map [find-file-vocab] (cons "Vocab" (lambda () (interactive)
      (find-file "/Users/HOME/.0.data/vocab.org"))))
    (define-key map [find-file-diary] (cons "Diary" (lambda () (interactive)
      (find-file "/Users/HOME/.0.data/diary.org"))))
    (define-key map [seperator-three] '(menu-item "--"))
    (define-key map [help-for-help] (cons "Help" 'help-for-help))
    (define-key map [seperator-two] '(menu-item "--"))
    (define-key map [my-menu] (cons "LAWLIST" (make-sparse-keymap "My Menu")))
    (define-key map [my-menu 01] (cons "Next Line" 'next-line))
    (define-key map [my-menu 02] (cons "Previous Line" 'previous-line))
    (define-key map [seperator-one] '(menu-item "--"))
  map) "Keymap for the LAWLIST context menu.")

(defun lawlist-popup-context-menu  (event &optional prefix)
  "Popup a context menu."
  (interactive "@e \nP")
    (define-key lawlist-context-menu-map [lawlist-major-mode-menu]
      `(menu-item ,(symbol-name major-mode)
        ,(mouse-menu-major-mode-map) :visible t))
    (popup-menu lawlist-context-menu-map event prefix))

选项# 4——菜单栏下拉菜单:

(require 'easymenu)

(easy-menu-define lawlist-menu global-map "My own menu"
  '("lawlist"
    ["Next Line" next-line t]
    ["Previous Line" previous-line t]
    ["Dired Mode" dired t]
    ["--" my-function t]
    ("Favorites"
    ["Diary" (find-file "/Users/HOME/.0.data/diary.org")]
    ["--" diary]
    ["GTD" (find-file "/Users/HOME/.0.data/gtd.org")]
    ["--" gtd]
    ["Vocab" (find-file "/Users/HOME/.0.data/vocab.org")]
    ["--" vocab]
    ["Notes" (find-file "/Users/HOME/.0.data/notes.org")]
    ["--" notes]
    ["ToDo" (find-file "/Users/HOME/.0.data/todo.org")]
    )  ))
于 2013-10-09T23:11:15.170 回答
3
  1. 看到这个几乎相同问题的答案。特别是,考虑在Bookmark+中使用 (a) Dired 书签和其他与项目相关的书签,以及 (b) 在 Icicles 中使用与项目相关的辅助工具

  2. 您可以为长目录名称创建缩写 - 请参阅directory-abbrev-alist.

于 2013-10-09T22:15:41.370 回答
0

我还要提一下filecache.el。它基本上提供了一个专门的完成(您可以绑定到一个键以在输入文件名时使用),它首先在“文件名,无论目录”上完成,一旦完成,循环遍历找到此类文件的几个目录。

于 2013-10-10T18:09:59.417 回答