Initial commit
This commit is contained in:
commit
99e3df82b7
28 changed files with 2639 additions and 0 deletions
201
stuff/my-c-mode.el
Executable file
201
stuff/my-c-mode.el
Executable file
|
|
@ -0,0 +1,201 @@
|
|||
(defun c-mode-setup ()
|
||||
|
||||
(require 'my-elisp)
|
||||
|
||||
;; ------------ ;;
|
||||
;; Preprocessor ;;
|
||||
;; ------------ ;;
|
||||
|
||||
(defun c-preproc-indent-level (pos)
|
||||
"Return the indentention level of preprocessor directives for current line"
|
||||
(interactive "d")
|
||||
(save-excursion
|
||||
(beginning-of-buffer)
|
||||
(let ((res 0))
|
||||
(while (< (point) pos)
|
||||
(when (looking-at "#\\s-*if")
|
||||
(setq res (+ res 1)))
|
||||
(when (looking-at "#\\s-*endif")
|
||||
(setq res (- res 1)))
|
||||
(forward-line))
|
||||
res
|
||||
)))
|
||||
|
||||
;; ------------ ;;
|
||||
;; Include path ;;
|
||||
;; ------------ ;;
|
||||
|
||||
(defvar c-include-path
|
||||
()
|
||||
"List of path to search for includes")
|
||||
|
||||
(defun c-add-include-path (path)
|
||||
(interactive "DDirectory: \n")
|
||||
(add-to-list 'c-include-path path)
|
||||
(set 'c-macro-cppflags (concat c-macro-cppflags " -I'" path "'")))
|
||||
|
||||
(defun c-make-include (path paths)
|
||||
(if paths
|
||||
(let ((rg (concat "^" (car paths))))
|
||||
(if (string-match rg path)
|
||||
(concat "<" (replace-regexp-in-string rg "" path) ">")
|
||||
(c-make-include path (cdr paths))))
|
||||
(let ((file (current-file-name)))
|
||||
(concat "\""
|
||||
(if file
|
||||
(remove-prefix-from-string (file-name-directory file) path)
|
||||
path)
|
||||
"\""))))
|
||||
|
||||
;; -------------- ;;
|
||||
;; Code templates ;;
|
||||
;; -------------- ;;
|
||||
|
||||
;; Helpers
|
||||
|
||||
(defun c-fresh-line ()
|
||||
(beginning-of-line)
|
||||
(when (not (looking-at "\\W*$"))
|
||||
(insert "\n")
|
||||
(line-move -1)))
|
||||
|
||||
;; Preprocessor: Helpers
|
||||
|
||||
(defun c-open-preproc ()
|
||||
(c-fresh-line)
|
||||
(insert "#")
|
||||
(insert (make-string (c-preproc-indent-level (point)) ? )))
|
||||
|
||||
;; Preprocessor: Include
|
||||
|
||||
(defun c-insert-include-bouncer (std)
|
||||
(interactive "P")
|
||||
(if std
|
||||
(call-interactively 'c-insert-standard-include)
|
||||
(call-interactively 'c-insert-local-include)))
|
||||
|
||||
(defun c-insert-local-include (name)
|
||||
(interactive "fInclude: \n")
|
||||
(save-excursion
|
||||
(c-open-preproc)
|
||||
(insert "include ")
|
||||
(insert (c-make-include name c-include-path))))
|
||||
|
||||
(defun c-insert-standard-include (name)
|
||||
(interactive "sInclude: \n")
|
||||
(save-excursion
|
||||
(c-open-preproc)
|
||||
(insert "include <")
|
||||
(insert name)
|
||||
(insert ">")))
|
||||
|
||||
;; ------------- ;;
|
||||
;; Configuration ;;
|
||||
;; ------------- ;;
|
||||
|
||||
;; Rebox with C-style comments
|
||||
(set 'my-rebox-style 223)
|
||||
|
||||
;; --- ;;
|
||||
;; GDB ;;
|
||||
;; --- ;;
|
||||
|
||||
(defvar my-gdb-program "")
|
||||
|
||||
(defun my-gdb-find-program (path)
|
||||
(interactive "f")
|
||||
(setq my-gdb-program path))
|
||||
|
||||
(defun my-gdb ()
|
||||
(interactive)
|
||||
(when (string-equal my-gdb-program "")
|
||||
(call-interactively (function my-gdb-find-program)))
|
||||
(gdb (concat "gdb " my-gdb-program))
|
||||
(gdb-restore-windows))
|
||||
|
||||
(defun my-gdb-run ()
|
||||
(interactive)
|
||||
(gud-call "run"))
|
||||
|
||||
(defun my-gdb-stop ()
|
||||
(interactive)
|
||||
(gud-stop-subjob))
|
||||
|
||||
(defun my-gdb-kill ()
|
||||
(interactive)
|
||||
(my-gdb-stop)
|
||||
(gud-call "kill")
|
||||
(gud-call "y"))
|
||||
|
||||
(defun c-window-layout ()
|
||||
(interactive)
|
||||
(window-set-width 80))
|
||||
|
||||
(defun insert-class-declaration ()
|
||||
(interactive)
|
||||
(save-excursion
|
||||
(when (buffer-file-name)
|
||||
(let*
|
||||
((name (file-name-nondirectory buffer-file-name))
|
||||
(macro (replace-regexp-in-string
|
||||
"\\." "_"
|
||||
(replace-regexp-in-string
|
||||
"-" "_"
|
||||
(upcase name)))))
|
||||
(goto-char (point-min))
|
||||
(insert "#ifndef " macro "_\n")
|
||||
(insert "# define " macro "_\n\n")
|
||||
(goto-char (point-max))
|
||||
(insert "\n#endif /* !" macro "_ */\n")))))
|
||||
|
||||
|
||||
;; -------- ;;
|
||||
;; Bindings ;;
|
||||
;; -------- ;;
|
||||
|
||||
;; Lay window out
|
||||
(define-key
|
||||
c-mode-base-map
|
||||
[(meta l)]
|
||||
'c-window-layout)
|
||||
|
||||
;; Insert inclusion
|
||||
(define-key
|
||||
c-mode-base-map
|
||||
[(control c) (control i)]
|
||||
'c-insert-include-bouncer)
|
||||
|
||||
;; Rebox comment
|
||||
(define-key
|
||||
c-mode-base-map
|
||||
[(meta q)]
|
||||
'my-rebox-comment)
|
||||
|
||||
;; Show debugger
|
||||
(define-key
|
||||
c-mode-base-map
|
||||
[(control c) (d)]
|
||||
'my-gdb)
|
||||
|
||||
;; Run program
|
||||
(define-key
|
||||
c-mode-base-map
|
||||
[(control c) (r)]
|
||||
'my-gdb-run)
|
||||
|
||||
;; Stop program
|
||||
(define-key
|
||||
c-mode-base-map
|
||||
[(control c) (s)]
|
||||
'my-gdb-stop)
|
||||
|
||||
;; Kill program
|
||||
(define-key
|
||||
c-mode-base-map
|
||||
[(control c) (k)]
|
||||
'my-gdb-kill)
|
||||
)
|
||||
|
||||
(add-hook 'c++-mode-hook 'c-mode-setup)
|
||||
|
||||
(provide 'my-c-mode)
|
||||
Loading…
Add table
Add a link
Reference in a new issue