(defconst elisp-path '("~/.emacs.d")) (mapcar '(lambda(p)
(add-to-list 'load-path p)
(cd p) (normal-top-level-add-subdirs-to-load-path)) elisp-path)
(defconst djcb-config-dir "~/.emacs.d/config/")
(defconst djcb-emacs-dir "~/.emacs.d")
(defconst djcb-tmp-dir "~/.emacs.tmp")
(defconst djcb-id-tag (concat (user-login-name) "@" (system-name)))
(defmacro djcb-require-maybe (feature &optional file)
"*Try to require FEATURE, but don't signal an error if `require' fails."
`(require ,feature ,file 'noerror))
(djcb-require-maybe 'djcb-funcs) (require 'cl)
(when (load (expand-file-name "~/.emacs.d/elpa/package.el"))
(package-initialize))
(defconst djcb-win32-p (eq system-type 'windows-nt) "Are we on Windows?")
(defconst djcb-linux-p (or (eq system-type 'gnu/linux)(eq system-type 'linux))
"Are we running on a GNU/Linux system?")
(defconst djcb-console-p (eq (symbol-value 'window-system) nil)
"Are we in a console?")
(defconst djcb-machine (substring (shell-command-to-string "hostname") 0 -1))
(line-number-mode t) (column-number-mode t) (when (fboundp size-indication-mode)
(size-indication-mode t)) (display-time-mode -1)
(menu-bar-mode t) (tool-bar-mode -1) (mouse-avoidance-mode 'jump) (icomplete-mode t) (setq icomplete-prospects-height 2) (scroll-bar-mode t) (set-scroll-bar-mode 'right)
(partial-completion-mode t)
(setq scroll-margin 1 scroll-conservatively 100000 scroll-up-aggressively 0.01 scroll-down-aggressively 0.01)
(when (fboundp 'set-fringe-mode) (set-fringe-mode 1))
(transient-mark-mode t) (delete-selection-mode t) (setq x-select-enable-clipboard t interprogram-paste-function 'x-cut-buffer-or-selection-value)
(setq search-highlight t query-replace-highlight t) (fset 'yes-or-no-p 'y-or-n-p)
(global-font-lock-mode t)
(setq completion-ignore-case t read-file-name-completion-ignore-case t)
(put 'narrow-to-region 'disabled nil) (put 'erase-buffer 'disabled nil) (when (fboundp file-name-shadow-mode) (file-name-shadow-mode t))
(setq inhibit-startup-message t inhibit-startup-echo-area-message t)
(setq require-final-newline t)
(setq locale-coding-system 'utf-8)
(set-terminal-coding-system 'utf-8)
(set-keyboard-coding-system 'utf-8)
(set-selection-coding-system 'utf-8)
(prefer-coding-system 'utf-8)
(set-language-environment "UTF-8") (set-input-method nil) (setq read-quoted-char-radix 10)
(setq bookmark-default-file "~/.emacs.d/bookmarks") (setq save-place-file
(concat djcb-tmp-dir "/saveplace")) (setq-default save-place t) (require 'saveplace) (setq savehist-additional-variables '(search ring regexp-search-ring) savehist-autosave-interval 60 savehist-file (concat djcb-tmp-dir "/savehist")) (savehist-mode t)
(when (djcb-require-maybe 'recentf) (setq recentf-save-file (concat djcb-tmp-dir "/recentf") recentf-max-saved-items 100 recentf-max-menu-items 15) (recentf-mode t)) (setq abbrev-file-name "~/.emacs.d/abbrev_defs") (abbrev-mode t) (setq default-abbrev-mode t save-abbrevs t) (when (file-exists-p abbrev-file-name)
(quietly-read-abbrev-file)) (add-hook 'kill-emacs-hook 'write-abbrev-file) (eval-after-load "filecache"
'(progn (message "Loading file cache...")
(file-cache-add-directory "~/")
(file-cache-add-directory-list (list "~/Desktop" "~/Documents"))))
(setq djcb-backup-dir (concat djcb-tmp-dir "/backups"))
(setq make-backup-files t backup-by-copying t backup-directory-alist '(("." . "~/.emacs.tmp/backups")) version-control t
kept-new-versions 2
kept-old-versions 5
delete-old-versions t)
(setq time-stamp-active t time-stamp-line-limit 10 time-stamp-format "%04y-%02m-%02d %02H:%02M:%02S (%u)") (add-hook 'write-file-hooks 'time-stamp)
(blink-cursor-mode 0) (when (djcb-require-maybe 'cursor-chg) (change-cursor-mode 1) (toggle-cursor-type-when-idle 1)
(setq curchg-default-cursor-color "Yellow"))
(when (fboundp 'global-hl-line-mode)
(global-hl-line-mode t))
(when (fboundp 'show-paren-mode)
(show-paren-mode t)
(setq show-paren-style 'parenthesis))
(global-highlight-changes-mode t)
(setq highlight-changes-visibility-initial-state nil)
(when (djcb-require-maybe 'uniquify) (setq
uniquify-buffer-name-style 'post-forward
uniquify-separator ":"
uniquify-after-kill-buffer-p t
uniquify-ignore-buffers-re "^\\*"))
(setq hippie-expand-try-functions-list
'(yas/hippie-try-expand try-expand-all-abbrevs try-expand-dabbrev
try-expand-dabbrev-from-kill
try-complete-lisp-symbol-partially try-complete-lisp-symbol-partially
try-expand-dabbrev-all-buffers))
(require 'tramp)
(setq tramp-default-method "ssh")
(setq
diary-file "~/.emacs.d/diary" holidays-in-diary-buffer t
mark-holidays-in-calendar t
all-christian-calendar-holidays t all-islamic-calendar-holidays nil all-hebrew-calendar-holidays nil display-time-24hr-format t display-time-day-and-date nil display-time-format nil display-time-use-mail-icon nil calendar-latitude 60.1 calendar-longitude 24.5 calendar-location-name "Helsinki")
(set-default-font
(cond
(djcb-win32-p
"-outline-Consolas-normal-r-normal-normal-14-97-96-96-c-*-iso8859-1")
((and (not djcb-console-p) djcb-linux-p)
(= 0 (shell-command "fc-list | grep Inconsolata"))
"Inconsolata-11")))
(setq tetris-score-file (concat djcb-tmp-dir "/tetris-scores"))
(when (require 'color-theme) (color-theme-djcb-dark))
(defmacro djcb-program-shortcut (name key &optional use-existing)
"* macro to create a key binding KEY to start some terminal program PRG;
if USE-EXISTING is true, try to switch to an existing buffer"
`(global-set-key ,key
'(lambda() (interactive)
(djcb-term-start-or-switch ,name ,use-existing))))
(global-set-key (kbd "<delete>") 'delete-char) (global-set-key (kbd "M-g") 'goto-line)
(global-set-key(kbd "<C-prior>")(lambda()(interactive)(goto-char(point-min))))
(global-set-key(kbd "<C-next>") (lambda()(interactive)(goto-char(point-max))))
(global-set-key (kbd "C-z") 'undo) (global-set-key (kbd "s-b") 'pop-global-mark)
(global-set-key (kbd "<f7>") 'compile) (global-set-key (kbd "S-<f7>") 'delete-other-windows)
(global-set-key (kbd "<f8>") 'comment-or-uncomment-region) (global-set-key (kbd "C-<f5>") 'djcb-count-words) (when (djcb-require-maybe 'magit) (global-set-key (kbd "C-<f6>") 'magit-status)) (global-set-key (kbd "<S-f6>") 'highlight-changes-visible-mode) (global-set-key (kbd "<S-f7>") 'whitepace-mode) (autoload 'linum "linum" "mode for line numbers" t)
(global-set-key (kbd "<S-f9>") 'djcb-fullscreen-toggle) (global-set-key (kbd "<S-<f10>") 'package-list-packages)
(global-set-key (kbd "<f12>" ) 'elscreen-create)
(global-set-key (kbd "S-<f12>" ) 'elscreen-kill)
(global-set-key (kbd "<s-prior>") 'elscreen-previous)
(global-set-key (kbd "<s-next>") 'elscreen-next)
(global-set-key (kbd "C-c r") 'remember)
(global-set-key (kbd "C-c w") 'djcb-wikipedia)
(global-set-key (kbd "<backtab>") 'bbdb-complete-name)
(global-set-key (kbd "C-c l") 'org-store-link)
(global-set-key (kbd "s-a") 'org-agenda-list) (global-set-key (kbd "s-n") 'org-todo-list)
(global-set-key (kbd "s-b") 'browse-url) (global-set-key (kbd "s-e") 'djcb-erc-start-or-switch)
(global-set-key (kbd "s-f") 'browse-url-firefox) (setq browse-url-firefox-new-window-is-tab t)
(global-set-key (kbd "s-g") 'w3m-goto-url) (global-set-key (kbd "s-t") 'twitter-get-friends-timeline) (global-set-key (kbd "s-w") 'wl)
(djcb-program-shortcut "mutt" (kbd "s-m") t) (djcb-program-shortcut "zsh" (kbd "s-z") t)
(global-set-key (kbd "s-s") 'sr-speedbar-toggle)
(global-set-key (kbd "s-l") 'linum)
(global-set-key (kbd "s-W") (lambda()(interactive)(find-file wl-init-file)))
(global-set-key (kbd "s-S") (lambda()(interactive)(switch-to-buffer "*scratch*")))
(global-set-key (kbd "s-E") (lambda()(interactive)(find-file "~/.emacs")))
(global-set-key (kbd "s-G") (lambda()(interactive)(find-file "~/.emacs.d/org/agenda/gtd.org")))
(global-set-key (kbd "s-R") (lambda()(interactive)(find-file "~/.emacs.d/org/agenda/remember.org")))
(global-set-key (kbd "s-B") (lambda()(interactive)(find-file "~/.emacs.d/org/books.org")))
(require 'windmove)
(windmove-default-keybindings 'super)
(require 'winner)
(setq winner-dont-bind-my-keys t) (global-set-key (kbd "<C-s-left>") 'winner-undo)
(global-set-key (kbd "<C-s-right>") 'winner-redo)
(winner-mode t)
(global-set-key (kbd "C-+") (lambda()(interactive(djcb-zoom 1))))
(global-set-key [C-kp-add] (lambda()(interactive(djcb-zoom 1))))
(global-set-key (kbd "C--") (lambda()(interactive(djcb-zoom -1))))
(global-set-key [C-kp-subtract] (lambda()(interactive(djcb-zoom -1))))
(global-set-key (kbd "C-8") '(lambda()(interactive)(djcb-opacity-modify)))
(global-set-key (kbd "C-9") '(lambda()(interactive)(djcb-opacity-modify t)))
(global-set-key (kbd "C-0") '(lambda()(interactive)
(modify-frame-parameters nil `((alpha . 100)))))
(global-set-key (kbd "M-X") 'smex) (setq smex-save-file (concat djcb-tmp-dir "/smex.save"))
(when (djcb-require-maybe 'smex)
(smex-initialize))
(global-set-key [(control tab)] 'hippie-expand)
(global-set-key (kbd "TAB") 'indent-for-tab-command)
(when (djcb-require-maybe 'yasnippet-bundle) (setq yas/trigger-key [(super tab)])
yas/next-field-key [(control tab)])
(djcb-require-maybe 'djcb-yasnippet-bundle)
(defun djcb-yasnippet-compile-bundle ()
"create a bundle of my own snippets"
(interactive)
(yas/compile-bundle
"~/.emacs.d/elisp/yasnippet-0.5.9/yasnippet.el"
"~/.emacs.d/elisp/djcb-yasnippet-bundle.el"
'("~/.emacs.d/yasnippets/")
"(yas/initialize)"))
(easy-menu-define djcb-menu global-map "MyMenu"
'("djcb"
("Programs" ["mutt" (djcb-term-start-or-switch "mutt" t)]
["mc" (djcb-term-start-or-switch "mc" t)]
["htop" (djcb-term-start-or-switch "htop" t)]
["iotop" (djcb-term-start-or-switch "iotop" t)])
("Org"
["html" (org-export-as-html 3 nil nil nil t)])
("TeXDrive" :visible (or (string= major-mode "html-helper-mode")
(string= major-mode "html-mode"))
["Insert formula" texdrive-insert-formula
:help "Insert some formula"]
["Generate images" texdrive-generate-images
:help "(Re)generate the images for the formulae"])
("Twitter" ["View friends" twitter-get-friends-timeline]
["What are you doing?" twitter-status-edit])
("Misc" ["Save & exit" save-buffers-kill-emacs]
["Count words" djcb-count-words]
["Show/hide line numbers" linum]
["Toggle full-screen" djcb-fullscreen-toggle])))
(require 'ido)
(ido-mode 'buffers) (setq
ido-save-directory-list-file (concat djcb-tmp-dir "/ido.last")
ido-ignore-buffers '("\\` " "^\*Mess" "^\*Back" ".*Completion" "^\*Ido")
ido-work-directory-list '("~/" "~/Desktop" "~/Documents")
ido-everywhere t ido-case-fold t ido-enable-last-directory-history t ido-max-work-directory-list 30 ido-max-work-file-list 50 ido-use-filename-at-point nil ido-use-url-at-point nil ido-enable-flex-matching t ido-max-prospects 4 ido-confirm-unique-completion t)
(setq ispell-program-name "aspell"
ispell-extra-args '("--sug-mode=ultra"))
(add-hook 'newsticker-mode-hook 'imenu-add-menubar-index) (setq newsticker-html-renderer 'w3m-region)
(require 'find-func)
(find-function-setup-keys)
(defmacro set-key-func (key expr)
"macro to save me typing"
(list 'local-set-key (list 'kbd key)
(list 'lambda nil
(list 'interactive nil) expr)))
(defmacro set-key (key str) (list 'local-set-key (list 'kbd key) str))
(setq org-directory "~/.emacs.d/org/")
(setq
org-agenda-files (directory-files (concat org-directory "agenda/")
t "^[^#].*\\.org$") org-agenda-include-diary t
org-agenda-show-all-dates t org-agenda-skip-deadline-if-done t org-agenda-skip-scheduled-if-done t org-agenda-start-on-weekday nil
org-agenda-skip-unavailable-files t
org-agenda-todo-ignore-deadlines t org-agenda-todo-ignore-scheduled t org-agenda-todo-ignore-with-date t
org-completion-use-ido t
org-enforce-to-checkbox-dependencies t org-enforce-todo-dependencies t org-hide-leading-stars t
org-log-done 'time org-return-follows-link t org-tags-column -78
org-export-with-section-numbers nil org-export-with-toc nil org-export-with-author-info nil org-export-with-creator-info nil org-export-htmlize-output-type 'css
org-use-fast-todo-selection t org-archive-location (concat org-directory "/archive.org::%s")
org-tag-alist '( ("FAMILY" . ?f)
("FINANCE" . ?m)
("FRIENDS" . ?v)
("HACKING" . ?h)
("HOME" . ?t)
("MUSIC" . ?m)
("PHONE" . ?p)
("SPORTS" . ?s)
("URGENT" . ?u)
("WORK" . ?w))
org-todo-keywords '((type "TODO(t)" "STARTED(s)" "MAYBE(m)" "INFO(i)"
"WAITING(w)" "VIEW(v)" "|" "DONE(d)" "CANCELLED(c)")))
(org-remember-insinuate) (setq
org-default-notes-file (concat org-directory "agenda/remember.org")
org-remember-templates
'(
("Todo" ?t "* TODO %u %?\n" nil "Tasks")
("Link" ?l "* INFO %u %?\n %a\n" nil "Links")
("Note" ?n "* INFO %u %^{Title}\n %?\n" nil "Notes")))
(add-hook 'org-mode-hook
(lambda()
(auto-fill-mode t)
(set-fill-column 78)
(add-hook 'before-save-hook 'org-agenda-to-appt t t)
(font-lock-add-keywords nil
'(("\\<\\(FIXME\\)"
1 font-lock-warning-face prepend)))))
(defun djcb-remember-frame ()
"turn the current frame into a small popup frame for remember mode;
this is meant to be called with
emacsclient -c -e '(djcb-remember-frame)'"
(modify-frame-parameters nil
'( (name . "*Remember*") (width . 80)
(height . 10)
(vertical-scroll-bars . nil)
(menu-bar-lines . nil)
(tool-bar-lines . nil)))
(org-remember)
(when (fboundp 'x-focus-frame) (x-focus-frame nil)) (delete-other-windows))
(add-hook 'org-remember-mode-hook
(lambda()
(define-key org-remember-mode-map (kbd "C-c C-c")
'(lambda()(interactive)
(let ((remember-frame-p
(string= (frame-parameter nil 'name) "*Remember*")))
(when remember-frame-p (make-frame-invisible)) (org-remember-finalize)
(when remember-frame-p (delete-frame)))))))
(when (locate-library "muttrc-mode")
(autoload 'muttrc-mode "muttrc-mode" "mode for editing muttrc" t)
(add-to-list 'auto-mode-alist '("muttrc" . muttrc-mode)))
(add-hook 'text-mode-hook
(lambda()
(set-fill-column 78) (auto-fill-mode t) (set-input-method "latin-1-prefix")))
(setq w3m-init-file "~/.emacs.d/config/djcb-w3m.el")
(when (djcb-require-maybe 'w3m)
(setq
browse-url-browser-function 'w3m-browse-url browse-url-new-window-flag t))
(when (djcb-require-maybe 'erc)
(require 'djcb-erc))
(autoload 'htmlize-region "htmlize" "htmlize the region" t)
(autoload 'htmlize-buffer "htmlize" "htmlize the buffer" t)
(add-hook 'post-mode-hook
(lambda()
(auto-fill-mode t)
(setq fill-column 72) (set-input-method "latin-1-prefix") (turn-on-orgstruct) (djcb-require-maybe 'boxquote)))
(autoload 'post-mode "post" "mode for e-mail" t)
(add-to-list 'auto-mode-alist
'("\\.*mutt-*\\|.article\\|\\.followup" . post-mode))
(when (djcb-require-maybe 'wl)
(autoload 'wl-draft "wl-draft" "Write draft with Wanderlust." t)
(defconst djcb-wl-dir (concat djcb-emacs-dir "/wl"))
(setq wl-init-file (concat djcb-wl-dir "/wl-djcb.el"))
(djcb-require-maybe 'mime-w3m)
(load-library (concat djcb-wl-dir "/wl-" djcb-id-tag ".el"))
(setq wl-folders-file (concat djcb-wl-dir "/wl-" djcb-id-tag "-folders")))
(setq bbdb-file
(concat djcb-emacs-dir "/bbdb-" djcb-id-tag)) (when (and (djcb-require-maybe 'bbdb) (djcb-require-maybe 'bbdb-wl))
(bbdb-initialize)
(bbdb-wl-setup)
(setq
bbdb-offer-save 1
bbdb-use-pop-up t bbdb-electric-p t bbdb-popup-target-lines 1
bbdb-dwim-net-address-allow-redundancy t bbdb-quiet-about-name-mismatches 2 bbdb-always-add-address t bbdb-canonicalize-redundant-nets-p t
bbdb-completion-type nil bbdb-complete-name-allow-cycling t
bbbd-message-caching-enabled t bbdb-use-alternate-names t
bbdb/mail-auto-create-p 'bbdb-ignore-some-messages-hook
bbdb-ignore-some-messages-alist '(( "From" . ".*no.?reply\\|DAEMON\\|daemon\\|facebookmail\\twitter\.com")))
)
(add-hook 'html-helper-mode-hook
(lambda()
(abbrev-mode t) (auto-fill-mode -1) (when (djcb-require-maybe 'texdrive) (texdrive-mode t))))
(setq auto-mode-alist (cons '("\\.html$" . html-helper-mode) auto-mode-alist))
(defun djcb-tex-mode-hook ()
"my TeX/LaTeX (auctex) settings"
(interactive)
(setq
TeX-brace-indent-level 0 LaTeX-item-ident 2
TeX-parse-self t TeX-auto-save t))
(add-hook 'tex-mode-hook 'djcb-tex-mode-hook)
(add-hook 'LaTeX-mode-hook 'djcb-tex-mode-hook)
(add-hook 'emacs-lisp-mode-hook
(lambda()
(local-set-key (kbd "<f7>") '(lambda()(interactive)
(let ((debug-on-error t))
(eval-buffer)
(message "buffer evaluated"))))
(setq lisp-indent-offset 2) (djcb-require-maybe 'folding)
(font-lock-add-keywords nil '(("^[^\n]\\{80\\}\\(.*\\)$"
1 font-lock-warning-face prepend)))
(font-lock-add-keywords nil
'(("\\<\\(FIXME\\|TODO\\|XXX+\\|BUG\\)"
1 font-lock-warning-face prepend)))
(font-lock-add-keywords nil
'(("\\<\\(djcb-require-maybe\\|add-hook\\|setq\\)"
1 font-lock-keyword-face prepend)))))
(defalias 'perl-mode 'cperl-mode) (add-hook 'cperl-mode-hook
(lambda()
(eval-when-compile (require 'cperl-mode))
(abbrev-mode -1) (setq
cperl-hairy t cperl-indent-level 4 cperl-invalid-face nil cperl-electric-keywords t)))
(add-hook 'gtags-mode-hook
(lambda()
(local-set-key (kbd "M-.") 'gtags-find-tag) (local-set-key (kbd "M-,") 'gtags-find-rtag) (local-set-key (kbd "s-n") 'gtags-pop-stack)
(local-set-key (kbd "s-p") 'gtags-find-pattern)
(local-set-key (kbd "s-g") 'gtags-find-with-grep)))
(defconst djcb-c-style '((c-tab-always-indent . t)))
(defun djcb-c-mode-common ()
(interactive)
(c-add-style "djcb" djcb-c-style t)
(c-set-style "linux" djcb-c-style)
(hs-minor-mode t) (font-lock-add-keywords nil
'(("\\<\\(FIXME\\|TODO\\|XXX+\\|BUG\\):"
1 font-lock-warning-face prepend)))
(font-lock-add-keywords nil
'(("\\<\\(__FUNCTION__\\|__PRETTY_FUNCTION__\\|__LINE__\\)"
1 font-lock-preprocessor-face prepend)))
(setq
compilation-scroll-output 'first-error compilation-read-command nil compilation-window-height 12)
(setq
c-basic-offset 8 c-hungry-delete-key t)
(when (djcb-require-maybe 'dtrt-indent) (dtrt-indent-mode t))
(when (not (string-match "/usr/src/linux"
(expand-file-name default-directory)))
(when (djcb-require-maybe 'gtags)
(gtags-mode t)
(djcb-gtags-create-or-update)))
(when (djcb-require-maybe 'doxymacs)
(doxymacs-mode t)
(doxymacs-font-lock))
(local-set-key (kbd "<M-up>") 'previous-error)
(local-set-key (kbd "<M-down>") 'next-error)
(local-set-key (kbd "C-c i") 'djcb-include-guards)
(local-set-key (kbd "C-c o") 'ff-find-other-file)
(font-lock-add-keywords 'c-mode '(("^[^\n]\\{80\\}\\(.*\\)$"
1 font-lock-warning-face prepend))))
(defun djcb-c++-mode ()
(font-lock-add-keywords 'c++-mode '(("^[^\n]\\{100\\}\\(.*\\)$"
1 font-lock-warning-face prepend))))
(add-hook 'c-mode-common-hook 'djcb-c-mode-common) (add-hook 'c++-mode-hook 'djcb-c++-mode)
(add-hook 'makefile-mode-hook
(lambda()
(whitespace-mode t)))
(setq compilation-window-height 12)
(setq compilation-finish-functions nil)
(defadvice term-char-mode (after term-char-mode-fixes ())
(set (make-local-variable 'cua-mode) nil)
(set (make-local-variable 'transient-mark-mode) nil)
(set (make-local-variable 'global-hl-line-mode) nil)
(ad-activate 'term-char-mode)
(term-set-escape-char ?\C-x))
(add-hook 'term-mode-hook
(lambda()
(local-set-key [(tab)] nil)
(local-set-key (kbd "<C-f1>")
'(lambda()(interactive)
(shell-command "killall -SIGWINCH mutt slrn irssi zsh")))))
(autoload 'twitter-get-friends-timeline "twitter" nil t)
(autoload 'twitter-status-edit "twitter" nil t)
(add-hook 'twitter-status-edit-mode-hook 'longlines-mode)
(setq safe-local-variable-values
(quote ((auto-recompile . t)
(outline-minor-mode . t)
auto-recompile outline-minor-mode)))