legacy-dotfiles/emacs.el
Tom Willemsen 5944a4a97b EMACS: hooks, skeletons and ido
* Moved rainbow-delimiters-mode and set-column-marker to prog-mode.
  * Turn on ido-mode, it seems interesting.
  * Added prog-mode hook.
  * Removed emacs-lisp-mode, js-mode, python-mode and lisp-mode hooks
    since they should all only do what prog-mode hook does.
  * Added myaethon-set-varchar-docstring and
    myaethon-set-array-varchar-docstring skeletons, these are both
    useful for work and a good way to learn more about skeletons.
2011-06-17 16:39:16 +02:00

469 lines
17 KiB
EmacsLisp

;; -*- mode: Emacs-Lisp; -*-
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; LOAD-PATHS ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(add-to-list 'load-path "~/.emacs.d/elisp")
(add-to-list 'load-path "~/.emacs.d/naquadah-theme")
(add-to-list 'load-path "~/.emacs.d/elisp/markdown-mode")
(add-to-list 'load-path "~/.emacs.d/elisp/git-commit-mode")
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; REQUIRES ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(require 'naquadah-theme)
(require 'autopair)
(require 'column-marker)
(require 'git-commit)
(require 'org-crypt)
(require 'rainbow-delimiters)
(require 'uniquify)
(require 'server)
(require 'org-publish)
(require 'htmlize)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; AUTOLOADS ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(autoload 'vala-mode "vala-mode"
"A Major mode for editing Vala files" t)
(autoload 'csharp-mode "csharp-mode"
"A Major mode for editing C# files" t)
(autoload 'sqlplus-mode "sqlplus"
"A Major mode for communicating with Oracle" t)
(autoload 'batch-mode "batch-mode"
"A Major mode for editing Batch files" t)
(autoload 'lua-mode "lua-mode"
"A Major mode for editing Lua files" t)
(autoload 'php-mode "php-mode-improved"
"A Major mode for editing PHP files" t)
(autoload 'graphviz-dot-mode "graphviz-dot-mode"
"A Major mode for editing graphviz dot files" t)
(autoload 'cmake-mode "cmake-mode"
"A major-mode for editing CMake sources" t)
(autoload 'markdown-mode "markdown-mode"
"Major mode for editing Markdown files" t)
(autoload 'rainbow-mode "rainbow-mode"
"A Minor mode for showing colors inline" t)
(autoload 'stumpwm-mode "stumpwm-mode"
"Special lisp mode for evaluating code into running stumpwm" t)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; DEFUNS ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun what-face (pos)
"Find out which face the current position uses"
(interactive "d")
(let ((face (or (get-char-property (point) 'read-face-name)
(get-char-property (point) 'face))))
(if face
(message "Face: %s" face)
(message "No face at %d" pos))))
(defun my-comp-finish-function (buf str)
"Don't show compilation window if everything went ok"
(if (string-match "exited abnormally" str)
;; there were errors
(message "compilation errors, press C-x ` to visit")
;; no errors, make the compilation window go away in 0.5 seconds
(run-at-time 0.5 nil 'delete-windows-on buf)
(message "NO COMPILATION ERRORS!")))
(defun fullscreen ()
"Fill the entire screen with emacs"
(interactive)
(x-send-client-message nil 0 nil "_NET_WM_STATE" 32
'(2 "_NET_WM_STATE_MAXIMIZED_VERT" 0))
(x-send-client-message nil 0 nil "_NET_WM_STATE" 32
'(2 "_NET_WM_STATE_MAXIMIZED_HORZ" 0)))
(defun c-toggle-header-source ()
"Toggle between a C source and header file"
(interactive)
(let ((ext (file-name-extension (buffer-file-name)))
(noext (file-name-sans-extension (buffer-file-name))))
(if (string= (substring ext 0 1) "c")
(find-file (concat noext ".h"))
(find-file (concat noext ".c")))))
(defun browse-to-current-file ()
"Show current file in browser"
(interactive)
(browse-url buffer-file-name))
(defun comment-line ()
"Toggle comment on a line"
(interactive)
(save-excursion
(beginning-of-line)
(insert "//")))
(defun add-php-keywords ()
"Designed for c and c-style languages
Currently adds | & ! . + = - / % * , < > ? : ->"
;; Add ! at the beginning of font lock
(font-lock-add-keywords
'php-mode
'(("\\([!]\\|\\=>\\)" 1 font-lock-operator-face)))
;; Add the rest at the end of font lock
(font-lock-add-keywords
'php-mode
'(("\\(->\\|[|.+=&/%*,:?<>-]\\)" 1 font-lock-operator-face)
("\\(;\\)" 1 font-lock-end-statement)) 1))
(defun add-html-keywords ()
"Designed for html, show some smarty tags"
(font-lock-add-keywords
'html-mode
'(("{\\(\\*.*\\*\\)}" 1 font-comment-face)
("{\\/?\\(extends\\|block\\|foreach\\|if\\)"
1 font-lock-builtin-face)
("\\$\\(\\(?:\\sw\\|\\s_\\)+\\)\\(?:|\\(\\(?:\\sw\\|\\s_\\)+\\):\\)"
(1 font-lock-variable-name-face)
(2 font-lock-function-name-face))
("\\$\\(\\(?:\\sw\\|\\s_\\)+\\)"
1 font-lock-variable-name-face)
("{\\(\\(?:\\sw\\|\\s_\\)+\\).*}"
1 font-lock-function-name-face))))
(defun buffer-major-mode (buffer-or-string)
"Find out which major-mode is currently used"
(with-current-buffer buffer-or-string major-mode))
(defun set-column-marker ()
"Default column markers"
(column-marker-1 73)
(column-marker-2 81))
(defun setup-system-frame-colours (&rest frame)
(let ((f (if (car frame)
(car frame)
(selected-frame))))
(progn
(set-frame-font "-*-tamsyn-medium-*-*-*-15-*-*-*-*-80-*-*"))))
(defun show-init-sections ()
(interactive)
(occur ";;\s +.*\s +;;")
(other-window 1))
(defun list-functions ()
(interactive)
(occur
"\(?:\(?:private\|protected\|public\) \)?function \(?:\sw\)+(\sw*)"))
(defun insert-init-title (title width)
(interactive "stitle: \nnwidth: ")
(insert-char ?\; width)
(insert "\n;;")
(insert-char ?\s (floor (/ (- (- width 4.0) (length title)) 2)))
(insert title)
(insert-char ?\s (ceiling (/ (- (- width 4.0) (length title)) 2)))
(insert ";;\n")
(insert-char ?\; width))
(defun x-init ()
"Start ide-skel and set some keys")
(defun cli-init ()
"Add a space to the linum column"
(setq linum-format "%d "))
(defun replace-occurrences (from to)
(save-excursion
(goto-char (point-min))
(while (search-forward from nil t)
(replace-match to))))
(defun replace-html-special-chars ()
(replace-occurrences "é" "&eacute;"))
(defun on-before-save ()
(if (eq (buffer-major-mode (current-buffer)) 'html-mode)
(replace-html-special-chars))
(if (not (eq (buffer-major-mode (current-buffer)) 'markdown-mode))
(delete-trailing-whitespace)))
(defun on-after-save ()
(let ((fname (buffer-file-name)))
(let ((suffix (file-name-extension fname)))
(if (string-equal suffix "el")
(byte-compile-file fname)))))
(defun on-prog-mode ()
(set-column-marker)
(rainbow-delimiters-mode))
(defun on-c-mode ()
(local-set-key [f8] 'c-toggle-header-source)
(local-set-key [f9] 'compile)
(local-set-key [C-m] 'newline-and-indent)
(local-set-key [C-return] 'newline))
(defun on-html-mode ()
(local-set-key [f9] 'browse-to-current-file)
(auto-fill-mode)
(set-column-marker))
(defun on-markdown-mode ()
(whitespace-mode)
(auto-fill-mode))
(defun on-org-mode ()
(flyspell-mode 1)
(auto-fill-mode 1))
(defun on-php-mode ()
(defvar php-warn-if-mumamo-off nil)
(setq case-fold-search t)
(c-set-offset 'arglist-intro '+)
(c-set-offset 'arglist-close '0)
(column-marker-1 76)
(column-marker-2 81)
(local-set-key [f6] 'comment-line))
(defun on-mail-mode ()
(turn-on-auto-fill)
(search-forward "\n\n"))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; VARIABLES ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defvar font-lock-operator-face 'font-lock-operator-face)
(defvar font-lock-end-statement 'font-lock-end-statement)
(defadvice server-create-window-system-frame
(after set-system-frame-colours ())
"Set custom frame colours when creating the first frame on a display"
(message "Running after frame-initialize")
(setup-system-frame-colours))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; FILE ASSOCIATIONS ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(add-to-list 'auto-mode-alist '("\\.vala$" . vala-mode))
(add-to-list 'auto-mode-alist '("\\.vapi$" . vala-mode))
(add-to-list 'auto-mode-alist '("\\.cs$" . csharp-mode))
(add-to-list 'auto-mode-alist '("\\.bat$" . batch-mode))
(add-to-list 'auto-mode-alist '("\\.lua$" . lua-mode))
(add-to-list 'auto-mode-alist '("\\.php[345]?$" . php-mode))
(add-to-list 'auto-mode-alist '("\\.js\\(on\\)?$" . js-mode))
(add-to-list 'auto-mode-alist '("\\.m\\(ark\\)?do?wn$". markdown-mode))
(add-to-list 'auto-mode-alist '("CMakeLists\\.txt$" . cmake-mode))
(add-to-list 'auto-mode-alist '("\\.cmake$" . cmake-mode))
(add-to-list 'auto-mode-alist '("\\.css$" . css-mode))
(add-to-list 'auto-mode-alist '("mutt-cloud-" . mail-mode))
(add-to-list 'auto-mode-alist '("stumpwmrc" . stumpwm-mode))
(add-to-list 'file-coding-system-alist '("\\.vala$" . utf-8))
(add-to-list 'file-coding-system-alist '("\\.vapi$" . utf-8))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; KEYBINDS ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(global-set-key "\C-m" 'newline-and-indent)
(global-set-key (kbd "C-x n r") 'narrow-to-region)
(global-set-key "\C-cl" 'org-store-link)
(global-set-key "\C-cc" 'org-capture)
(global-set-key "\C-ca" 'org-agenda)
(global-set-key [f5] '(lambda ()
(interactive)
(revert-buffer nil t nil)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; THEME SETTINGS ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(naquadah-theme-set-faces
'naquadah
;; markdown-mode
'(markdown-link-face (:inherit 'link))
'(markdown-header-face-1 (:inherit 'org-level-1))
'(markdown-header-face-2 (:inherit 'org-level-2))
'(markdown-header-face-3 (:inherit 'org-level-3))
'(markdown-header-face-4 (:inherit 'org-level-4))
'(markdown-header-face-5 (:inherit 'org-level-5))
'(markdown-header-face-6 (:inherit 'org-level-6)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; SETTINGS ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(setq-default indent-tabs-mode nil) ; spaces, no tabs
(setq
inhibit-startup-message t
require-final-newline t
inhibit-default-init t
scroll-conservatively 101 ; scroll only one line
browse-url-browser-function 'browse-url-generic
browse-url-generic-program "conkeror"
whitespace-style '(face trailing)
uniquify-buffer-name-style 'reverse
org-confirm-babel-evaluate nil
org-tags-exclude-from-inheritance '("crypt")
org-crypt-key "33E8CC1CC4"
org-use-fast-todo-selection t
org-default-notes-file (concat org-directory "/notes.org")
org-ditaa-jar-path "/usr/share/java/ditaa/ditaa-0_9.jar"
jit-lock-defer-time 0.2
htmlize-output-type 'inline-css
ido-save-directory-list-file nil
frame-title-format
'(:eval
(concat "emacs: " (buffer-name)))
backup-directory-alist ; backup file location
`((".*" . ,temporary-file-directory))
auto-save-file-name-transforms ; autosave file location
`((".*" ,temporary-file-directory t))
default-frame-alist ; default frame settings
(append '((font . "DejaVu Sans Mono-10:antialias=true")))
org-todo-keywords
'((sequence "TODO(t)"
"IN PROGRESS(p)"
"WAITING(w@/!)"
"|"
"DONE(d!/!)"
"CANCELLED(c@/!)"))
org-babel-load-languages
'((ditaa . t))
org-refile-targets
'((org-agenda-files :maxlevel . 5)
(nil :maxlevel . 5))
org-outline-path-complete-in-steps t
org-todo-keyword-faces
'(("TODO" :foreground "red" :weight bold)
("IN PROGRESS" :foreground "yellow" :weight bold)
("DONE" :foreground "forest green" :weight bold)
("WAITING" :foreground "orange" :weight bold)
("CANCELLED" :foreground "orangered" :weight bold))
org-publish-project-alist
'(("lxcoding-docs"
:base-directory "~/devel/lxcoding-docs/"
:base-extension "org"
:publishing-directory "~/lxcoding-docs-test/"
:recursive t
:publishing-function org-publish-org-to-html
:headline-levels
:auto-preamble t
:auto-sitemap t
:sitemap-filename "sitemap.org"
:sitemap-title "docs sitemap")))
(if window-system (x-init) (cli-init))
(fset 'yes-or-no-p 'y-or-n-p) ; switch yes or no to y or n
(tool-bar-mode -1) ; no toolbar
(menu-bar-mode -1) ; no menubar
(scroll-bar-mode -1) ; no scrollbars
(line-number-mode -1) ; don't show line number in splitter
(global-linum-mode t) ; Show line numbers in gutter
(column-number-mode t) ; show column number in splitter
(global-font-lock-mode t) ; show syntax highlighting, old
(delete-selection-mode t) ; delete selection upon typing
(show-paren-mode t) ; show the opposite paren
(ido-mode t)
(autopair-global-mode) ; automatically add the other
; delimiter
(add-to-list 'compilation-finish-functions 'my-comp-finish-function)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; HOOKS ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(add-hook 'before-save-hook 'on-before-save)
(add-hook 'after-save-hook 'on-after-save)
(add-hook 'prog-mode-hook 'on-prog-mode)
(add-hook 'c-mode-hook 'on-c-mode)
(add-hook 'html-mode-hook 'on-html-mode)
(add-hook 'markdown-mode-hook 'on-markdown-mode)
(add-hook 'org-mode-hook 'on-org-mode)
(add-hook 'php-mode-hook 'on-php-mode)
(add-hook 'mail-mode-hook 'on-mail-mode)
(add-hook 'git-commit-mode-hook 'auto-fill-mode)
(add-hook 'emacs-startup-hook 'fullscreen)
(add-hook 'css-mode-hook 'rainbow-mode)
(add-hook 'after-make-frame-functions 'setup-system-frame-colours t)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; SKELETONS ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define-skeleton cmake-project-skeleton
"A cmake project template file"
"Name: "
"cmake_minimum_required(VERSION 2.6)\n"
"project(" str ")\n"
"\n"
"set(" str "_VERSION_MAJOR 0)\n"
"set(" str "_VERSION_MINOR 0)\n"
"set(" str "_VERSION_PATCH 0)\n"
"\n"
"set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PROJECT_SOURCE_DIR})\n"
"add_subdirectory(src)")
(define-skeleton myaethon-set-varchar-docstring
"A docstring for a varchar setter"
""
"\/* Setter for the "
(skeleton-read "name: ")
" column\n"
"\n"
'(indent-according-to-mode)
"$value: string, no longer than "
(skeleton-read "len: ")
" characters */"
'(fill-paragraph))
(define-skeleton myaethon-set-array-varchar-docstring
"A docstring for an array/varchar setter"
""
'(setq name (skeleton-read "name: "))
'(setq len (string-to-number (skeleton-read "length: ")))
'(setq size (floor (/ (- len 1) 2)))
"/* Setter for the "
name
" column\n"
"\n"
'(indent-according-to-mode)
"$value: array, with no more than "
(number-to-string size)
" elements; string, no langer than "
(number-to-string len)
" characters */"
'(fill-paragraph))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; AUTORUN ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(org-crypt-use-before-save-magic)
(ad-activate 'server-create-window-system-frame)
(add-php-keywords)
(add-html-keywords)
(make-face 'font-lock-operator-face)
(make-face 'font-lock-end-statement)
(set-face-foreground 'font-lock-operator-face "#EDD400")
(set-face-foreground 'font-lock-end-statement "#888A85")
(custom-set-variables
;; custom-set-variables was added by Custom.
;; If you edit it by hand, you could mess it up, so be careful.
;; Your init file should contain only one such instance.
;; If there is more than one, they won't work right.
'(org-agenda-files (quote ("~/documents/org/main.org")))
'(safe-local-variable-values (quote ((Mode . shell-script) (ispell-local-dictionary . nl)))))
(custom-set-faces
;; custom-set-faces was added by Custom.
;; If you edit it by hand, you could mess it up, so be careful.
;; Your init file should contain only one such instance.
;; If there is more than one, they won't work right.
)
(put 'narrow-to-region 'disabled nil)