目前,当我使用 C 或 C++ 进行编码时,我使用 Emacs 的工作流程涉及三个窗口。右侧最大的包含我正在使用的文件。左侧分为两部分,底部是一个 shell,我用它来输入编译或 make 命令,顶部通常是我在工作时想要查阅的某种文档或自述文件。现在我知道有一些非常专业的 Emacs 用户,并且我很好奇如果打算将其用作完整的 IDE,那么其他 Emacs 功能上还有什么用处。具体来说,大多数 IDE 通常以某种形式实现这些功能:

  • 源代码编辑器
  • 编译器
  • 调试
  • 文档查找
  • 版本控制
  • OO 功能,例如类查找和对象检查器

对于其中的一些功能,Emacs 如何适应这些功能是非常明显的,但是其余的呢?另外,如果一定要关注某种特定的语言,我认为应该是C++。

编辑: 一位用户指出,当我说“其余的呢”时,我应该更具体。我主要对高效的版本控制以及文档查找感到好奇。例如,在 SLIME 中,对 Lisp 函数进行快速超规范查找相当容易。有没有一种快速的方法可以在 C++ STL 文档中查找某些内容(如果我忘记了确切的语法) 哈希映射, , 例如)?

有帮助吗?

解决方案

您必须具体说明“其余”的含义。除了对象检查器(我知道)之外,emacs 很容易完成上述所有操作:

  • 编辑器(显而易见)
  • 编译器 - 只需运行 M-x compile 并输入你的编译命令。从那时起,您就可以 M-x compile 并使用默认值。Emacs 将捕获 C/C++ 编译器错误(与 GCC 配合使用效果最佳)并帮助您导航到有警告或错误的行。
  • 调试 - 同样,当你想调试时,输入 M-x gdb 它会创建一个带有特殊绑定的 gdb 缓冲区
  • 文档查找 - emacs 具有出色的 CScope 绑定用于代码导航。对于其他文档:Emacs 还有一个联机帮助页阅读器,对于其他一切,还有网络和书籍。
  • 版本控制 - 有很多针对各种 VCS 后端的 Emacs 绑定(CVS、SCCS、RCS、SVN、GIT 都可以想到)

编辑:我意识到我关于文档查找的答案确实与代码导航有关。以下是一些更重要的信息:

谷歌搜索无疑会揭示更多的例子。

正如第二个链接所示,即使不支持开箱即用,也可以在其他文档中查找函数(以及其他内容)。

其他提示

我必须推荐一下 Emacs 代码浏览器 作为 emacs 更“传统”的 IDE 风格环境。

编辑:我现在也推荐 马吉特 远远超过 emacs 中的标准 VCS 界面。

您是否尝试过 M-x 编译,而不是在 shell 窗口中运行 make 命令?它将运行 make 命令,显示错误,并且在许多情况下,如果输出包含文件名和行号,则可以很容易地跳转到导致错误的代码行。

如果您是 IDE 的粉丝,您可能还想看看 emacs 的 speedbar 软件包 (M-x speedbar)。而且,如果您还没有了解如何使用标签表来导航您的代码,请了解一下。

一旦发现 emacs 的某些角落,它们就能以你从未想过的方式提高工作效率。正如其他人提到的,使用标签是缩放源代码的一种奇妙且快速的方法,并且使用 M-/ (dabbrev-expand) 通常可以完全满足您在完成变量名称时所期望的效果。

使用“occurrence”对于获取包含缓冲区中所有出现的正则表达式的缓冲区非常有用。当重构代码和查找代码片段或变量的使用时,或者如果您在源文件中使用 TODO 标记并且想要访问它们全部时,这非常方便。

冲洗行、排序数字字段、替换正则表达式和矩形函数对于从某些工具中获取转储并将其转换为有用的数据(例如 elisp 程序或逗号分隔的电子表格)非常有用。

我写了一个关于 IDE 的页面,就像你可以用 emacs 做的事情一样

http://justinsboringpage.blogspot.com/2007/09/11-visual-studio-tricks-in-emacs.html

学习 elisp 是另一种很好的方法,可以让你自己回答除了典型 IDE 之外 emacs 还能做什么。

例如,我在博客中写过关于编写 Perforce 辅助函数的文章,例如blame(编写您自己的函数意味着您可以使其完全按照您想要的方式运行)...

http://justinsboringpage.blogspot.com/2009/01/who-changed-line-your-working-on-last.html

我还编写了一些代码,可以动态地为某个函数创建注释,这与我正在使用的编码标准相匹配。

我的 elisp 代码都不是特别出色,而且其中大部分已经存在于库中,但是能够让 emacs 执行工作日中出现的自定义内容确实非常有用。

您可以在以下位置找到 emacs 和版本控制集成的详细说明 我的网站. 。我还在撰写有关使用 Emacs 作为多种语言的开发环境的文章 - C/C++、Java、Perl、Lisp/Scheme、Erlang 等...

对于版本控制,您可以使用多种方法,具体取决于您使用的版本控制系统。但有些功能是所有这些功能所共有的。

vc.el 是在文件级别处理版本控制的内置方法。它具有大多数版本控制系统的后端。例如,Emacs 附带了 Subversion 后端,还有 git 后端和其他来源提供的其他后端。

最有用的命令是 C-x v v (vc-next-action) 对您正在访问的文件执行适当的下一步操作。这可能意味着从存储库更新或提交更改,vc.el 也会重新绑定 C-x C-q 如果您使用的系统需要它(例如 RCS),则可以签入和签出文件。

其他非常有用的命令是 C-x v lC-x v = 显示您正在使用的文件的日志和当前差异。

但为了真正提高工作效率,除了简单的事情之外,您应该避免使用单文件 vc.el 命令。有几个包可以让您概览整个树的状态,并为您提供更多功能,更不用说创建跨多个文件的连贯提交的能力了。

其中大部分都深受原作影响或基于原作 pcl-CVS/个人计算机视觉系统 对于CVS。甚至有两个是带有颠覆性的, PSVN.eldsvn.el. 。有 git 等的软件包。

好的,这里的每个人都给出了完美的提示,使 emacs 成为一个出色的 IDE。

但任何人都应该记住,当您使用大量扩展(尤其是用于动态类型检查、函数定义查找等的扩展)自定义 emacs 时,您的 emacs 对于编辑器来说加载速度会非常非常慢。

为了解决这个问题,我强烈建议使用 emacs server mode.

它使用起来非常简单,无需自定义您的初始化文件。你只需要以守护进程模式启动 emacs 即可;

emacs --daemon

这将创建一个 emacs 服务器,然后您可以从终端或 gui 连接它。我还建议创建一些别名以方便调用。

alias ec="emacsclient -t"
alias ecc="emacsclient -c &"
# some people also prefer this but no need to fight here;
alias vi="emacsclient -t"

这样,emacs 的启动速度将比 gedit 更快,我保证。

这里可能存在一个问题,如果您从临时用户运行 emacs 守护进程,您可能无法连接 emacs 服务器,因为 root.

因此,如果您需要打开具有 root 访问权限的文件;使用 tramp 反而。只需使用普通用户运行 emacs 客户端并打开这样的文件即可;

C-x C-f
/sudo:root@localhost/some/file/that/has/root/access/permissions
# on some linux distro it might be `/su:root@...` 

这让我的生活变得更轻松,我可以通过这种方式在几毫秒内打开我的重型定制Python IDE。您可能还想将 emacs --daemon 添加到系统启动中,或为 emacsclient 创建桌面文件。这取决于你。

有关 emacs 守护进程和 emacs 客户端的更多信息可以在 wiki 中找到;

http://www.emacswiki.org/emacs/EmacsAsDaemon

http://www.emacswiki.org/emacs/EmacsClient

我同意您应该了解 M-x 编译(将其和 M-x next-error 绑定到短键序列)。

了解版本控制的绑定(例如vc-diff、vc-next-action 等)

查看寄存器。您不仅可以记住缓冲区中的位置,还可以记住整个窗口配置(C-x r w - 窗口配置到寄存器)。

探索 Emacs 的 VC 功能的起点(可能不是显而易见的)是 M-x vc-下一个动作.

它根据文件和 VC 后端的状态对当前文件执行“下一个逻辑版本控制操作”。因此,如果文件不受版本控制,则会注册它,如果文件已更改,则会提交更改等。

这需要一点时间来适应,但我发现它非常有用。

默认键绑定是 C-x v v

有一个 TFS.el 用于将 emacs 集成到 Microsoft TFS. 。它适用于任何 TFS,包括运行 Codeplex.com 的 TFS。

设置的基本步骤:

  1. 将 tfs.el 放入您的加载路径中。

  2. 在您的 .emacs 文件中:

    (require 'tfs)
    (setq tfs/tf-exe  "c:\\vs2008\\common7\\ide\\tf.exe")
    (setq tfs/login "/login:domain\\userid,password")
          -or-
    (setq tfs/login (getenv "TFSLOGIN"))  ;; if you have this set
    
  3. 同样在 .emacs 文件中,为 tfs 命令设置本地或全局键绑定。像这样:

    (global-set-key  "\C-xvo" 'tfs/checkout)
    (global-set-key  "\C-xvi" 'tfs/checkin)
    (global-set-key  "\C-xvp" 'tfs/properties)
    (global-set-key  "\C-xvr" 'tfs/rename)
    (global-set-key  "\C-xvg" 'tfs/get)
    (global-set-key  "\C-xvh" 'tfs/history)
    (global-set-key  "\C-xvu" 'tfs/undo)
    (global-set-key  "\C-xvd" 'tfs/diff)
    (global-set-key  "\C-xv-" 'tfs/delete)
    (global-set-key  "\C-xv+" 'tfs/add)
    (global-set-key  "\C-xvs" 'tfs/status)
    (global-set-key  "\C-xva" 'tfs/annotate)
    (global-set-key  "\C-xvw" 'tfs/workitem)
    

compile、next-error 和 previous-error 都是 Emacs 中 C++ 开发非常重要的命令(在 grep 输出上也很有效)。Etags、visit-tags-table 和 find-tag 也很重要。Completion.el 是 20 世纪最伟大的无名黑客之一,可以将 C++ 黑客攻击速度提高一个数量级。哦,我们不要忘记 ediff。

我还没有学会如何在不访问 shell 的情况下使用版本控制,但现在我运行提交的频率如此之高(使​​用 git),我可能必须这样做。

您可能还会发现 标签栏 有用。它模拟了我从 Eclipse 迁移到 Emacs 时唯一错过的行为。绑定到“,”和“”。要移至上一个和下一个选项卡栏,它始终将您远离Ctrl-X B切换缓冲区。

不幸的是,上述网页没有提供正确的版本下载。然而,大多数 Ubuntu 版本都在其 emacs-goodies 包中提供它。

我在 Windows 上使用 emacs。编译模块很好,但我希望编译能够更智能地了解它建议的编译命令行。 可以使用“文件变量”来指定 compile-command, ,但我想要比这更聪明的东西。所以我写了一个小函数来帮忙。它会猜测要使用的编译命令,以在运行时提示用户 compile.

猜测函数查找 vbproj 或 csproj 或 sln 文件,如果找到,它会建议 msbuild。然后它查看缓冲区文件名,并根据该文件名提出不同的建议。.wxs 文件意味着它是一个 WIX 项目,并且您可能想要构建 MSI,因此猜测逻辑建议为 MSI 使用 nmake 命令。如果它是 Javascript 模块,那么建议运行 jslint-for-wsh.js 来检查 .js 文件。作为后备方案,它建议使用 nmake。

我使用的代码如下所示:

(defun cheeso-guess-compile-command ()
  "set `compile-command' intelligently depending on the
current buffer, or the contents of the current directory."
  (interactive)
  (set (make-local-variable 'compile-command)
       (cond
        ((or (file-expand-wildcards "*.csproj" t)
             (file-expand-wildcards "*.vcproj" t)
             (file-expand-wildcards "*.vbproj" t)
             (file-expand-wildcards "*.shfbproj" t)
             (file-expand-wildcards "*.sln" t))
         "msbuild ")

        ;; sometimes, not sure why, the buffer-file-name is
        ;; not set.  Can use it only if set.
        (buffer-file-name
         (let ((filename (file-name-nondirectory buffer-file-name)))
           (cond

            ;; editing a .wxs (WIX Soluition) file
            ((string-equal (substring buffer-file-name -4) ".wxs")
             (concat "nmake "
                     ;; (substring buffer-file-name 0 -4) ;; includes full path
                     (file-name-sans-extension filename)
                     ".msi" ))

            ;; a javascript file - run jslint
            ((string-equal (substring buffer-file-name -3) ".js")
             (concat (getenv "windir")
                     "\\system32\\cscript.exe c:\\users\\cheeso\\bin\\jslint-for-wsh.js "
                     filename))

            ;; something else - do a typical .exe build
            (t
             (concat "nmake "
                     (file-name-sans-extension filename)
                     ".exe")))))
        (t
         "nmake "))))


(defun cheeso-invoke-compile-interactively ()
  "fn to wrap the `compile' function.  This simply
checks to see if `compile-command' has been previously set, and
if not, invokes `cheeso-guess-compile-command' to set the value.
Then it invokes the `compile' function, interactively."
  (interactive)
  (cond
   ((not (boundp 'cheeso-local-compile-command-has-been-set))
    (cheeso-guess-compile-command)
    (set (make-local-variable 'cheeso-local-compile-command-has-been-set) t)))
  ;; local compile command has now been set
  (call-interactively 'compile))

;; in lieu of binding to `compile', bind to my monkeypatched function
(global-set-key "\C-x\C-e"  'cheeso-invoke-compile-interactively)

我尝试将其作为编译功能的“建议前”执行,但无法使其令人满意地工作。所以我定义了一个新函数并将其绑定到我一直使用的相同按键组合 compile.


编辑 现在有“智能编译.el”这使这一想法更进一步。

关于文档查找:这取决于您的编程语言。

C 库和系统调用通常记录在手册页中。为此你可以使用 M-x man. 。有些事情在信息页面中可能会得到更好的记录;使用 M-x info.

对于 elisp 本身,使用 C-h f. 。对于Python,使用 >>> help(<function, class, module>) 在口译员中。

我发现大多数其他语言都提供 html 形式的文档。为此,请尝试使用嵌入式浏览器(我使用 w3m)。设置你的 BROWSER 环境变量到包装脚本周围 emacsclient -e "(w3m-goto-url-new-session \"$@\")" (在 *nix 上),以防某些东西可能打开浏览器并且您希望它在 emacs 中打开。

我知道这是一篇非常古老的帖子。但这个问题对于 emacs 初学者来说是有效的。

IMO 使用 emacs 作为 ide 的最佳方法是使用 语言服务器协议 使用 emacs。您可以在链接网站中找到有关语言服务器的所有信息。

为了快速设置,我建议您访问此页面 埃格洛特 。IMO eglot 的工作做得很好。它与公司等自动完成包集成良好。提供查找参考等等。

同样对于调试器,您可能需要针对特定​​语言的特定调试器。您可以在 emacs 中使用 gdb。只需输入 M-x gdb .

为了编译代码,最好使用 shell 命令。我正在做这个项目 工程项目. 。需要一段时间才能完成。但它所做的只是将 shell 命令映射到项目类型。并通过 shell 构建您的项目。执行命令的作用相同。我可能需要帮助来完成这个项目。它尚未准备好使用,但如果您了解一点 elisp,则可以浏览代码。

除此之外,最好使用 emacs 编译命令。

对于版本控制,我还没有看到任何其他软件包可以与 马吉特. 。这是特定于 git 的。另外,对于 git,还有另一个包 git-timemachine,我发现它非常有用。

对象查找和类查找由语言服务器协议提供。

项目树可用于类似 ide 的界面 树麦克斯.

还有一个名为交互库的项目 射弹.

对于自动完成,我发现 公司模式 很有用。

真正的 emacs 可以做任何事情。

近年来,Clang 成为 Emacs C++ 支持的重要组成部分。Atila Neves 在 CppCon 2015 上做了演讲:“Emacs 作为 C++ IDE”

这是一个 16 分钟的演讲,他展示了以下主题的解决方案:

  • 跳转到定义
  • 自动完成
  • 即时语法突出显示
  • 在项目中查找文件

可以找到幻灯片 这里.

在 Unix 或 X windows 风格中,我不知道是否有一个适用于所有情况的集成 IDE。

为了与调试器交互,调试器只是 IDE 的一个组件,请考虑 雷亚尔古德. 。我发现它有用的另一件事是位置消息的解析器,因此,如果您有调用堆栈跟踪并且想要在调用堆栈中的特定位置进行编辑,这个前端界面将可以做到这一点。

到目前为止,这个程序还需要改进。但它也可以利用相关人员来改进它。

免责声明:我在 realgud 工作

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top