diff options
author | Tom Willemsen | 2013-02-15 15:37:42 +0100 |
---|---|---|
committer | Tom Willemsen | 2013-02-15 15:37:42 +0100 |
commit | 934d02bcacaa5d0aef64a8edf7677f3b0c198666 (patch) | |
tree | edfc842025b5f8569973567b44ad62aa662f548f /.emacs.d/init.org | |
parent | 06ff316f7f3b098504a6342651a79017cfb80ae7 (diff) | |
parent | ee34dfcc2c2fec53731b64afca03bb34dd80b2ba (diff) | |
download | dotfiles-934d02bcacaa5d0aef64a8edf7677f3b0c198666.tar.gz dotfiles-934d02bcacaa5d0aef64a8edf7677f3b0c198666.zip |
Merge remote-tracking branch 'ryuslash/master' into phoenix
Conflicts:
.config/awesome/rc.lua
.emacs.d/init.el
.emacs.d/init.org
.emacs.d/site-lisp/oni.el
Diffstat (limited to '.emacs.d/init.org')
-rw-r--r-- | .emacs.d/init.org | 508 |
1 files changed, 255 insertions, 253 deletions
diff --git a/.emacs.d/init.org b/.emacs.d/init.org index 6cd2032..f4acfca 100644 --- a/.emacs.d/init.org +++ b/.emacs.d/init.org @@ -1,308 +1,310 @@ #+TITLE: Emacs init #+STYLE: <link href="http://ryuslash.ninth.su/test2.css" rel="stylesheet"> #+OPTIONS: author:nil +#+STARTUP: showall +#+LINK: yoshi-theme http://ryuslash.org/projects/yoshi-theme.html -* Startup - - Startup requires a bit of customization to handle all my - customizations. - -** Load paths - - I have two versions of Emacs installed on my main computer. I have - a daily build of Emacs's ~trunk~ (or currently ~emacs-24~) branch from - bazaar and I have the official ~emacs~ package from archlinux - installed. I keep that second one around so that the occasional - emacs package that I install using ~pacman~ will recognize it as a - dependency and so that if there has been some horrible mistake in - the ~trunk~ branch I still have a stable version to fall back - on[fn:1]. - -*** Package initialization +* Emacs init - In order for packages installed through ELPA to be included - without having to mess with load paths and such, use: - - #+NAME: package-initialize - #+BEGIN_SRC emacs-lisp - (package-initialize) - #+END_SRC + 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. -*** site-lisp - - Because of the setup I wrote about I need to have both the - self-built ~site-lisp~ directory in my load path *and* the "official" - one. + #+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 - The =oni:add-all-to-load-path= function just binds =default-directory= - to the given directory and calls - =normal-top-level-add-subdirs-to-load-path= to add it and all its - subdirectories to the load path. + Add my project [[yoshi-theme]] to =custom-theme-load-path= and load it. - #+NAME: add-all - #+BEGIN_SRC emacs-lisp - (defun oni:add-all-to-load-path (dir) - (add-to-list 'load-path dir) - (let ((default-directory dir)) - (normal-top-level-add-subdirs-to-load-path))) - #+END_SRC + #+BEGIN_SRC emacs-lisp :tangle init2.el + (add-to-list 'custom-theme-load-path "~/projects/emacs/yoshi-theme/") + (load-theme 'yoshi t) + #+END_SRC -**** TODO Add load paths in different order depending on version + Remove the ~menu-bar~, ~tool-bar~ and ~scroll-bar~ from the UI since I + don't use them at all. - The officially installed version should load - =/usr/share/emacs/site-lisp= before - =/usr/local/emacs/share/emacs/sit-lisp= and the bzr version should - do the reversed. + #+BEGIN_SRC emacs-lisp :tangle init2.el + (menu-bar-mode -1) + (scroll-bar-mode -1) + (tool-bar-mode -1) + #+END_SRC -*** Projects + Add any other interesting paths to =load-path= and, if it exists, + load the ~loaddefs.el~ file from these directories. - Then there are some projects I'm working on, which I use on a - daily basis, these should also be added so I don't have to - constantly remove and re-install them through ~package.el~ when - working on them. And there is the ~load-defs.el~ in my personal - ~site-lisp~ directory of course. + #+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 - #+NAME: load-projects - #+BEGIN_SRC emacs-lisp - (mapc #'oni:add-to-load-path-maybe-load-defs - '("~/projects/emacs/dispass.el" "~/var/src/emacs/mode-icons" - "~/.emacs.d/site-lisp")) - #+END_SRC + Don't ask ~yes~ or ~no~, ask ~y~ or ~n~, I've never had an accidental ~y~ so + far. - The =oni:add-to-load-path-maybe-load-defs= function just adds the - given directory to the load path and then looks for a file named - ~loaddefs.el~ within that directory, if it exists it loads it. + #+BEGIN_SRC emacs-lisp :tangle init2.el + (defalias 'yes-or-no-p 'y-or-n-p) + #+END_SRC - #+NAME: add-with-loaddefs - #+BEGIN_SRC emacs-lisp - (defun oni:add-to-load-path-maybe-load-defs (dir) - (add-to-list 'load-path dir) - (let ((loaddefs (concat dir "/loaddefs.el"))) - (when (file-exists-p loaddefs) - (load loaddefs)))) - #+END_SRC + Use =ibuffer= instead of the default =list-buffers= because it has many + more features. -*** Themes + #+BEGIN_SRC emacs-lisp :tangle init2.el + (defalias 'list-buffers 'ibuffer) + #+END_SRC - And, finally, I'm also working on a color theme for emacs, this - should be added to ~custom-theme-load-path~. By using =mapc= here as - well I'm keeping in mind that this isn't the first theme I've - worked on and it might not be the last either. + Do the same with =hippie-expand= and =dabbrev-expand=. - #+NAME: load-themes - #+BEGIN_SRC emacs-lisp - (mapc #'oni:add-to-custom-theme-load-path - '("~/projects/emacs/yoshi-theme")) - #+END_SRC + #+BEGIN_SRC emacs-lisp :tangle init2.el + (defalias 'dabbrev-expand 'hippie-expand) + #+END_SRC - The =oni:add-to-custom-theme-load-path= just adds the given - directory to the cutom theme load path. + 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. - #+NAME: add-themes - #+BEGIN_SRC emacs-lisp - (defun oni:add-to-custom-theme-load-path (dir) - (add-to-list 'custom-theme-load-path dir)) - #+END_SRC + #+BEGIN_SRC emacs-lisp :tangle init2.el + (eval-after-load "eldoc" '(diminish 'eldoc-mode)) + #+END_SRC -*** Evaluation + Use the standard EMMS configuration and add some MPD settings. - Because during byte-compilation certain parts loaded so far might - also be required I put it in an =eval-and-compile= form, so that all - components are loaded with ~emacs -Q~ as well. Without this - compilation might fail at certain points. - - #+BEGIN_SRC emacs-lisp :tangle init2.el :noweb yes - (eval-and-compile - <<add-all>> + #+BEGIN_SRC emacs-lisp :tangle init2.el + (defun oni:emms-init () + "Initialization function for EMMS." + (require 'emms-setup) + (require 'emms-player-mpd) - <<add-with-loaddefs>> + (emms-standard) - <<add-themes>> + (add-to-list 'emms-info-functions 'emms-info-mpd) + (add-to-list 'emms-player-list 'emms-player-mpd) - <<package-initialize>> - <<load-site-lisps>> - <<load-projects>> - <<load-themes>>) - #+END_SRC - -** Modules + (setq emms-player-mpd-server-name "localhost") + (setq emms-player-mpd-server-port "6600") + (setq emms-player-mpd-music-directory "/mnt/music/mp3")) - While I try to use =eval-after-load= and =autoload= as much as - possible, some things require direct =require='ing to be of use. + (eval-after-load "emms-source-file" '(oni:emms-init)) + (setq emms-source-file-default-directory "/mnt/music/") + #+END_SRC -*** Require - - - ~auto-complete-config~ :: This sets up some default settings to - make ~auto-complete~ work for most[fn:2] of the modes it - supports. + Add some keybindings for EMMS. #+BEGIN_SRC emacs-lisp :tangle init2.el - (require 'auto-complete-config) + (defun oni:emms-toggle-playing () + "Toggle between playing/paused states." + (interactive) + (if (eq emms-player-playing-p nil) + (emms-start) + (emms-pause))) + + (defun oni:start-emms () + "Check to see if the function `emms' exists, if not call + `emms-player-mpd-connect' and assume that will have loaded it." + (interactive) + (unless (fboundp 'emms) + (emms-player-mpd-connect)) + (emms)) + + (global-set-key (kbd "<XF86AudioNext>") 'emms-next) + (global-set-key (kbd "<XF86AudioPlay>") 'oni:emms-toggle-playing) + (global-set-key (kbd "<XF86AudioPrev>") 'emms-previous) + (global-set-key (kbd "<XF86AudioStop>") 'emms-stop) + (global-set-key (kbd "<XF86Tools>") 'oni:start-emms) #+END_SRC - - ~geiser-install~ :: Sets up geiser autoloads and such. - - #+BEGIN_SRC emacs-lisp :tangle init2.el - (require 'geiser-install) - #+END_SRC - - - ~uniquify~ :: Provides more helpful buffer name uniquification. - The default of using ~buffer-name<2>~ is boring and - uninformative, ~uniquify~ fixes this. - - #+BEGIN_SRC emacs-lisp :tangle init2.el - (require 'uniquify) - #+END_SRC - - - ~ext~ :: Functions from external sources. - - ~oni~ :: Functions written personally. - - #+BEGIN_SRC emacs-lisp :tangle init2.el - (require 'ext) - (require 'oni) - #+END_SRC - -*** Autoload - - These might not be used at all in a session, so they should only - be loaded when necessary. - - =define-slime-contrib= was used by some module that didn't autoload - or require it[fn:3]. But since I don't use whichever model it - was every day, it is of no use to load it every single time. - - #+BEGIN_SRC emacs-lisp :tangle init2.el - (autoload 'define-slime-contrib "slime") - #+END_SRC - - I installed ~global~ with ~pacman~, but this doesn't add anything to - any =loaddefs.el=, so doesn't create any autoloads. + Load ~flymake-cursor~ after loading ~flymake~, add Python and Go to + "allowed" files and add go error output to error patterns. - #+BEGIN_SRC emacs-lisp :tangle init2.el - (autoload 'gtags-mode "gtags" nil t) - #+END_SRC - - ~jabber.el~ does create ~jabber-autoloads.el~, but I only ever start - using it through ~jabber-connect~, so anything else isn't really - necessary. - - #+BEGIN_SRC emacs-lisp :tangle init2.el - (autoload 'jabber-connect "jabber" nil t) - #+END_SRC - - I used to work a bit on ~php-mode~, but that was a while ago, so - it's still in my ~site-lisp~ directory. - - #+BEGIN_SRC emacs-lisp :tangle init2.el - (autoload 'php-mode "php-mode" nil t) - #+END_SRC - - The same that goes for ~gtags.el~ also goes for ~po-mode.el~. - - #+BEGIN_SRC emacs-lisp :tangle init2.el - (autoload 'po-mode "po-mode" nil t) - #+END_SRC - - And the same that went for ~php-mode~ also goes for ~pony-mode~, - except I'm still working on it and I was too lazy to put it with - my other projects. I should still do that. - - #+BEGIN_SRC emacs-lisp :tangle init2.el - (autoload 'pony-mode "pony-mode" nil t) - #+END_SRC - - ~sawfish.el~ has the same problem that ~gtags.el~ and ~po-mode.el~ have. + #+BEGIN_SRC emacs-lisp :tangle init2.el + (defun oni:flymake-init () + "Initialization function for flymake." + (require 'flymake-cursor) - #+BEGIN_SRC emacs-lisp :tangle init2.el - (autoload 'sawfish-mode "sawfish" nil t) - #+END_SRC + (add-to-list ; Make sure pyflakes is loaded + 'flymake-allowed-file-name-masks ; for python files. + '("\\.py\\'" ext:flymake-pyflakes-init)) - I use =server-running-p= to check whether or not I should start a - new server, but this function isn't autoloaded by default. + (add-to-list ; Error line repexp for go + 'flymake-err-line-patterns ; compilation. + '("^\\([a-zA-Z0-9_]+\\.go\\):\\([0-9]+\\):\\(.*\\)$" + 1 2 nil 3)) - #+BEGIN_SRC emacs-lisp :tangle init2.el - (autoload 'server-running-p "server") - #+END_SRC + (add-to-list ; Go uses makefiles, makes + 'flymake-allowed-file-name-masks ; flymaking 'easy'. + '("\\.go$" flymake-simple-make-init))) - I was starting to try ~slime-js~ to make JavaScript programming - more interesting, but I haven't gotten around to trying it out - fully, yet. It shares issues with ~gtags.el~, ~po-mode.el~ and - ~sawfish.el~. + (eval-after-load "flymake" '(oni:flymake-init)) + #+END_SRC - #+BEGIN_SRC emacs-lisp :tangle init2.el - (autoload 'slime-js-minor-mode "slime-js" nil t) - #+END_SRC + Disable the GUI for flymake errors, add a bunch of pep8, flymake + and pyflakes messages to warning and info patterns, set the log + file to somewhere in my home directory and set logging level to 0. - I found ~xmodmap-mode~ on the [[http://emacswiki.org][EmacsWiki]] some time ago, it was - simple and a good example of how to use ~define-generic-mode~, but - since it's not really my project and it's really small it just - sits in my ~site-lisp~ directory. + #+BEGIN_SRC emacs-lisp :tangle init2.el + (setq flymake-gui-warnings-enabled nil) + (setq flymake-info-line-regexp + (eval-when-compile + (regexp-opt + '("Invalid name" + "String statement has no effect" + "Missing docstring" + "Empty docstring" + "multiple imports on one line" + "expected 2 blank lines, found 1" + "expected 2 blank lines, found 0" + "TODO:" + "whitespace after '{'" + "whitespace before '}'" + "whitespace before ':'" + "whitespace after '('" + "whitespace before ')'" + "whitespace after '['" + "whitespace before ']'" + "the backslash is redundant between brackets" + "continuation line over-indented for visual indent" + "continuation line under-indented for visual indent" + "Too many statements" + "comparison to None should be" + "missing whitespace around operator" + "missing whitespace after ','" + "line too long" + "at least two spaces before inline comment" + "trailing whitespace" + "imported but unused" + "Unused import" + "too many blank lines")))) + (setq flymake-log-file-name (expand-file-name "~/.emacs.d/flymake.log")) + (setq flymake-log-level 0) + (setq flymake-warn-line-regexp + (eval-when-compile + (regexp-opt '("warning" + "Warning" + "redefinition of unused" + "Redefining built-in" + "Redefining name" + "Unused argument" + "Unused variable" + "Dangerous default value {} as argument" + "no newline at end of file" + "Access to a protected member")))) + #+END_SRC - #+BEGIN_SRC emacs-lisp :tangle init2.el - (autoload 'xmodmap-mode "xmodmap-mode" nil t) - #+END_SRC + After loading ~flycheck~ Remove the default python checkers and + replace them with my own, which tries both ~flake8~ and ~pylint~. - ~w3m~ also has a setup module like ~geiser-install~, but since I only - ever use these two functions to start it, there is no real need - for anything else. + #+BEGIN_SRC emacs-lisp :tangle init2.el + (eval-after-load "flycheck" + '(progn + (mapc (lambda (c) (delete c flycheck-checkers)) + '(python-pylint python-pyflakes)))) + #+END_SRC - #+BEGIN_SRC emacs-lisp :tangle init2.el - (autoload 'w3m-bookmark-view "w3m" nil t) - (autoload 'w3m-goto-url "w3m" nil t) - #+END_SRC +** Eshell -* Aliases + Add ~unison~ to the list of =eshell-visual-commands= because it + expects unbuffered input and eshell just doesn't give that. - There are some functions that are just better than others, no - matter how politically incorrect it might be to admit. + #+BEGIN_SRC emacs-lisp :tangle init2.el + (eval-after-load "em-term" + '(add-to-list 'eshell-visual-commands "unison")) + #+END_SRC - #+BEGIN_SRC emacs-lisp :tangle init2.el - (defalias 'yes-or-no-p 'y-or-n-p) - (defalias 'list-buffers 'ibuffer) - (defalias 'dabbrev-expand 'hippie-expand) - #+END_SRC + Don't let eshell highlight it's prompt, this way I can decide the + colors for it myself. -* Faces + #+BEGIN_SRC emacs-lisp :tangle init2.el + (setq eshell-highlight-prompt nil) + #+END_SRC - Define faces for use with ~magit~ log edit mode. + In the prompt: - #+BEGIN_SRC emacs-lisp :tangle init2.el - (defface git-commit-summary-face - '((t (:inherit org-level-1))) - "Face for the git title line." - :group 'local) - - (defface git-commit-overlong-summary-face - '((t (:background "#873732"))) - "Face for commit titles that are too long." - :group 'local) - - (defface git-commit-nonempty-second-line-face - '((t (:inherit git-commit-overlong-summary-face))) - "Face for the supposedly empty line in commit messages." - :group 'local) - #+END_SRC + - 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. -* Keys + And set the =eshell-prompt-regexp= to - With the awesome power of Emacs comes the need for lots of - keybindings. + #+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 -** Translation + Don't truncate lines in eshell, wrap them. - Since the ~C-l~ combination is so much easier than ~C-j~ when using - the [[http://colemak.com][colemak]] keyboard layout and ~C-j~ is used so much more, switch - them. + #+BEGIN_SRC emacs-lisp :tangle init2.el + (defun oni:eshell-mode-func () + "Function for `eshell-mode-hook'." + (setq truncate-lines nil)) - #+BEGIN_SRC emacs-lisp tangle init2.el - (define-key key-translation-map (kbd "C-j") (kbd "C-l")) - (define-key key-translation-map (kbd "C-l") (kbd "C-j")) + (add-hook 'eshell-mode-hook 'oni:eshell-mode-func) #+END_SRC -* Footnotes - -[fn:1] Though it doesn't happen often that ~trunk~ is so messed up that -I can't use it. -[fn:2] Or perhaps all. + Bind the ~f8~ key to easily show eshell. -[fn:3] I think it was ~slime-js-minor-mode~, but I'm not sure. + #+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 "<f8>") 'oni:raise-eshell) + #+END_SRC |