ambevar-dotfiles/.emacs.d/mode-cc.el

156 lines
5.9 KiB
EmacsLisp
Raw Normal View History

2013-06-12 23:40:20 +02:00
;;==============================================================================
2013-07-03 13:55:42 +02:00
;; C/C++
2013-06-12 23:40:20 +02:00
;;==============================================================================
(require 'compile)
(defun get-closest-pathname (&optional file)
"Determine the pathname of the first instance of FILE starting
from the current directory towards root. This may not do the
correct thing in presence of links. If it does not find FILE,
then it shall return the name of FILE in the current directory,
suitable for creation"
(let ((current-dir default-directory) (looping t) (makefile (or file "Makefile")))
(while (progn
(if (file-exists-p (expand-file-name makefile current-dir))
(setq looping nil)
(setq current-dir (expand-file-name ".." current-dir)))
(and looping (not (equal current-dir "/")))))
(if (equal current-dir "/") nil (expand-file-name makefile current-dir))))
2013-07-03 13:55:42 +02:00
(defcustom mode-cc-ldlibs "-lm -pthread"
"[Local variable] Custom linker flags for C/C++ linkage."
:safe 'stringp)
2013-06-12 23:40:20 +02:00
(defcustom mode-cc-ldflags ""
2013-07-03 13:55:42 +02:00
"[Local variable] Custom linker libs for C/C++ linkage."
2013-06-12 23:40:20 +02:00
:safe 'stringp)
(defun cc-set-compiler ()
"Set C/C++ compile command to be nearest Makefile found in
parent folders. If no Makefile is found, then a configurable
command line is provided."
2013-06-12 23:40:20 +02:00
(interactive)
2013-07-03 13:55:42 +02:00
(if (get-closest-pathname)
(set (make-local-variable 'compile-command) (format "make -k -f %s" (get-closest-pathname)))
(set (make-local-variable 'compile-command)
(let
2013-08-05 18:51:27 +02:00
((is-cpp (equal (symbol-name major-mode) "c++-mode"))
2013-07-03 13:55:42 +02:00
(file (file-name-nondirectory buffer-file-name)))
(format "%s %s -o %s %s %s %s"
2013-07-03 13:55:42 +02:00
(if is-cpp
2013-08-05 18:51:27 +02:00
(or (getenv "CXX") "g++")
2013-07-03 13:55:42 +02:00
(or (getenv "CC") "gcc"))
file
2013-07-03 13:55:42 +02:00
(file-name-sans-extension file)
(if is-cpp
(or (getenv "CPPFLAGS") "-Wall -Wextra -Wshadow -DDEBUG=9 -g3 -O0")
(or (getenv "CFLAGS") "-ansi -pedantic -std=c99 -Wall -Wextra -Wshadow -DDEBUG=9 -g3 -O0"))
(or (getenv "LDFLAGS") mode-cc-ldflags)
(or (getenv "LDLIBS") mode-cc-ldlibs))))))
2013-07-03 13:55:42 +02:00
(defun cc-clean ()
"Find Makefile and call the `clean' rule. If no Makefile is
found, no action is taken. The previous `compile' command is then
restored."
(interactive)
(when (get-closest-pathname)
(let ((compile-command-backup compile-command))
(compile (format "make -k -f %s clean" (get-closest-pathname)))
(setq compile-command compile-command-backup))))
2013-07-03 13:55:42 +02:00
;;==============================================================================
;; C-mode
;;==============================================================================
;; Identation style
(setq c-default-style "linux" c-basic-offset 4)
2013-06-12 23:40:20 +02:00
(add-hook
'c-mode-hook
(lambda ()
(cc-set-compiler)
(local-set-key (kbd "<f9>") 'cc-clean)
2013-06-12 23:40:20 +02:00
(local-set-key (kbd "M-TAB") 'semantic-complete-analyze-inline)
(local-set-key (kbd "C-M-e") (lambda () (interactive) (c-beginning-of-defun -1)))
2013-06-12 23:40:20 +02:00
;; (local-set-key "." 'semantic-complete-self-insert) ; This is a bit slow.
;; (local-set-key ">" 'semantic-complete-self-insert)
))
;;==============================================================================
;; C++-mode
;;==============================================================================
(require 'compile)
;; TODO: test this!
;; (defun vlad-cc-style()
;; (c-set-style "linux")
;; (c-set-offset 'innamespace '0)
;; (c-set-offset 'inextern-lang '0)
;; (c-set-offset 'inline-open '0)
;; (c-set-offset 'label '*)
;; (c-set-offset 'case-label '*)
;; (c-set-offset 'access-label '/)
;; (setq c-basic-offset 4)
;; (setq tab-width 4)
;; (setq indent-tabs-mode nil)
;; )
;; (add-hook 'c++-mode-hook 'vlad-cc-style)
(add-hook
'c++-mode-hook
(lambda ()
(cc-set-compiler)
(local-set-key (kbd "<f9>") 'cc-clean)
2013-07-03 13:55:42 +02:00
(local-set-key (kbd "C-M-e") (lambda () (interactive) (c-beginning-of-defun -1)))
2013-06-12 23:40:20 +02:00
(local-set-key (kbd "M-TAB") 'semantic-complete-analyze-inline)))
;;==============================================================================
;; Qt semantic support
;;==============================================================================
;; Qt base directory, meaning the directory where the 'Qt' directory can be found.
;; Adapt accordingly.
2013-07-09 11:25:15 +02:00
(when (fboundp 'semantic-add-system-include)
(setq qt4-base-dir "/usr/include/qt4")
(setq qt4-gui-dir (concat qt4-base-dir "/QtGui"))
(semantic-add-system-include qt4-base-dir 'c++-mode)
(semantic-add-system-include qt4-gui-dir 'c++-mode)
(add-to-list 'auto-mode-alist (cons qt4-base-dir 'c++-mode))
(add-hook
'c++-mode-hook
(lambda ()
(add-to-list 'semantic-lex-c-preprocessor-symbol-file (concat qt4-base-dir "/Qt/qconfig.h"))
(add-to-list 'semantic-lex-c-preprocessor-symbol-file (concat qt4-base-dir "/Qt/qconfig-large.h"))
(add-to-list 'semantic-lex-c-preprocessor-symbol-file (concat qt4-base-dir "/Qt/qglobal.h")))))
2014-02-11 00:45:27 +01:00
;;==============================================================================
;; Skel
;;==============================================================================
;; TODO: elements: (setq skeleton-further-elements '((q "\"")))
(add-hook
'c++-mode-hook
(lambda ()
(define-skeleton snip-print
"fprintf/printf snippet
2014-02-11 01:56:20 +01:00
If no file descriptor is provided, switch do printf. The format
string is properly parsed (%% are not taken into account).
Requires the `count-percents' function."
2014-02-11 01:56:20 +01:00
nil
2014-02-11 00:45:27 +01:00
'(setq v1 (skeleton-read "File desc: " "stdout"))
(if (string= v1 "") "printf (" (concat "fprintf (" v1 ", "))
"\"" (setq v1 (skeleton-read "Format string: " "%s\\n")) "\""
2014-02-11 01:56:20 +01:00
'(setq v2 (count-percents v1))
'(setq v1 0)
'(while (< v1 v2)
(setq v1 (1+ v1))
(skeleton-insert '(nil (concat ", " (skeleton-read "Value: ")))))
2014-02-11 01:56:20 +01:00
");")
))
2014-02-12 17:48:29 +01:00
(provide 'mode-cc)