legacy-dotfiles/.emacs.d/init.org

6 KiB

Emacs init

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.

  (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"))

Add my project /ryuslash/legacy-dotfiles/src/commit/99bc512747947b196ed42dd284999304052bba99/.emacs.d/yoshi-theme to custom-theme-load-path and load it.

  (add-to-list 'custom-theme-load-path "~/projects/emacs/yoshi-theme/")
  (load-theme 'yoshi t)

Remove the menu-bar, tool-bar and scroll-bar from the UI since I don't use them at all.

  (menu-bar-mode -1)
  (scroll-bar-mode -1)
  (tool-bar-mode -1)

Add any other interesting paths to load-path and, if it exists, load the loaddefs.el file from these directories.

  (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"))

Don't ask yes or no, ask y or n, I've never had an accidental y so far.

  (defalias 'yes-or-no-p 'y-or-n-p)

Use ibuffer instead of the default list-buffers because it has many more features.

  (defalias 'list-buffers 'ibuffer)

Do the same with hippie-expand and dabbrev-expand.

  (defalias 'dabbrev-expand 'hippie-expand)

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.

  (eval-after-load "eldoc" '(diminish 'eldoc-mode))

Eshell

Add unison to the list of eshell-visual-commands because it expects unbuffered input and eshell just doesn't give that.

  (eval-after-load "em-term"
    '(add-to-list 'eshell-visual-commands "unison"))

Don't let eshell highlight it's prompt, this way I can decide the colors for it myself.

  (setq eshell-highlight-prompt nil)

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

  (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 "^[#$]> ")

Don't truncate lines in eshell, wrap them.

  (defun oni:eshell-mode-func ()
    "Function for `eshell-mode-hook'."
    (setq truncate-lines nil))

  (add-hook 'eshell-mode-hook 'oni:eshell-mode-func)

Bind the f8 key to easily show eshell.

  (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)