如何在emacs中快速打开文件?

时间:2013-10-09 21:45:38

标签: file emacs organization

我有一个非常复杂和密集的文件夹和文件结构。我想在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更高),如果没有,是否有办法为最常用的文件创建快捷方式?

P-S:我不想移动文件(长路径意味着我清理和组织计算机)。

4 个答案:

答案 0 :(得分:8)

除上述答案外,helm可能是解决您问题的好方法。虽然它在复杂模式匹配和创建/管理/保存复杂文件集的范围内确实不到icicles,但是helm做了它做得很好而且快速(两者都来自击键角度和软件/延迟视角)。只需M-x package-install <ret> helm <ret>就可以了。

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

但是等等!还有更多:(对不起,如果这开始听起来像一个广告)如果你在Linux上(我会假设,因为你在你的路径中使用斜线,似乎emacs + linux&gt; mac + linux),你可以使用GNU locate,这是一种用于在系统中的任何位置查找文件的工具,只要找到该守护程序之前已经看过它,如果文件已经存在任何时间,它可能具有该工具(请参阅下文,了解它何时没有) )。这几乎是实时的。定位过程很快,并且helm实时传输结果。对此的命令是M-x helm-locate

现在,如果你想在git / mercurial / bazaar / etc中找到文件怎么办?项目?您可以使用projectile,一个“项目交互库”。使用舵弹(你需要安装射弹和舵弹,就像你自己掌舵一样)。它会将文件/目录名称和其他任何内容串流为helm。再来一次。您只需键入一个匹配任何位置的子字符串,helm将为您找到它。 M-x helm-projectile

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

最后:为什么选择一个?掌舵真正做的一件事就是创建自己的命令。这是一个搜索以上所有内容的函数。

;; 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

答案 1 :(得分:2)

  1. 请参阅this answer几乎相同的问题。特别是,考虑在书签+ 中使用(a)Dired书签和其他与项目相关的书签,以及(b) Icicles 中与项目相关的帮助。

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

答案 2 :(得分:2)

选项#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")]
    )  ))

答案 3 :(得分:0)

我还会提到filecache.el。它基本上提供了一个专门的完成(你可以绑定到输入文件名时使用的密钥),它首先在“文件名,无论目录”上完成,然后一旦完成,循环遍历找到这些文件的几个目录。