summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRavi R Kiran <aine.marina@gmail.com>2013-12-02 18:02:51 (GMT)
committerRavikiran Rajagopal <aine.marina@gmail.com>2013-12-02 18:02:51 (GMT)
commit8991fc6a6ea405862945c109a8dc4cac30f2abe6 (patch)
treec29ad1a1c3d95eb9e70b8e2ee42a4fa462c32362
parent6d7cf23b9122f034ac436d18d0b68a528e2ea3a3 (diff)
downloaddotemacs-8991fc6a6ea405862945c109a8dc4cac30f2abe6.zip
dotemacs-8991fc6a6ea405862945c109a8dc4cac30f2abe6.tar.gz
dotemacs-8991fc6a6ea405862945c109a8dc4cac30f2abe6.tar.bz2
C++ support and local configuration support
-rw-r--r--init.el6
-rw-r--r--ravi-init-cpp.el331
2 files changed, 337 insertions, 0 deletions
diff --git a/init.el b/init.el
index 429967e..7c3dd5c 100644
--- a/init.el
+++ b/init.el
@@ -79,6 +79,10 @@
result))
;; ---------------------------------------------------------------------
+(when (file-exists-p (ravi/emacs-file "local.el"))
+ (load-file (ravi/emacs-file "local.el"))
+ )
+
(require 'ravi-init-ido)
(require 'ravi-init-marks)
(require 'ravi-init-appearance)
@@ -87,3 +91,5 @@
(require 'ravi-init-function)
(require 'ravi-init-insertion)
(require 'ravi-init-navigation)
+(require 'ravi-init-cpp)
+
diff --git a/ravi-init-cpp.el b/ravi-init-cpp.el
new file mode 100644
index 0000000..94cf6a8
--- /dev/null
+++ b/ravi-init-cpp.el
@@ -0,0 +1,331 @@
+;;; ravi-init-cpp.el --- C/C++ handling
+
+;; Copyright (C) 2013
+
+;; Author: <ravi@nero.lan>
+;; Keywords:
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; C/C++ initialization
+
+;;; Code:
+
+; Generate a random string (of letters and numbers) of a given length
+(defun ravi-random-ucn-string (len)
+ (coerce (loop for i below len for x = (random 36) collect
+ (+ x
+ (cond ((< x 10) 48)
+ ((< x 36) (- 65 10))
+ )))
+ 'string))
+
+(use-package cmake-mode
+ :mode (("CMakeLists\\.txt\\'" . cmake-mode)
+ ("\\.cmake\\'" . cmake-mode))
+ ;:ensure t
+ )
+
+(defvar get-buffer-compile-command (lambda (file) (cons file 1)))
+(make-variable-buffer-local 'get-buffer-compile-command)
+
+(setq-default compile-command "")
+
+(defun compile-dwim (&optional arg)
+ "Compile Do What I Mean.
+ Compile using `compile-command'.
+ When `compile-command' is empty prompt for its default value.
+ With prefix C-u always prompt for the default value of
+ `compile-command'.
+ With prefix C-u C-u prompt for buffer local compile command with
+ suggestion from `get-buffer-compile-command'. An empty input removes
+ the local compile command for the current buffer."
+ (interactive "P")
+ (cond
+ ((and arg (> (car arg) 4))
+ (let ((cmd (read-from-minibuffer
+ "Buffer local compile command: "
+ (funcall get-buffer-compile-command
+ (or (file-relative-name (buffer-file-name)) ""))
+ nil nil 'compile-history)))
+ (cond ((equal cmd "")
+ (kill-local-variable 'compile-command)
+ (kill-local-variable 'compilation-directory))
+ (t
+ (set (make-local-variable 'compile-command) cmd)
+ (set (make-local-variable 'compilation-directory)
+ default-directory))))
+ (when (not (equal compile-command ""))
+ ;; `compile' changes the default value of
+ ;; compilation-directory but this is a buffer local
+ ;; compilation
+ (let ((dirbak (default-value 'compilation-directory)))
+ (compile compile-command)
+ (setq-default compilation-directory dirbak))))
+ ((or (and arg (<= (car arg) 4))
+ (equal compile-command ""))
+ (setq-default compile-command (read-from-minibuffer
+ "Compile command: "
+ (if (equal compile-command "")
+ "make " compile-command)
+ nil nil 'compile-history))
+ (setq-default compilation-directory default-directory)
+ (when (not (equal (default-value 'compile-command) ""))
+ (compile (default-value 'compile-command))))
+ (t
+ (recompile))))
+
+
+(use-package cc-mode
+
+ :mode (("\\.h\\(h?\\|xx\\|pp\\)\\'" . c++-mode)
+ ("\\.ccfg\\'" . c++-mode)
+ ("\\.m\\'" . c-mode)
+ ("\\.mm\\'" . c++-mode))
+ :init
+ (progn
+ (use-package doxymacs
+ ;:ensure t
+ :init
+ (progn
+ (doxymacs-mode)
+ (setq doxymacs-file-comment-template
+ '("/**" > n
+ " * " (doxymacs-doxygen-command-char) "file" > n
+ " * " > n
+ " * " (doxymacs-doxygen-command-char) "brief "
+ (p "Brief description of this file: ") > n
+ " */" > n)
+ )
+ (setq doxymacs-use-external-xml-parser t)
+ (setq doxymacs-command-character "\\")
+ )
+ )
+
+ (defvar printf-index 0)
+
+ (defun insert-counting-printf (arg)
+ (interactive "P")
+ (if arg
+ (setq printf-index 0))
+ (if t
+ (insert (format "std::cerr << \"step %d..\" << std::endl;\n"
+ (setq printf-index (1+ printf-index))))
+ (insert (format "printf(\"step %d..\\n\");\n"
+ (setq printf-index (1+ printf-index)))))
+ (forward-line -1)
+ (indent-according-to-mode)
+ (forward-line))
+
+ (defun my-c-mode-common-hook ()
+ (hs-minor-mode 1)
+ (hide-ifdef-mode 1)
+ (which-function-mode 1)
+
+ (diminish 'hs-minor-mode)
+ (diminish 'hide-ifdef-mode)
+
+ (bind-key "C-c p" 'insert-counting-printf c-mode-base-map)
+
+ ;(auto-complete-mode 1)
+ ;(bind-key "<A-tab>" 'ac-complete c-mode-base-map)
+
+ ;;(doxymacs-mode 1)
+ ;;(doxymacs-font-lock)
+
+ ;(define-key c-mode-base-map [return] 'c-context-line-break)
+ (bind-key "<return>" 'newline-and-indent c-mode-base-map)
+
+ (unbind-key "M-j" c-mode-base-map)
+ (bind-key "C-c C-i" 'c-includes-current-file c-mode-base-map)
+
+ (set (make-local-variable 'parens-require-spaces) t)
+ (setq fill-column 88)
+
+ (bind-key "M-q" 'c-fill-paragraph c-mode-base-map)
+
+ (c-toggle-electric-state 1)
+ (c-toggle-auto-newline 1)
+ (c-toggle-hungry-state 1)
+
+ (c-set-style "stroustrup")
+ (setq c-basic-offset 2)
+ (setq c-recognize-knr-p nil)
+
+ (font-lock-add-keywords 'c++-mode '(("\\<\\(assert\\|DEBUG\\)("
+ 1 font-lock-warning-face t))))
+
+ (add-hook 'c-mode-common-hook 'my-c-mode-common-hook)
+
+ (defun my-c++-mode-hook ()
+ (setq c-offsets-alist
+ (append '((innamespace . (if (string-equal "ccfg" (file-name-extension (buffer-file-name))) 2 0) )
+ (statement-cont . c-lineup-math)
+ (inline-open . 0))
+ c-offsets-alist))
+
+ (setq c-macro-cppflags "-x c++")
+ (setq c-macro-prompt-flag t)
+ )
+ (add-hook 'c++-mode-hook 'my-c++-mode-hook)
+
+ ;; Stuff from kde-emacs
+ (defvar kde-header-protection-parts-to-show 1
+ "Set this variable to the number of parts from the file name you want to
+be used for the defined word in the header-protection function.. E.g. setting
+this to 3 makes header-protection define KIG_MISC_NEWTYPE_H for a file named
+/home/domi/src/kdenonbeta/kig/misc/newtype.h")
+
+ (defun kde-header-protection-definable-string ()
+ (let* ((definablestring (concat "_" (ravi-random-ucn-string 6)) )
+ (f (buffer-file-name))
+ (parts (nreverse (split-string f "/")))
+ (i)
+ (first-iter t)
+ (iters (min (length parts) kde-header-protection-parts-to-show)))
+ (dotimes (i iters)
+ (let ((part (pop parts)))
+ (setq definablestring
+ (concat
+ (upcase (replace-regexp-in-string "[\\.-]" "_" part))
+ (if (not first-iter) "_" "")
+ definablestring
+ )
+ )
+ (setq first-iter nil)
+ )
+ )
+ definablestring
+ )
+ )
+
+ ;; Creates the ifndef/define/endif statements necessary for a header file
+ (defun header-protection ()
+ (interactive)
+ (let ((s (kde-header-protection-definable-string)))
+ (save-excursion
+ (goto-char (point-min))
+ (insert "#ifndef " s "\n#define " s "\n\n")
+ (goto-char (point-max))
+ (insert "\n#endif\n")
+ )
+ )
+ )
+
+ (defun ravi-start-c++-header ()
+ "Start a new C++ header by inserting include guards ( see \
+ header-protection function ), inserting a license statement \
+ and putting (point) at the correct position"
+ (interactive)
+ (header-protection)
+ (insert "\n")
+ (beginning-of-buffer)
+
+ (save-excursion
+ (let ((start (point-min))
+ (end)
+ )
+ (setq comment-style 'box)
+ (goto-char start)
+ (insert (ravi-license-header))
+ (setq end (point))
+ (comment-region start end)
+ )
+ )
+
+ (end-of-buffer)
+ (next-line -3)
+ (insert "\n")
+ ;(doxymacs-insert-file-comment)
+ )
+
+ (setq auto-insert-query nil)
+ (define-auto-insert "\\.\\([Cc]\\|cc\\|cpp\\|cxx\\|tcc\\)\\'"
+ 'ravi-auto-insert-cpp)
+ (define-auto-insert "\\.\\([Hh]\\|hh\\|hpp\\)\\'" 'ravi-start-c++-header)
+
+ (defun ravi-license-insert ()
+ (progn
+ (let ((start (point-min))
+ (end)
+ )
+ (setq comment-style 'box)
+ (goto-char start)
+ (insert (ravi-license-header))
+ (insert "\n")
+ (setq end (point))
+ (comment-region start end)
+ )
+ )
+ )
+
+ (defun ravi-auto-insert-cpp ()
+ (progn
+ (ravi-license-insert)
+ ;(doxymacs-insert-file-comment)
+ )
+ )
+ )
+
+ :config
+ (progn
+
+ (defun insert-comma (arg)
+ (interactive "*P")
+ (let* ((ch (char-after))
+ (spacep (not (or (eq ch ? )
+ (c-in-literal)
+ arg))))
+ (self-insert-command (prefix-numeric-value arg))
+ (if spacep
+ (insert " "))))
+
+ (defun insert-semicolon (arg)
+ (interactive "*P")
+ (self-insert-command (prefix-numeric-value arg))
+ (newline-and-indent))
+
+ (bind-key "," 'insert-comma c-mode-base-map)
+ (bind-key ";" 'insert-semicolon c-mode-base-map)
+
+ (bind-key "<M-f8>" 'compile-dwim c-mode-base-map)
+
+ (bind-key "<M-f5>" 'hs-hide-block c-mode-base-map)
+ (bind-key "<M-f11>" 'hs-show-block c-mode-base-map)
+
+ (setq hide-ifdef-initially nil)
+ (bind-key "<S-f5>" 'hide-ifdef-block c-mode-base-map)
+ (bind-key "<S-f11>" 'show-ifdef-block c-mode-base-map)
+
+ ;; (setq c-syntactic-indentation nil)
+
+ ;; (bind-key "#" 'self-insert-command c-mode-base-map)
+ ;; (bind-key "{" 'self-insert-command c-mode-base-map)
+ ;; (bind-key "}" 'self-insert-command c-mode-base-map)
+ ;; (bind-key "/" 'self-insert-command c-mode-base-map)
+ ;; (bind-key "*" 'self-insert-command c-mode-base-map)
+ ;; (bind-key ";" 'self-insert-command c-mode-base-map)
+ ;; (bind-key "," 'self-insert-command c-mode-base-map)
+ ;; (bind-key ":" 'self-insert-command c-mode-base-map)
+ ;; (bind-key "(" 'self-insert-command c-mode-base-map)
+ ;; (bind-key ")" 'self-insert-command c-mode-base-map)
+ ;; (bind-key "<" 'self-insert-command c++-mode-map)
+ ;; (bind-key ">" 'self-insert-command c++-mode-map)
+ )
+ )
+
+(provide 'ravi-init-cpp)
+;;; ravi-init-cpp.el ends here