Using Emacs as an IDE

后端 未结 18 1813
清酒与你
清酒与你 2020-11-29 14:29

Currently my workflow with Emacs when I am coding in C or C++ involves three windows. The largest on the right contains the file I am working with. The left is split into

18条回答
  •  借酒劲吻你
    2020-11-29 14:49

    I use emacs on Windows. the compile module is nice, but I wanted compile to be smarter about the compile command line it suggests. It's possible to use "File Variables" to specify compile-command, but I wanted something a little smarter than that. So I wrote a little function to help out. It guesses the compile command to use, to prompt the user with, when running compile.

    The guess function looks for a vbproj or csproj or sln file, and if found, it suggests msbuild. Then it looks at the buffer file name, and depending on that, suggests different things. A .wxs file means it's a WIX project, and you likely want to build an MSI, so the guess logic suggests an nmake command for the MSI. If it's a Javascript module, then the suggestion is to run jslint-for-wsh.js to lint the .js file. As a fallback, it suggests nmake.

    The code I use looks like this:

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

    I tried doing this as "before advice" for the compile function but couldn't get it to work satisfactorily. So I defined a new function and bound it to the same keystroke combination I have been using for compile.


    EDIT there is now "smarter-compile.el" which takes this idea one step further.

提交回复
热议问题