我有一个非常复杂和密集的文件夹和文件结构。我想在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:我不想移动文件(长路径意味着我清理和组织计算机)。
答案 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)
请参阅this answer几乎相同的问题。特别是,考虑在书签+ 中使用(a)Dired书签和其他与项目相关的书签,以及(b) Icicles 中与项目相关的帮助。
< / LI>您可以为长目录名创建缩写 - 请参阅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
。它基本上提供了一个专门的完成(你可以绑定到输入文件名时使用的密钥),它首先在“文件名,无论目录”上完成,然后一旦完成,循环遍历找到这些文件的几个目录。