;; -*- mode: Emacs-Lisp; -*- (let ((default-directory "~/.emacs.d/")) (normal-top-level-add-subdirs-to-load-path)) ;;-----[ Defun ]--------------------------------------------------------- (defun ext/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 ext/what-major-mode (buffer-or-string) "Find out which major-mode is currently used" (with-current-buffer buffer-or-string major-mode)) (defun ext/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 ext/pretty-lambdas () (font-lock-add-keywords nil `(("(\\(lambda\\>\\)" (0 (progn (compose-region (match-beginning 1) (match-end 1) ?λ))))))) (defun ext/x-urgency-hint (frame arg &optional source) (let* ((wm-hints (append (x-window-property "WM_HINTS" frame "WM_HINTS" (if source source (string-to-number (frame-parameter frame 'outer-window-id))) nil t) nil)) (flags (car wm-hints))) (setcar wm-hints (if arg (logior flags #x00000100) (logand flags #xFFFFFEFF))) (x-change-window-property "WM_HINTS" wm-hints frame "WM_HINTS" 32 t))) (defun oni/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 oni/init-show-outline () (interactive) (occur ";;-----\\[ .* \\]-+") (other-window 1)) (defun oni/replace-occurrences (from to) (save-excursion (goto-char (point-min)) (while (search-forward from nil t) (replace-match to)))) (defun oni/replace-html-special-chars () (oni/replace-occurrences "é" "é")) (defun oni/before-save-hook () (if (eq (ext/what-major-mode (current-buffer)) 'html-mode) (oni/replace-html-special-chars)) (if (not (eq (ext/what-major-mode (current-buffer)) 'markdown-mode)) (delete-trailing-whitespace))) (defun oni/after-save-hook () (let* ((fname (buffer-file-name)) (suffix (file-name-extension fname))) (if (string-equal suffix "el") (byte-compile-file fname)))) ;;-----[ Theme ]--------------------------------------------------------- (require 'naquadah-theme) (eval-after-load 'naquadah-theme (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)) '(ac-candidate-face (:inherit 'header-line :box nil)) '(ac-selection-face (:inherit 'hl-line :box nil)))) ;;-----[ Autopair ]------------------------------------------------------ (require 'autopair) (autopair-global-mode t) ; automatically add the other delimiter (setq autopair-skip-criteria 'always autopair-autowrap t autopair-blink nil) (setq-default autopair-dont-pair '(:string (?\' ?\") :comment (?\'))) ;;-----[ Column marker ]------------------------------------------------- (require 'column-marker) (defun set-column-markers (cm1 cm2) (column-marker-1 cm1) (column-marker-2 cm2)) ;;-----[ Prog mode ]----------------------------------------------------- (defconst integer-regex-1 (eval-when-compile (concat "\\b\\(0[xX][0-9a-fA-F]+[lL]?\\|[0-9]+\\.?[0-9]*\\([eE][-+]?" "[0-9]+\\)?\\([lL]\\|[fF]\\|[dD]\\)?\\)\\b"))) (defconst integer-regex-2 (eval-when-compile (concat "\\b\\(\\.[0-9]+\\([eE][-+]?[0-9]+\\)?\\([lL]\\|[fF]\\|[dD]" "\\)?\\)\\b"))) (defun oni/prog-mode-hook () (font-lock-add-keywords nil `((,integer-regex-1 0 font-lock-constant-face) (,integer-regex-2 0 font-lock-constant-face))) (ext/pretty-lambdas) (set-column-markers 73 81)) (if (>= emacs-major-version 24) (add-hook 'prog-mode-hook 'oni/prog-mode-hook) (add-hook 'c-mode-common-hook 'oni/prog-mode-hook) (add-hook 'go-mode-hook 'oni/prog-mode-hook) (add-hook 'emacs-lisp-mode-hook 'oni/prog-mode-hook)) ;;-----[ HTML mode ]----------------------------------------------------- (defun oni/html-mode-hook () (set-column-markers 73 81) (setq fill-column 73)) (eval-after-load "sgml-mode" (progn (font-lock-add-keywords 'html-mode '(("{\\(\\*.*\\*\\)}" 1 font-comment-face) ("{\\/?\\(extends\\|block\\|foreach\\(else\\)?\\|if\\|else\\)" 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))))) (add-hook 'html-mode-hook 'oni/html-mode-hook) (add-to-list 'auto-mode-alist '("\\.tpl$" . html-mode)) ;;-----[ Org mode ]------------------------------------------------------ (require 'org-crypt) (require 'org-publish) (defun oni/org-mode-hook () (turn-on-flyspell) (turn-on-auto-fill)) (setq 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-outline-path-complete-in-steps t org-return-follows-link t org-log-into-drawer t org-todo-keywords '((sequence "TODO(t)" "IN PROGRESS(p)" "WAITING(w@/!)" "|" "DONE(d!/!)" "CANCELLED(c@/!)")) org-refile-targets '((org-agenda-files :maxlevel . 5) (nil :maxlevel . 5)) 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))) (add-to-list 'auto-mode-alist '("\\.commitmsg$" . org-mode)) (global-set-key "\C-cl" 'org-store-link) (global-set-key "\C-cc" 'org-capture) (global-set-key "\C-ca" 'org-agenda) (add-hook 'org-mode-hook 'oni/org-mode-hook) (org-crypt-use-before-save-magic) ;;-----[ Rainbow delimiters ]-------------------------------------------- (require 'rainbow-delimiters) (setq rainbow-delimiters-max-face-count 8) (global-rainbow-delimiters-mode) ;;-----[ Uniquify ]------------------------------------------------------ (require 'uniquify) (setq uniquify-buffer-name-style 'post-forward) ;;-----[ Go mode ]------------------------------------------------------- (defun oni/go-mode-hook () (turn-off-auto-fill)) (autoload 'go-mode "go-mode" "Major mode for google go" t) (autoload 'gofmt "go-mode" "" t) (autoload 'go-fmt-before-save "go-mode" "" t) (add-to-list 'auto-mode-alist '("\\.go$" . go-mode)) (add-hook 'go-mode-hook 'oni/go-mode-hook) ;;-----[ Htmlize ]------------------------------------------------------- (require 'htmlize) (setq htmlize-output-type 'inline-css) ;;-----[ Git ]----------------------------------------------------------- (require 'git) ;;-----[ Markdown mode ]------------------------------------------------- (defun oni/markdown-mode-hook () (whitespace-mode 1) (turn-on-auto-fill)) (autoload 'markdown-mode "markdown-mode" "Major mode for Markdown" t) (setq whitespace-style '(face trailing)) ; For use with markdown mode (add-to-list 'auto-mode-alist '("\\.m\\(ark\\)?do?wn$". markdown-mode)) (add-hook 'markdown-mode-hook 'oni/markdown-mode-hook) ;;-----[ Xmodmap mode ]-------------------------------------------------- (autoload 'xmodmap-mode "xmodmap-mode" "Major mode for xmodmap" t) (add-to-list 'auto-mode-alist '("\\.[xX]modmap\\(rc\\)?$" . xmodmap-mode)) ;;-----[ Gtags ]--------------------------------------------------------- ;; http://emacs-fu.blogspot.com/2009/01/navigating-through-source-code-using.html (defun oni/gtags-create-or-update () "create or update the gnu global tag file" (interactive) (if (not (= 0 (call-process "global" nil nil nil " -p"))) ; tagfile (let ((olddir default-directory) ; doesn't exist? (topdir (read-directory-name "gtags: top of source tree:" default-directory))) (cd topdir) (shell-command "gtags && echo 'created tagfile'") (cd olddir)) ; restore ;; tagfile already exists; update it (shell-command "global -u && echo 'updated tagfile'"))) (defun oni/gtags-mode-hook () (local-set-key "\M-," 'gtags-find-tag) (local-set-key "\M-." 'gtags-find-rtag)) (autoload 'gtags-mode "gtags" "Minor mode for using gtags" t) (add-hook 'gtags-mode-hook 'oni/gtags-mode-hook) ;;-----[ C mode ]-------------------------------------------------------- (defun oni/c-mode-common-hook () (gtags-mode t) (oni/gtags-create-or-update)) (defun oni/c-mode-hook () (local-set-key [f8] 'oni/c-toggle-header-source) (local-set-key [f9] 'compile) (local-set-key [C-m] 'newline-and-indent) (local-set-key [C-return] 'newline)) (add-hook 'c-mode-common-hook 'oni/c-mode-common-hook) (add-hook 'c-mode-hook 'oni/c-mode-hook) ;;-----[ PHP mode ]------------------------------------------------------ (defconst php-outline-regex (eval-when-compile (concat "\\(function .*(\\|\\(public\\|private\\|protected\\)\\( " "static\\)? \\$\\|class \\sw\\)"))) (defun oni/php-show-outline () (interactive) (occur php-outline-regex)) (defun oni/php-mode-hook () (c-set-offset 'arglist-intro '+) (c-set-offset 'arglist-close '0) (local-set-key [f6] 'comment-line) (local-set-key [f7] 'oni/php-show-outline) (local-set-key [M-S-up] 'flymake-goto-prev-error) (local-set-key [M-S-down] 'flymake-goto-next-error) (set-column-markers 76 81) (flymake-mode 1)) (eval-after-load "php-mode" (progn ;; 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))) (autoload 'php-mode "php-mode" "Major mode for PHP" t) (setq-default php-mode-warn-if-mumamo-off nil) ; don't warn me about this (setq php-mode-force-pear t) (add-to-list 'auto-mode-alist '("\\.php[345]?$" . php-mode)) (add-hook 'php-mode-hook 'oni/php-mode-hook) ;;-----[ bidi ]---------------------------------------------------------- (setq-default bidi-display-reordering nil) ;;-----[ Message ]------------------------------------------------------- (defun oni/message-mode-hook () (turn-on-auto-fill) (turn-on-flyspell) (ispell-change-dictionary (read-string "New dictionary: "))) (add-hook 'message-mode-hook 'oni/message-mode-hook) ;;-----[ Gnus ]---------------------------------------------------------- (setq gnus-init-file "~/.emacs.d/gnus") ;;-----[ Autosmiley ]---------------------------------------------------- (require 'autosmiley) ;;-----[ Jabber ]-------------------------------------------------------- (defvar ext/jabber-activity-jids-count 0) (defun ext/jabber-urgency-hint () (let ((count (length jabber-activity-jids))) (unless (= ext/jabber-activity-jids-count count) (if (zerop count) (ext/x-urgency-hint (selected-frame) nil) (ext/x-urgency-hint (selected-frame) t)) (setq ext/jabber-activity-jids-count count)))) (defun oni/jabber-chat-mode-hook () (autosmiley-mode) (local-set-key [S-return] 'newline) (local-set-key [C-return] 'newline)) (when (require 'jabber-autoloads nil 'noerror) (setq jabber-account-list '(("ryuslash@gmail.com" (:network-server . "talk.google.com") (:connection-type . ssl)))) (setq jabber-history-enabled t) (setq jabber-use-global-history nil) (add-hook 'jabber-chat-mode-hook 'oni/jabber-chat-mode-hook) (add-hook 'jabber-activity-update-hook 'ext/jabber-urgency-hint)) ;;-----[ X11 ]----------------------------------------------------------- (when window-system (setq linum-format " %d") (global-unset-key "\C-z")) ;;-----[ CLI ]----------------------------------------------------------- (when (not window-system) (setq linum-format "%d ")) ;;-----[ Texinfo ]------------------------------------------------------- (add-hook 'texinfo-mode-hook 'turn-on-auto-fill) ;;-----[ Dot ]----------------------------------------------------------- (autoload 'graphviz-dot-mode "graphviz-dot-mode" "Major mode for dot" t) (add-to-list 'auto-mode-alist '("\\.dot$" . graphviz-dot-mode)) ;;-----[ Cmake ]--------------------------------------------------------- (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)") (autoload 'cmake-mode "cmake-mode" "Major mode for CMake" t) (add-to-list 'auto-mode-alist '("CMakeLists\\.txt$" . cmake-mode)) (add-to-list 'auto-mode-alist '("\\.cmake$" . cmake-mode)) ;;-----[ Rainbow ]------------------------------------------------------- (autoload 'rainbow-mode "rainbow-mode" "Minor mode for colors" t) ;;-----[ Git-commit mode ]----------------------------------------------- (autoload 'git-commit-mode "git-commit" "" t) (add-to-list 'auto-mode-alist '("COMMIT_EDITMSG$" . git-commit-mode)) (add-hook 'git-commit-mode-hook 'auto-fill-mode) ;;-----[ Ido ]----------------------------------------------------------- (ido-mode t) (setq ido-save-directory-list-file nil) (setq ido-auto-merge-delay-time 2) ;;-----[ Js mode ]------------------------------------------------------- (add-to-list 'auto-mode-alist '("\\.js\\(on\\)?$" . js-mode)) ;;-----[ CSS mode ]------------------------------------------------------ (add-to-list 'auto-mode-alist '("\\.css$" . css-mode)) (add-hook 'css-mode-hook 'rainbow-mode) ;;-----[ ELPA ]---------------------------------------------------------- (setq package-archives '(("ELPA" . "http://tromey.com/elpa/") ("gnu" . "http://elpa.gnu.org/packages/") ("marmalade" . "http://marmalade-repo.org/packages/"))) ;;-----[ Windmove ]------------------------------------------------------ (windmove-default-keybindings 'meta) ;;-----[ Autocomplete ]-------------------------------------------------- (when (require 'auto-complete-config nil 'noerror) (add-to-list 'ac-dictionary-directories "~/.emacs.d/ac-dict") (setq ac-comphist-file "~/.emacs.d/ac-comphist.dat") (ac-config-default)) ;;-----[ Ide-skel ]------------------------------------------------------ (require 'ide-skel) (global-set-key [f10] 'ide-skel-toggle-left-view-window) (global-set-key [f11] 'ide-skel-toggle-bottom-view-window) (global-set-key [f12] 'ide-skel-toggle-right-view-window) ;;-----[ Misc ]---------------------------------------------------------- (defun oni/reload-buffer () (interactive) (revert-buffer nil t nil)) (defvar font-lock-operator-face 'font-lock-operator-face) (defvar font-lock-end-statement 'font-lock-end-statement) (setq-default indent-tabs-mode nil) (setq-default truncate-lines t) (setq-default tab-width 4) (setq-default require-final-newline t) (setq inhibit-startup-message t) (setq inhibit-default-init t) (setq scroll-conservatively 101) (setq browse-url-browser-function 'browse-url-generic) (setq browse-url-generic-program (getenv "BROWSER")) (setq uniquify-buffer-name-style 'reverse) (setq jit-lock-defer-time 0.2) (setq mouse-autoselect-window t) (setq frame-title-format '(:eval (concat "emacs: " (buffer-name)))) (setq backup-directory-alist `((".*" . ,temporary-file-directory))) (setq auto-save-file-name-transforms `((".*" ,temporary-file-directory t))) (setq default-frame-alist (append '((font . "DejaVu Sans Mono:pixelsize=13")))) (setq initial-frame-alist (append '((font . "DejaVu Sans Mono:pixelsize=13")))) (fset 'yes-or-no-p 'y-or-n-p) (tool-bar-mode -1) (menu-bar-mode -1) (line-number-mode -1) (global-linum-mode t) (column-number-mode t) (global-font-lock-mode t) (delete-selection-mode t) (show-paren-mode t) (add-to-list 'compilation-finish-functions 'ext/my-comp-finish-function) (global-set-key "\C-m" 'newline-and-indent) (global-set-key (kbd "C-x n r") 'narrow-to-region) (global-set-key [f5] 'oni/reload-buffer) (add-hook 'before-save-hook 'oni/before-save-hook) (add-hook 'after-save-hook 'oni/after-save-hook) (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 file (setq custom-file "~/.emacs.d/custom.el") (if (file-exists-p custom-file) (load custom-file)) (defvar home-file "~/wiki.info" "File to open when starting") (if (file-exists-p home-file) (info home-file))