在 Sublime Text 2 中,我可以输入prnfunc[tab]
,然后它会完成到“PrintFunction”。如果我有一个项目,我可以按下Cmd+P
并输入srcpy/hello.py
,然后它会导航到source/python/hello_world.py
。emacs 中有等效项吗?
ps 我认为 emacs 中的 ido 提供了类似的模糊完成功能,但仅限于迷你缓冲区。
答案1
为了完成,尝试自动完成。要获得智能完成,您可能需要每种编程语言的“后端”。对于 Python,请尝试Emacs 绝地(免责声明:我的项目)。自动完成支持不区分大小写的完成。
对于项目管理,我建议结合舵和项目。有了这两个,你可以source/python/hello_world.py
通过类似的东西找到s rc py hello RET
。Helm 是一个用于增量完成和选择缩小的框架。因此,你不仅可以获得项目管理,还可以获得其他功能。eproject 是一个项目管理插件,它可以充当 Helm 的后端。
一次性设置所有内容可能很困难,因此我建议先设置简单的自动完成和 Helm。这两个将大大改善您的 Emacs 环境。
答案2
对于自动完成,我使用了 emacs 的修改版本。以下是我的文件dabbrev-expand
的相关部分(.emacs
来源):
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Make TAB expand words. Source: ;;
;; http://emacsblog.org/2007/03/12/tab-completion-everywhere/ ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun my-tab-fix ()
(local-set-key [tab] 'indent-or-expand))
(add-hook 'c-mode-hook 'my-tab-fix)
(add-hook 'cperl-mode-hook 'my-tab-fix)
(add-hook 'php-mode-hook 'my-tab-fix)
(add-hook 'js-mode-hook 'my-tab-fix)
(add-hook 'python-mode 'my-tab-fix)
(add-hook 'sh-mode-hook 'my-tab-fix)
(add-hook 'emacs-lisp-mode-hook 'my-tab-fix)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Define the indent-or-expand function we ;;
;; just mapped to TAB ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun indent-or-expand (arg)
"Either indent according to mode, or expand the word preceding
point."
(interactive "*P")
(if (and
(or (bobp) (= ?w (char-syntax (char-before))))
(or (eobp) (not (= ?w (char-syntax (char-after))))))
(dabbrev-expand arg)
(indent-according-to-mode)))
至于定位变量/函数声明,我使用Emacs 标签。这是我在我的系统中设置的方式~/.emacs
(不是我写的,我在某个地方找到了这些行):
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ETAGS ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun create-tags (dir-name)
"Create tags file."
(interactive "DDirectory: ")
(eshell-command
(format "find %s -type f -name \"*.[ch]\" | etags -L -" dir-name)))
;;; Jonas.Jarnestrom<at>ki.ericsson.se A smarter
;;; find-tag that automagically reruns etags when it cant find a
;;; requested item and then makes a new try to locate it.
;;; Fri Mar 15 09:52:14 2002
(defadvice find-tag (around refresh-etags activate)
"Rerun etags and reload tags if tag not found and redo find-tag.
If buffer is modified, ask about save before running etags."
(let ((extension (file-name-extension (buffer-file-name))))
(condition-case err
ad-do-it
(error (and (buffer-modified-p)
(not (ding))
(y-or-n-p "Buffer is modified, save it? ")
(save-buffer))
(er-refresh-etags extension)
ad-do-it))))
(defun er-refresh-etags (&optional extension)
"Run etags on all peer files in current dir and reload them silently."
(interactive)
(shell-command (format "etags *.%s" (or extension "el")))
(let ((tags-revert-without-query t)) ; don't query, revert silently
(visit-tags-table default-directory nil)))
(global-set-key "\M-s" 'tags-search)
最后我也强烈推荐欧洲央行对于任何编写代码的人来说emacs
:
ECB 代表“Emacs 代码浏览器”。虽然 Emacs 已经为许多模式提供了良好的编辑支持,但其浏览支持却有些欠缺。这就是 ECB 的作用所在:它显示许多信息窗口,便于轻松导航和概览源代码。
信息窗口可以包含:
- 目录树,
- 当前目录中的源文件列表(完全支持并显示 VC 状态),
- 当前文件中的函数/类/方法/... 列表(ECB 使用 CEDET 语义、Imenu 或 etags 来获取此列表,因此这些工具支持的所有语言也自动得到 ECB 的支持)
- 最近访问的文件的历史记录(可按多个标准分组),
- 为语义分析器提供直接和自动更新的 ecb 窗口,用于一些智能感知 Speedbar 和
- 编译的输出(编译窗口)和其他模式(如帮助、grep 等)或用户定义的要在此窗口中显示的任何内容。