是否有 emacs 插件可以执行类似 Sublime 的补全并转到任何内容?

是否有 emacs 插件可以执行类似 Sublime 的补全并转到任何内容?

在 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)))

您也可能对。。。有兴趣yasnippet嬉皮士 展开

至于定位变量/函数声明,我使用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 等)或用户定义的要在此窗口中显示的任何内容。

相关内容