From a281f040cd35dffe171d5b7d6b00fe03163be6a0 Mon Sep 17 00:00:00 2001 From: Tom Willemsen Date: Sun, 17 Feb 2013 23:09:24 +0100 Subject: Move .emacs.d to emacs Since it's no longer placed directly in the home directory it doesn't need to be named exacly the same. --- emacs/init.org | 400 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 400 insertions(+) create mode 100644 emacs/init.org (limited to 'emacs/init.org') diff --git a/emacs/init.org b/emacs/init.org new file mode 100644 index 0000000..2687290 --- /dev/null +++ b/emacs/init.org @@ -0,0 +1,400 @@ +#+TITLE: Emacs init +#+STYLE: +#+OPTIONS: author:nil +#+STARTUP: showall +#+LINK: yoshi-theme http://ryuslash.org/projects/yoshi-theme.html + +* gui + + 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 + +* load-path + + 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 + + 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 + +* y-or-n-p + + 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 + +* ibuffer + + 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 + +* hippie-expand + + Do the same with =hippie-expand= and =dabbrev-expand=. + + #+BEGIN_SRC emacs-lisp :tangle init2.el + (defalias 'dabbrev-expand 'hippie-expand) + #+END_SRC + +* eldoc + + 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 + +* emms + + Use the standard EMMS configuration and add some MPD settings. + + #+BEGIN_SRC emacs-lisp :tangle init2.el + (defun oni:emms-init () + "Initialization function for EMMS." + (require 'emms-setup) + (require 'emms-player-mpd) + + (emms-standard) + + (add-to-list 'emms-info-functions 'emms-info-mpd) + (add-to-list 'emms-player-list 'emms-player-mpd) + + (setq emms-player-mpd-server-name "localhost") + (setq emms-player-mpd-server-port "6600") + (setq emms-player-mpd-music-directory "/mnt/music/mp3")) + + (eval-after-load "emms-source-file" '(oni:emms-init)) + (setq emms-source-file-default-directory "/mnt/music/") + #+END_SRC + + Add some keybindings for EMMS. + + #+BEGIN_SRC emacs-lisp :tangle init2.el + (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 "") 'emms-next) + (global-set-key (kbd "") 'oni:emms-toggle-playing) + (global-set-key (kbd "") 'emms-previous) + (global-set-key (kbd "") 'emms-stop) + (global-set-key (kbd "") 'oni:start-emms) + #+END_SRC + +* flymake + + 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 + (defun oni:flymake-init () + "Initialization function for flymake." + (require 'flymake-cursor) + + (add-to-list ; Make sure pyflakes is loaded + 'flymake-allowed-file-name-masks ; for python files. + '("\\.py\\'" ext:flymake-pyflakes-init)) + + (add-to-list ; Error line repexp for go + 'flymake-err-line-patterns ; compilation. + '("^\\([a-zA-Z0-9_]+\\.go\\):\\([0-9]+\\):\\(.*\\)$" + 1 2 nil 3)) + + (add-to-list ; Go uses makefiles, makes + 'flymake-allowed-file-name-masks ; flymaking 'easy'. + '("\\.go$" flymake-simple-make-init))) + + (eval-after-load "flymake" '(oni:flymake-init)) + #+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. + + #+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 + +* flycheck + + After loading ~flycheck~ Remove the default python checkers and + replace them with my own, which tries both ~flake8~ and ~pylint~. + + #+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 + +* pretty-control-l-mode + + Make the ~C-l~ look like a line of ~-~ up to =fill-column= or + =fci-rule-column= and remove the string displayed before the ~C-l~. + + #+BEGIN_SRC emacs-lisp :tangle init2.el + (defun oni:pretty-control-l-function (win) + "Just make a string of either `fci-rule-column' or + `fill-column' length -1. Use the `-' character. WIN is ignored." + (make-string + (1- (if (boundp 'fci-rule-column) + fci-rule-column fill-column)) ?-)) + + (setq pp^L-^L-string-function 'oni:pretty-control-l-function) + #+END_SRC + + Remove the string displayed before the ~C-l~. + + #+BEGIN_SRC emacs-lisp :tangle init2.el + (setq pp^L-^L-string-pre nil) + #+END_SRC + + Enable =pretty-control-l-mode= at startup and whenever a new frame is + created. + + #+BEGIN_SRC emacs-lisp :tangle init2.el + (add-hook 'emacs-startup-hook 'pretty-control-l-mode) + (add-hook 'after-make-frame-functions + '(lambda (arg) (pretty-control-l-mode))) + #+END_SRC + +* erc + + Automatically join some channels when connecting to freenode.net. + + #+BEGIN_SRC emacs-lisp :tangle init2.el + (setq erc-autojoin-channels-alist + '(("freenode.net" "#ninthfloor" "#emacs"))) + #+END_SRC + + Don't show ~PART~ messages. + + #+BEGIN_SRC emacs-lisp :tangle init2.el + (setq erc-hide-list '("PART")) + #+END_SRC + + Insert a timestamp every time a message comes in, print it on the + left and print the hour and minute parts of the time. + + #+BEGIN_SRC emacs-lisp :tangle init2.el + (setq erc-insert-timestamp-function 'erc-insert-timestamp-left) + (setq erc-timestamp-format "[%H:%M] ") + (setq erc-timestamp-only-if-changed-flag nil) + #+END_SRC + + Set my nickname. + + #+BEGIN_SRC emacs-lisp :tangle init2.el + (setq erc-nick "ryuslash") + #+END_SRC + + When starting ERC disable truncating lines, don't let ERC fill each + line and enable =visual-line-mode=. + + #+BEGIN_SRC emacs-lisp :tangle init2.el + (defun oni:erc-mode-func () + "Function for `erc-mode-hook'." + (erc-fill-mode -1) + (visual-line-mode) + (setq truncate-lines nil)) + + (add-hook 'erc-mode-hook 'oni:erc-mode-func) + #+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 -- cgit v1.2.3-54-g00ecf