#+TITLE: Emacs init #+STYLE: #+OPTIONS: author:nil #+STARTUP: showall #+LINK: yoshi-theme http://ryuslash.org/projects/yoshi-theme.html * Emacs init Before doing anything else I should make sure that both the directories ~/usr/local/emacs/share/emacs/site-lisp~ and ~/usr/share/emacs/site-list~ are included in =load-path=, along with their subdirectories, but only if they haven't already been added and exist. Place them at the end of =load-path= so they don't mess up package precedence. #+BEGIN_SRC emacs-lisp :tangle init2.el (eval-and-compile (defun oni:path-init (dir) "Add DIR to `load-path' and all its subdirectories, unless DIR is already in `load-path'." (unless (or (member dir load-path) (not (file-exists-p dir))) (let ((default-directory dir)) (add-to-list 'load-path dir t) (normal-top-level-add-subdirs-to-load-path)))) (oni:path-init "/usr/share/emacs/site-lisp") (oni:path-init "/usr/local/emacs/share/emacs/site-lisp")) #+END_SRC Add my project [[yoshi-theme]] to =custom-theme-load-path= and load it. #+BEGIN_SRC emacs-lisp :tangle init2.el (add-to-list 'custom-theme-load-path "~/projects/emacs/yoshi-theme/") (load-theme 'yoshi t) #+END_SRC Remove the ~menu-bar~, ~tool-bar~ and ~scroll-bar~ from the UI since I don't use them at all. #+BEGIN_SRC emacs-lisp :tangle init2.el (menu-bar-mode -1) (scroll-bar-mode -1) (tool-bar-mode -1) #+END_SRC Add any other interesting paths to =load-path= and, if it exists, load the ~loaddefs.el~ file from these directories. #+BEGIN_SRC emacs-lisp :tangle init2.el (mapc #'(lambda (dir) (add-to-list 'load-path dir) (let ((loaddefs (concat dir "/loaddefs.el"))) (when (file-exists-p loaddefs) (load loaddefs)))) '("~/projects/emacs/mode-icons" "~/.emacs.d/site-lisp" "~/projects/emacs/pony-mode/src" "~/projects/emacs/php-mode")) #+END_SRC Don't ask ~yes~ or ~no~, ask ~y~ or ~n~, I've never had an accidental ~y~ so far. #+BEGIN_SRC emacs-lisp :tangle init2.el (defalias 'yes-or-no-p 'y-or-n-p) #+END_SRC Use =ibuffer= instead of the default =list-buffers= because it has many more features. #+BEGIN_SRC emacs-lisp :tangle init2.el (defalias 'list-buffers 'ibuffer) #+END_SRC Do the same with =hippie-expand= and =dabbrev-expand=. #+BEGIN_SRC emacs-lisp :tangle init2.el (defalias 'dabbrev-expand 'hippie-expand) #+END_SRC Don't show it when ~eldoc~ is running, I almost assume that it is whenever I'm working in a mode that supports it anyway. This should only execute once ~eldoc~ has been loaded. #+BEGIN_SRC emacs-lisp :tangle init2.el (eval-after-load "eldoc" '(diminish 'eldoc-mode)) #+END_SRC ** Eshell Add ~unison~ to the list of =eshell-visual-commands= because it expects unbuffered input and eshell just doesn't give that. #+BEGIN_SRC emacs-lisp :tangle init2.el (eval-after-load "em-term" '(add-to-list 'eshell-visual-commands "unison")) #+END_SRC Don't let eshell highlight it's prompt, this way I can decide the colors for it myself. #+BEGIN_SRC emacs-lisp :tangle init2.el (setq eshell-highlight-prompt nil) #+END_SRC In the prompt: - Show the exit status of the last program/command run represented by a green ~+~ and a red ~-~ sign. - Show the current hostname with the =mode-line-buffer-id= face. - Show an abbreviation of the current directory (as seen in ~fish~) using the =font-lock-string-face= face. - If we're in a git repository, show the current branch with the =font-lock-function-name-face= face. - Show the status of priviledges in blue. And set the =eshell-prompt-regexp= to #+BEGIN_SRC emacs-lisp :tangle init2.el (defun oni:eshell-prompt-function () "Show a pretty shell prompt." (let ((status (if (zerop eshell-last-command-status) ?+ ?-)) (hostname (shell-command-to-string "hostname")) (dir (abbreviate-file-name (eshell/pwd))) (branch (shell-command-to-string "git branch --contains HEAD 2>/dev/null | sed -e '/^[^*]/d'")) (userstatus (if (zerop (user-uid)) ?# ?$))) (concat (propertize (char-to-string status) 'face `(:foreground ,(if (= status ?+) "green" "red"))) " " (propertize (substring hostname 0 -1) 'face 'mode-line-buffer-id) " " (propertize (oni:shorten-dir dir) 'face 'font-lock-string-face) " " (when (not (string= branch "")) (propertize ;; Cut off "* " and "\n" (substring branch 2 -1) 'face 'font-lock-function-name-face)) " \n" (propertize (char-to-string userstatus) 'face `(:foreground "blue")) "> "))) (setq eshell-prompt-function 'oni:eshell-prompt-function eshell-prompt-regexp "^[#$]> ") #+END_SRC Don't truncate lines in eshell, wrap them. #+BEGIN_SRC emacs-lisp :tangle init2.el (defun oni:eshell-mode-func () "Function for `eshell-mode-hook'." (setq truncate-lines nil)) (add-hook 'eshell-mode-hook 'oni:eshell-mode-func) #+END_SRC Bind the ~f8~ key to easily show eshell. #+BEGIN_SRC emacs-lisp :tangle init2.el (defun oni:raise-eshell () "Start or switch back to `eshell'. Also change directories to current working directory." (interactive) (let ((dir (file-name-directory (or (buffer-file-name) "~/"))) (hasfile (not (eq (buffer-file-name) nil)))) (eshell) (if (and hasfile (eq eshell-process-list nil)) (progn (eshell/cd dir) (eshell-reset))))) (global-set-key (kbd "") 'oni:raise-eshell) #+END_SRC