CMake/Editors/Emacs

From KitwarePublic
< CMake
Revision as of 15:10, 25 April 2013 by Brad.king (talk | contribs) (→‎Modes: Add company-mode link)
Jump to navigationJump to search

Modes

cmake-mode

See the combined syntax highlighting and indentation mode in the CMake source tree. To enable it, add the following to your .emacs file:

; Add cmake listfile names to the mode list.
(setq auto-mode-alist
	  (append
	   '(("CMakeLists\\.txt\\'" . cmake-mode))
	   '(("\\.cmake\\'" . cmake-mode))
	   auto-mode-alist))

(autoload 'cmake-mode "~/CMake/Docs/cmake-mode.el" t)

company-mode

See company-mode and its completion backend for CMake scripts.

User Suggestions

Buffer Names

I've been long irritated with having to deal with multiple buffers all name CMakeLists.txt. Emacs by default will call them CMakeLists.txt, CMakeLists.txt<2>, CMakeLists.txt<3>, etc.. This is really hard to switch back and forth when the buffer names are difficult to associate with location.

I've found a couple of solutions to this problem.

  1. Use uniquify emacs package. This gives several options to automatically rename buffers based on their location on disk.
    ;; uniquify.el is a helper routine to help give buffer names a better unique name.
    (when (load "uniquify" 'NOERROR)
      (require 'uniquify)
      (setq uniquify-buffer-name-style 'forward)
      ;(setq uniquify-buffer-name-style 'post-forward)
      )
    
  2. Rename the buffer as part of the cmake-mode
    (defun cmake-rename-buffer ()
      "Renames a CMakeLists.txt buffer to cmake-<directory name>."
      (interactive)
      ;(print (concat "buffer-filename = " (buffer-file-name)))
      ;(print (concat "buffer-name     = " (buffer-name)))
      (when (and (buffer-file-name) (string-match "CMakeLists.txt" (buffer-name)))
          ;(setq file-name (file-name-nondirectory (buffer-file-name)))
          (setq parent-dir (file-name-nondirectory (directory-file-name (file-name-directory (buffer-file-name)))))
          ;(print (concat "parent-dir = " parent-dir))
          (setq new-buffer-name (concat "cmake-" parent-dir))
          ;(print (concat "new-buffer-name= " new-buffer-name))
          (rename-buffer new-buffer-name t)
          )
      )
    
    (add-hook 'cmake-mode-hook (function cmake-rename-buffer))
    

I actually prefer renaming my buffers with my cmake-rename-buffer function, because the buffer names start with a lower case letter. :)