CMake/Editors/Emacs: Difference between revisions
Lindydancer (talk | contribs) (The cmake-font-lock package no longer use the andersl- prefix. Reworked feature list.) |
Lindydancer (talk | contribs) (Screenshot of cmake-font-lock added) |
||
Line 34: | Line 34: | ||
* In preprocessor definitions like <tt>-DNAME</tt>, <tt>NAME</tt> is colored. | * In preprocessor definitions like <tt>-DNAME</tt>, <tt>NAME</tt> is colored. | ||
* Comments and quoted strings. | * Comments and quoted strings. | ||
Example: | |||
[[File:CMakeFontLockScreenshot.png]] | |||
== company-mode (code completion in Emacs) == | == company-mode (code completion in Emacs) == |
Revision as of 07:01, 8 November 2014
GNU Emacs is the king of text editors, it has been around since the mid-1970:s and it still actively being developed. It is available on multiple platforms, including Microsoft Windows, Mac OS X, and Linux. It runs either as a modern windows-based application or you can use it in a terminal to edit on a remote machine. It can be extended using it's built-in programming language Emacs Lisp and there are literarily thousands of extensions available.
See the page CMake Editors Support for CMake support in other editors.
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/Auxiliary/cmake-mode.el" t)
cmake-font-lock
The package cmake-font-lock, written by Anders Lindgren, provides advanced font-lock support for CMake scripts.
Although the standard package have some syntax coloring support, this package raises the bar quite a bit.
The following is colored:
- Function arguments are colored according to it's use, An argument can be colored as a keyword, a variable, a property, or a target. This package provides information on all built-in CMake functions. Information on user-defined functions can be added.
- All function names are colored, however, special functions like if, while, function, and include are colored using a different color.
- The constants true, false, yes, no, y, n, on, and off.
- The constructs ${...}, $ENV{...}, and $<name:...>.
- In preprocessor definitions like -DNAME, NAME is colored.
- Comments and quoted strings.
Example:
company-mode (code completion in Emacs)
See company-mode , company-cmake.el is incorporated into company-mode since v0.6.12
Jump focus between tags (if/else/endif, foreach/endforeach, ...)
See evil-matchit, install evil and evil-matchit, then just press %
syntax check and other handy utilities
Install cpputils-cmake, then you can:
- open C++ header file at correct location,
- open gdb and append the full path of executable automatically
- set up include directories automatically for flymake, flycheck
- set up include directories for code completion (auto-complete, company-mode)
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.
- 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) )
- 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. :)
Better handling of _ for movement commands
The following will make M-right
and M-left
stop after each word of a multiword identifier like add_custom_target
. Unfortunately, this breaks the font-lock support of the standard CMake package. However, it is compatible with the cmake-font-lock package.
(defun my-cmake-fix-underscrore () (modify-syntax-entry ?_ "_" cmake-mode-syntax-table)) (add-hook 'cmake-mode-hook 'my-cmake-fix-underscrore)