使用Emacs作为IDE 目前我在C或C++中编码时使用Emacs的工作流涉及三个窗口。右边最大的包含我正在处理的文件。左边分为两部分,底部是一个shell,我用它来输入编译或生成命令,顶部通常是一些文档或自述文件,我想在工作时查阅这些文档或自述文件。现在我知道有一些相当专业的Emacs用户,我很好奇,如果打算将它作为一个完整的IDE使用,其他Emacs在功能上有什么用处。具体而言,大多数IDE通常以某种形式实现这些功能: 源代码编辑器 编译程序 调试 文档查找 版本控制 OO特性,如类查找和对象检查器

使用Emacs作为IDE 目前我在C或C++中编码时使用Emacs的工作流涉及三个窗口。右边最大的包含我正在处理的文件。左边分为两部分,底部是一个shell,我用它来输入编译或生成命令,顶部通常是一些文档或自述文件,我想在工作时查阅这些文档或自述文件。现在我知道有一些相当专业的Emacs用户,我很好奇,如果打算将它作为一个完整的IDE使用,其他Emacs在功能上有什么用处。具体而言,大多数IDE通常以某种形式实现这些功能: 源代码编辑器 编译程序 调试 文档查找 版本控制 OO特性,如类查找和对象检查器,emacs,ide,development-environment,slime,Emacs,Ide,Development Environment,Slime,对于其中的一些,Emacs如何适应这些功能是很明显的,但是其他的呢?此外,如果必须关注特定语言,我认为它应该是C++。p> 编辑:一位用户指出,当我说“其余的怎么办”时,我应该更具体一些。我主要对高效的版本控制和文档查找感到好奇。例如,在SLIME中,在Lisp函数上快速查找hyperspec非常容易。在C++ STL文档中有没有快速查找的方法(如果我忘记了确切的语法,比如,< P>),而不是在shell窗口中运行make命令,你尝试过MX编译吗?它将运行make命令,显示错误,并且在许多情况下

对于其中的一些,Emacs如何适应这些功能是很明显的,但是其他的呢?此外,如果必须关注特定语言,我认为它应该是C++。p>
编辑:一位用户指出,当我说“其余的怎么办”时,我应该更具体一些。我主要对高效的版本控制和文档查找感到好奇。例如,在SLIME中,在Lisp函数上快速查找hyperspec非常容易。在C++ STL文档中有没有快速查找的方法(如果我忘记了确切的语法,比如,

< P>),而不是在shell窗口中运行make命令,你尝试过MX编译吗?它将运行make命令,显示错误,并且在许多情况下,如果输出包括文件名和行号,则很容易跳转到导致错误的代码行


如果您是IDE的粉丝,您可能还想看看emacs的speedbar包(M-x speedbar)。如果您还没有,请学习如何使用标记表来导航代码。

您必须明确“其余”的含义。除了object inspector(我知道),emacs可以很容易地完成上述所有工作:

  • 编辑(显而易见)
  • 编译器-只需运行
    M-x compile
    并输入您的compile命令。从那以后,您可以只
    M-x compile
    并使用默认值。Emacs将捕获C/C++编译器错误(最适合GCC),并帮助您导航到出现警告或错误的行
  • 调试-类似地,当您想要调试时,键入
    M-xgdb
    ,它将创建一个带有特殊绑定的gdb缓冲区
  • 文档查找-emacs具有优秀的用于代码导航的CScope绑定。对于其他文档:emacs还有一个手册页阅读器,对于其他所有内容,都有web和书籍
  • 版本控制-有很多用于各种VCS后端的Emacs绑定(CVS、SCC、RCS、SVN、GIT都在脑海中出现)
编辑:我意识到我关于文档查找的回答实际上与代码导航有关。以下是更多的要点信息:

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


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

我同意您应该了解M-x编译(将该错误和M-x下一个错误绑定到一个短键序列)

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

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

我必须推荐使用更为“传统”的IDE风格的环境


< >编辑< /强>:我现在也推荐了Emacs中的标准VCS接口。

< P>编译、下一个错误和先前错误都是Emacs中C++开发的重要命令(GRUP也很好)Etags,访问标签表,发现标签也是重要的。PultEthon .EL是二十世纪最伟大的无名氏之一,可以加快你的C++黑客攻击数量级。哦,让我们不要忘记Ediff.< 我还没有学会如何在不访问shell的情况下使用版本控制,但是现在我运行commits的频率更高了(使用git),我可能不得不这样做。

探索Emacs的VC特性的一个起点(可能不明显)是m-x VC下一步操作

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

习惯需要一点时间,但我发现它非常有用


默认键绑定是C-xv

对于版本控制,根据您使用的版本控制系统,您可以使用多种功能。但其中一些功能对所有这些功能都是通用的

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

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

其他非常有用的命令是C-xvl和C-xv=它们显示您正在使用的文件的日志和当前差异

但是,为了提高工作效率,您应该避免使用单文件vc.el命令,而不是用于简单的事情。有几个软件包可以让您概括整个树的状态,并为您提供更多功能,更不用说创建跨多个文件的一致提交的能力了

其中大部分是ar
(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
(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)
(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)
emacs --daemon
alias ec="emacsclient -t"
alias ecc="emacsclient -c &"
# some people also prefer this but no need to fight here;
alias vi="emacsclient -t"
C-x C-f
/sudo:root@localhost/some/file/that/has/root/access/permissions
# on some linux distro it might be `/su:root@...`