summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Tom Willemse2013-12-30 16:54:14 +0100
committerGravatar Tom Willemse2013-12-30 16:54:14 +0100
commitb6c38b0d62100bd20c3e4249537ccfe61b8e9de1 (patch)
treeaa73b983ed7d9e766306d384fb5d7a6cdf486a4f
parent2f5e751c007fbb9722a049029c965c106f895d95 (diff)
downloademacs-b6c38b0d62100bd20c3e4249537ccfe61b8e9de1.tar.gz
emacs-b6c38b0d62100bd20c3e4249537ccfe61b8e9de1.zip
Reorder functions
-rw-r--r--.emacs.d/init.el1380
1 files changed, 687 insertions, 693 deletions
diff --git a/.emacs.d/init.el b/.emacs.d/init.el
index 6eff826..7f5c07c 100644
--- a/.emacs.d/init.el
+++ b/.emacs.d/init.el
@@ -110,8 +110,684 @@ MODE1 is enabled and vice-versa."
(defvar sql-prompt-regexp)
(defvar whitespace-style)
-;;;; defun
+;;;; Functions
+
+(defun oni:after-save-func ()
+ "Function for `after-save-hook'."
+ (executable-make-buffer-file-executable-if-script-p)
+ (let* ((dom-dir (locate-dominating-file (buffer-file-name) "Makefile"))
+ (TAGSp (not (string= "" (shell-command-to-string
+ (concat "grep \"^TAGS:\" " dom-dir "Makefile"))))))
+ (when (and dom-dir TAGSp)
+ (shell-command
+ (concat "make -C " dom-dir " TAGS >/dev/null 2>&1")))))
+
+(defun oni:appt-display-window-and-jabber (min-to-app new-time appt-msg)
+ "Send a message to my phone jabber account."
+ (jabber-send-message (car jabber-connections) "phone@ryuslash.org"
+ nil (format "%s%s (in %s minutes)"
+ new-time appt-msg min-to-app) nil)
+ (appt-disp-window min-to-app new-time appt-msg))
+
+(defun init-augment-sql-prompt ()
+ "Add the MariaDB prompt to the `sql-prompt-regexp'."
+ (if (eq sql-product 'mysql)
+ (setq sql-prompt-regexp
+ (rx (and line-start
+ (or "mysql"
+ (and "MariaDB [" (1+ nonl) "]"))
+ "> ")))))
+
+(defun oni:before-save-func ()
+ "Function for `before-save-hook'."
+ (if (eq major-mode 'html-mode)
+ (oni:replace-html-special-chars))
+ (if (not (eq major-mode 'markdown-mode))
+ (delete-trailing-whitespace)))
+
+(defun oni:c-mode-func ()
+ "Function for `c-mode-hook'."
+ (local-set-key [f9] 'compile)
+ (local-set-key "\C-j" 'oni:newline-and-indent))
+
+(defun change-number-at-point (change-func)
+ "Use CHANGE-FUNC to change the number at `point'."
+ (let ((num (number-to-string (funcall change-func (number-at-point))))
+ (bounds (bounds-of-thing-at-point 'word)))
+ (save-excursion
+ (delete-region (car bounds) (cdr bounds))
+ (insert num))))
+
+(defun oni:change-prev-case (num dir)
+ (let ((regfunc (if (eq dir 'up) 'upcase-region 'downcase-region))
+ (wordfunc (if (eq dir 'up) 'upcase-word 'downcase-word)))
+ (if (> num 1)
+ (funcall regfunc (point) (- (point) num))
+ (funcall wordfunc -1))))
+
+(defun oni:close-client-window ()
+ "Close a client's frames."
+ (interactive)
+ (server-save-buffers-kill-terminal nil))
+
+(defun oni:color-for (object)
+ "Generate a hex color by taking the first 6 characters of OBJECT's MD5 sum."
+ (format "#%s" (substring (md5 object) 0 6)))
+
+(defun oni:css-mode-func ()
+ "Function for `css-mode-hook'."
+ (local-set-key "\C-j" 'oni:newline-and-indent))
+
+(defun oni:current-dir-in-buffer-name ()
+ (let ((branch
+ (shell-command-to-string
+ "git branch --contains HEAD 2>/dev/null | sed -e '/^[^*]/d'")))
+ (rename-buffer
+ (setq eshell-buffer-name
+ (format "%s%s:%s" system-name
+ (if (not (string= branch ""))
+ (format "(%s)" (substring branch 2 -1))
+ "")
+ (oni:shorten-dir
+ (abbreviate-file-name (eshell/pwd))))))))
+
+(defun oni:current-jabber-status ()
+ "Return a string representing the current jabber status."
+ (or (and (not *jabber-connected*) "Offline")
+ (and (not (string= *jabber-current-status* ""))
+ *jabber-current-status*)
+ "Online"))
+
+(defun decrease-number-at-point ()
+ "Take the number at `point' and replace it with it decreased by 1."
+ (interactive)
+ (change-number-at-point #'1-))
+
+(defun oni:diary-display-func ()
+ "Function for `diary-display-hook'."
+ (diary-fancy-display))
+
+(defun oni:downcase-prev (num)
+ (interactive "p")
+ (oni:change-prev-case num 'down))
+
+(defun enable (functions)
+ "Set the `disabled' property for each item in FUNCTIONS to nil."
+ (mapc #'(lambda (f) (put f 'disabled nil)) functions))
+
+(defun oni:eshell-handle-url ()
+ (save-excursion
+ (goto-char eshell-last-output-start)
+ (while (re-search-forward
+ "http://[^ \n]+" eshell-last-output-end :noerror)
+ (make-button (match-beginning 0) (match-end 0)
+ 'action (lambda (button)
+ (browse-url (button-label button)))))))
+
+(defun oni-eshell-prompt ()
+ "Show a pretty shell prompt."
+ (let ((status (if (zerop eshell-last-command-status) ?+ ?-)))
+ (concat
+ (propertize (char-to-string status)
+ 'face `(:foreground ,(if (= status ?+)
+ "green"
+ "red")))
+ "> ")))
+
+(defun oni:go-mode-func ()
+ "Function for `go-mode-hook'."
+ (setq indent-tabs-mode nil)
+ (local-set-key "\C-j" 'oni:newline-and-indent))
+
+(defun oni:haskell-mode-func ()
+ "Function for `haskell-mode-hook'."
+ (turn-on-haskell-indentation))
+
+(defun increase-number-at-point ()
+ "Take the number at `point' and replace it with it increased by 1."
+ (interactive)
+ (change-number-at-point #'1+))
+
+(defun indent-defun ()
+ "Indent the current defun."
+ (interactive)
+ (save-excursion
+ (mark-defun)
+ (indent-region (region-beginning) (region-end))))
+
+(defun oni:indent-shift-left (start end &optional count)
+ "Rigidly indent region.
+Region is from START to END. Move
+COUNT number of spaces if it is non-nil otherwise use
+`tab-width'."
+ (interactive
+ (if mark-active
+ (list (region-beginning) (region-end) current-prefix-arg)
+ (list (line-beginning-position)
+ (line-end-position)
+ current-prefix-arg)))
+ (if count
+ (setq count (prefix-numeric-value count))
+ (setq count tab-width))
+ (when (> count 0)
+ (let ((deactivate-mark nil))
+ (save-excursion
+ (goto-char start)
+ (while (< (point) end)
+ (if (and (< (current-indentation) count)
+ (not (looking-at "[ \t]*$")))
+ (error "Can't shift all lines enough"))
+ (forward-line))
+ (indent-rigidly start end (- count))))))
+
+(defun oni:indent-shift-right (start end &optional count)
+ "Indent region between START and END rigidly to the right.
+If COUNT has been specified indent by that much, otherwise look at
+`tab-width'."
+ (interactive
+ (if mark-active
+ (list (region-beginning) (region-end) current-prefix-arg)
+ (list (line-beginning-position)
+ (line-end-position)
+ current-prefix-arg)))
+ (let ((deactivate-mark nil))
+ (if count
+ (setq count (prefix-numeric-value count))
+ (setq count tab-width))
+ (indent-rigidly start end count)))
+
+(defun init-eshell-C-d ()
+ "Either call `delete-char' interactively or quit."
+ (interactive)
+ (condition-case err
+ (call-interactively #'delete-char)
+ (error (if (and (eq (car err) 'end-of-buffer)
+ (looking-back eshell-prompt-regexp))
+ (kill-buffer)
+ (signal (car err) (cdr err))))))
+
+(defun oni:java-mode-func ()
+ "Function for `java-mode-hook'."
+ (local-set-key "\C-j" 'oni:newline-and-indent))
+
+(defun oni:js-mode-func ()
+ "Function for `js-mode-hook'."
+ (local-set-key "\C-j" 'oni:newline-and-indent))
+
+(defun oni:js2-mode-func ()
+ "Function for `js2-mode-hook'."
+ (oni:js-mode-func))
+
+(defun init-locally-enable-double-spaces ()
+ "Specify that two spaces end a sentence in the current buffer."
+ (setq-local sentence-end-double-space t))
+
+(defun oni:lua-mode-func()
+ "Function for `lua-mode-hook'."
+ (local-unset-key (kbd ")"))
+ (local-unset-key (kbd "]"))
+ (local-unset-key (kbd "}")))
+
+(defun init-make-readable ()
+ "Make non-programming buffers a little more readable."
+ (setq line-spacing .2))
+
+(defun oni:markdown-mode-func ()
+ "Function for `markdown-mode-hook'."
+ (setq-local whitespace-style '(face trailing)))
+
+(defun init-maybe-fci-mode ()
+ "Turn on `fci-mode' if there is a filename for the buffer."
+ (when (buffer-file-name)
+ (fci-mode)))
+
+(defun oni:mini-fix-timestamp-string (date-string)
+ "A minimal version of Xah Lee's `fix-timestamp-string'.
+Turn DATE-STRING into something else that can be worked with in
+code. Found at http://xahlee.org/emacs/elisp_parse_time.html"
+ (setq date-string (replace-regexp-in-string "Jan" "01" date-string)
+ date-string (replace-regexp-in-string "Feb" "02" date-string)
+ date-string (replace-regexp-in-string "Mar" "03" date-string)
+ date-string (replace-regexp-in-string "Apr" "04" date-string)
+ date-string (replace-regexp-in-string "May" "05" date-string)
+ date-string (replace-regexp-in-string "Jun" "06" date-string)
+ date-string (replace-regexp-in-string "Jul" "07" date-string)
+ date-string (replace-regexp-in-string "Aug" "08" date-string)
+ date-string (replace-regexp-in-string "Sep" "09" date-string)
+ date-string (replace-regexp-in-string "Oct" "10" date-string)
+ date-string (replace-regexp-in-string "Nov" "11" date-string)
+ date-string (replace-regexp-in-string "Dec" "12" date-string))
+ (string-match
+ "^\\([0-9]\\{2\\}\\)-\\([0-9]\\{2\\}\\)-\\([0-9]\\{4\\}\\)$"
+ date-string)
+ (format "%s-%s-%s"
+ (match-string 3 date-string)
+ (match-string 2 date-string)
+ (match-string 1 date-string)))
+
+(defun oni:mode-line-current-song ()
+ "Extract current song information from a path.
+
+EMMS only shows me the absolute path of a song, this function
+extracts the parts I want to know about."
+ (let ((song (emms-track-name (emms-playlist-current-selected-track))))
+ (if (string-match "\\([^/]+\\)/\\([0-9]\\{4\\}\\) - \\(.+\\)/\\([0-9]\\{2,3\\}\\) - \\(.+\\)\\..\\{3,4\\}$" song)
+ (let ((band (substring song (match-beginning 1) (match-end 1)))
+ (title (substring song (match-beginning 5) (match-end 5))))
+ (format "[%s - %s]" band title))
+ song)))
+
+(defun move-beginning-of-dwim ()
+ "Move to beginning of line either after indentation or before."
+ (interactive)
+ (let ((start (point)))
+ (back-to-indentation)
+ (if (= start (point))
+ (move-beginning-of-line 1))))
+
+(defun oni:move-end-of-dwim ()
+ "Move to end of line, either before any comments or after."
+ (interactive)
+ (let ((start (point))
+ (eolpos (line-end-position)))
+ (beginning-of-line)
+ (if (and comment-start
+ (not (looking-at (regexp-quote comment-start)))
+ (comment-search-forward eolpos t))
+ (progn
+ (search-backward-regexp (concat "[^ \t" comment-start "]"))
+ (forward-char)
+
+ (when (or (bolp)
+ (= start (point)))
+ (end-of-line)))
+ (end-of-line))))
+
+(defun oni:myepisodes-formatter (plist)
+ "Format RSS items from MyEpisodes as org tasks.
+PLIST contains all the pertinent information."
+ (let ((str (plist-get plist :title)))
+ (string-match
+ "^\\[ \\([^\]]+\\) \\]\\[ \\([^\]]+\\) \\]\\[ \\([^\]]+\\) \\]\\[ \\([^\]]+\\) \\]$"
+ str)
+ (let* ((title (match-string 1 str))
+ (episode (match-string 2 str))
+ (name (match-string 3 str))
+ (date (oni:mini-fix-timestamp-string (match-string 4 str))))
+ (format "* ACQUIRE %s %s - %s \n SCHEDULED: <%s>"
+ title episode name date))))
+
+(defun oni:newline-and-indent ()
+ "`newline-and-indent', but with a twist.
+When dealing with braces, add another line and indent that too."
+ (interactive)
+ (if (and (not (or (= (point) (point-max))
+ (= (point) (point-min))))
+ (or (and (char-equal (char-before) ?{)
+ (char-equal (char-after) ?}))
+ (and (char-equal (char-before) ?\()
+ (char-equal (char-after) ?\)))))
+ (save-excursion (newline-and-indent)))
+ (newline-and-indent))
+
+(defun oni:php-mode-func ()
+ "Function for `php-mode-hook'."
+ (local-set-key "\C-j" 'oni:newline-and-indent)
+ (c-set-offset 'arglist-intro '+)
+ (c-set-offset 'arglist-close '0)
+ (setq-local fci-rule-column 80))
+
+(defun oni:prog-mode-func ()
+ "Function for `prog-mode-hook'."
+ (setq-local comment-auto-fill-only-comments t))
+
+(defun oni:python-mode-func ()
+ "Function for `python-mode-hook'."
+ (local-set-key (kbd "C->") 'python-indent-shift-right)
+ (local-set-key (kbd "C-<") 'python-indent-shift-left)
+ (set (make-local-variable 'electric-indent-chars) nil)
+ (setq fci-rule-column 79
+ fill-column 72)
+ (setq-local whitespace-style '(tab-mark)))
+
+(defun oni:raise-ansi-term (arg)
+ "Create or show an `ansi-term' buffer."
+ (interactive "P")
+ (let ((buffer (get-buffer "*ansi-term*")))
+ (if (and buffer (not arg))
+ (switch-to-buffer buffer)
+ (ansi-term (getenv "SHELL")))))
+
+(defun 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)))
+ (started (and (boundp 'eshell-buffer-name) eshell-buffer-name
+ (buffer-live-p (get-buffer eshell-buffer-name)))))
+ (eshell)
+ (when (and hasfile (eq eshell-process-list nil))
+ (eshell/cd dir)
+ (when started
+ (eshell-reset)))))
+
+(defun oni:raise-scratch (&optional mode)
+ "Show the *scratch* buffer.
+If called with a universal argument, ask the user which mode to
+use. If MODE is not nil, open a new buffer with the name
+*MODE-scratch* and load MODE as its major mode."
+ (interactive (list (if current-prefix-arg
+ (read-string "Mode: ")
+ nil)))
+ (let* ((bname (if mode
+ (concat "*" mode "-scratch*")
+ "*scratch*"))
+ (buffer (get-buffer bname))
+ (mode-sym (intern (concat mode "-mode"))))
+
+ (unless buffer
+ (setq buffer (generate-new-buffer bname))
+ (with-current-buffer buffer
+ (when (fboundp mode-sym)
+ (funcall mode-sym))))
+
+ (select-window (display-buffer buffer))))
+
+(defun reload-buffer ()
+ "Reload current buffer."
+ (interactive)
+ (revert-buffer nil t nil))
+
+(defun oni:replace-html-special-chars ()
+ "Replace special characters with HTML escaped entities."
+ (oni:replace-occurrences "é" "&eacute;"))
+
+(defun oni:replace-occurrences (from to)
+ "Replace all occurrences of FROM with TO in the current buffer."
+ (save-excursion
+ (goto-char (point-min))
+ (while (search-forward from nil t)
+ (replace-match to))))
+
+(defun oni:request-pull ()
+ "Start a mail to request pulling from a git repository."
+ (interactive)
+ (let* ((default-directory
+ (expand-file-name
+ (or (locate-dominating-file default-directory ".git")
+ (magit-read-top-dir nil))))
+ (refs (magit-list-interesting-refs magit-uninteresting-refs))
+ (from (cdr (assoc (completing-read "From: " refs) refs)))
+ (url (read-from-minibuffer "Pull URL: "))
+ (to (symbol-name (read-from-minibuffer "Up to (HEAD): "
+ nil nil t nil "HEAD")))
+ (patchp (and current-prefix-arg (listp current-prefix-arg))))
+ (message "Requesting pull for %s from %s to %s at %s with%s patch"
+ default-directory from to url (if patchp "" "out"))
+
+ (compose-mail
+ nil (concat
+ "Requesting pull for "
+ (file-name-base (directory-file-name default-directory))))
+
+ (save-excursion
+ (goto-char (point-max))
+ (insert
+ (shell-command-to-string
+ (concat "git --git-dir='" default-directory ".git' --work-tree='"
+ default-directory "' request-pull " (when patchp "-p ")
+ from " " url " " to))))))
+
+(defun oni:scroll-down-or-prev-page (arg)
+ "Either scroll down or go to the previous page.
+
+Depending on the value of `buffer-narrowed-p'."
+ (interactive "^P")
+ (if (buffer-narrowed-p)
+ (let ((scroll-error-top-bottom nil))
+ (condition-case nil
+ (scroll-down-command arg)
+ (beginning-of-buffer
+ (narrow-to-page -1)
+ (goto-char (point-min)))))
+ (scroll-down-command arg)))
+
+(defun oni:scroll-up-or-next-page (arg)
+ "Either scroll up or go to the next page.
+
+Depending on the value of `buffer-narrowed-p'."
+ (interactive "^P")
+ (if (buffer-narrowed-p)
+ (let ((scroll-error-top-bottom nil))
+ (condition-case nil
+ (scroll-up-command arg)
+ (end-of-buffer
+ (narrow-to-page 1)
+ (goto-char (point-min)))))
+ (scroll-up-command arg)))
+
+(defun oni:self-insert-dwim ()
+ "Execute self insert, but when the region is active call self
+insert at the end of the region and at the beginning."
+ (interactive)
+ (if (region-active-p)
+ (let ((electric-pair-mode nil)
+ (beginning (region-beginning))
+ (end (region-end)))
+ (goto-char end)
+ (self-insert-command 1)
+ (save-excursion
+ (goto-char beginning)
+ (self-insert-command 1)))
+ (self-insert-command 1)))
+
+(defun set-emacs-lisp-keys ()
+ "Set some keys for `emacs-lisp-mode'."
+ (local-set-key (kbd "C-.") 'find-function))
+
+(defun init-set-emacs-lisp-symbols ()
+ "Set a few extra UTF-8 symbols for use in emacs-lisp."
+ (when (boundp 'prettify-symbols-alist)
+ (setq prettify-symbols-alist
+ (append prettify-symbols-alist
+ '(("<=" . ?≤)
+ (">=" . ?≥)
+ ("sqrt" . ?√))))))
+
+
+(defun init-set-keys-for-dired ()
+ "Set somee keybindings for `dired'."
+ (local-set-key (kbd "E") #'wdired-change-to-wdired-mode))
+
+(defun init-set-keys-for-eshell ()
+ "Set some keybindings for `eshell'."
+ (local-set-key (kbd "C-d") #'init-eshell-C-d))
+
+(defun init-set-keys-for-hy ()
+ "Set some keybindings for `hy-mode'."
+ (local-set-key (kbd "{") #'paredit-open-curly)
+ (local-set-key (kbd "}") #'paredit-close-curly))
+
+(defun init-set-keys-for-jabber-chat ()
+ "Set certain keys for `jabber-chat-mode'."
+ (local-set-key (kbd "M-!") #'shell-command-with-command))
+
+(defun init-set-keys-for-tagedit ()
+ "Set some keybindings for `tagedit-mode'."
+ (local-set-key (kbd "M-k") #'tagedit-kill-attribute))
+
+(defun init-set-python-imenu-function ()
+ "Set the `imenu-create-index-function' variable.
+
+For `python-mode' I prefer `python-imenu-create-flat-index'."
+ (setq imenu-create-index-function #'python-imenu-create-flat-index))
+
+(defun init-set-python-symbols ()
+ "Set a few extra UTF-8 symbols for use in python."
+ (when (boundp 'prettify-symbols-alist)
+ (setq prettify-symbols-alist
+ '(("lambda" . ?λ)
+ ("<=" . ?≤)
+ (">=" . ?≥)
+ ("!=" . ?≠)))))
+
+(defun set-smartparens-keys ()
+ "Set some keys for `smartparens-mode'."
+ (local-set-key [remap backward-delete-char] 'sp-backward-delete-char)
+ (local-set-key [remap delete-char] 'sp-delete-char)
+ (local-set-key [remap kill-word] 'sp-kill-word)
+ (local-set-key [remap backward-kill-word] 'sp-backward-kill-word)
+ (local-set-key (kbd "<C-left>") 'sp-forward-barf-sexp)
+ (local-set-key (kbd "<C-right>") 'sp-forward-slurp-sexp)
+ (local-set-key (kbd "M-J") 'sp-join-sexp)
+ (local-set-key (kbd "M-S") 'sp-split-sexp))
+
+(defun init-set-tab-maybe-toggle-outline ()
+ "Wrap the current function mapped to `TAB'."
+ (let ((func (or (lookup-key (current-local-map) (kbd "TAB"))
+ (lookup-key (current-global-map) (kbd "TAB")))))
+ (local-set-key (kbd "TAB")
+ (lambda ()
+ (interactive)
+ (if (outline-on-heading-p)
+ (if (outline-invisible-p (line-end-position))
+ (show-entry)
+ (hide-entry))
+ (call-interactively func))))))
+
+(let ((theme (if (equal system-name "drd") 'yoshi 'leuven)))
+ (let ((setp (not (daemonp))))
+ (defun init-set-theme (frame)
+ "Try to set the theme for the current (first) frame."
+ (ignore frame)
+ (unless setp
+ (run-at-time .1 nil (lambda () (setq setp (load-theme theme t)))))))
+
+ (if (daemonp)
+ (add-hook 'after-make-frame-functions #'init-set-theme)
+ (eval-after-init (load-theme theme t))))
+
+(defun shell-command-with-command (command &optional output-buffer)
+ "Print both COMMAND and the output into OUTPUT-BUFFER."
+ (interactive (list (read-shell-command "Shell command: " nil nil)
+ current-prefix-arg))
+ (when output-buffer
+ (insert "`" command "':\n"))
+ (shell-command command output-buffer))
+
+(defun oni:shorten-dir (dir)
+ "Shorten a directory, (almost) like fish does it."
+ (while (string-match "\\(\\.?[^./]\\)[^/]+/" dir)
+ (setq dir (replace-match "\\1/" nil nil dir)))
+ dir)
+
+(defun oni:show-buffer-position ()
+ "Show the position in the current buffer."
+ (interactive)
+ (message (format "%d:%d" (line-number-at-pos) (current-column))))
+
+(defun oni:show-org-index ()
+ "Show the index of my org files."
+ (interactive)
+ (find-file "~/documents/org/index.org"))
+
+(defun sort-imports ()
+ "Sort python multiline imports using `()'."
+ (interactive)
+ (save-excursion
+ (sort-lines nil (1+ (search-backward "("))
+ (1- (search-forward ")")))))
+
+(defun oni:split-window-interactive (dir)
+ "Split windows in direction DIR.
+
+Can also delete or switch to another window."
+ (interactive
+ (list (read-char "Direction (h,v,q,d,o): ")))
+ (case dir
+ ((?v) (split-window-vertically))
+ ((?h) (split-window-horizontally))
+ ((?q) (delete-other-windows))
+ ((?d) (delete-window))
+ ((?o) (other-window 1))))
+
+(defun oni:split-window-interactively (window)
+ "Ask for a direction and split WINDOW that way.
+
+If no direction is given, don't split."
+ (let ((dir (read-char "Direction (h,v): ")))
+ (case dir
+ ((?v) (split-window-vertically))
+ ((?h) (split-window-horizontally))
+ (t window))))
+
+(defun oni:start-python-test-mail-server ()
+ "Run the python test mailserver."
+ (interactive)
+ (start-process "python-test-mail-server" "*py-mail-server*" "python" "-m"
+ "smtpd" "-n" "-c" "DebuggingServer" "localhost:1025"))
+
+(defun oni:stop-python-test-mail-server ()
+ "Stop the python test mailserver."
+ (interactive)
+ (kill-process "python-test-mail-server"))
+
+(defun stumpwm-command (cmd)
+ "Execute CMD in stumpwm."
+ (call-process init-stumpish-program nil nil nil cmd))
+
+(defun init-switch-to-other-buffer ()
+ "Switch to the most recently viewed buffer."
+ (interactive)
+ (switch-to-buffer (other-buffer)))
+
+(defun oni:term-mode-func ()
+ "Function for `term-mode-hook'."
+ (setq truncate-lines nil))
+
+(defun turn-on-compilation-shell-for-pony ()
+ "Turn on option `compilation-shell-minor-mode' for `pony-minor-mode'."
+ (add-hook 'pony-minor-mode-hook 'compilation-shell-minor-mode nil t))
+
+(defun oni:upcase-prev (num)
+ (interactive "p")
+ (oni:change-prev-case num 'up))
+
+(defun oni:vala-mode-func ()
+ "Function for `vala-mode-hook'."
+ (setq indent-tabs-mode nil))
+
+(defun oni:write-file-func ()
+ "Function for `write-file-hooks'."
+ (time-stamp))
+
+(defun oni:yas-minor-mode-func ()
+ "Function for `yas-minor-mode-hook'."
+ (define-key yas-minor-mode-map (kbd "TAB") nil)
+ (define-key yas-minor-mode-map [(tab)] nil)
+ (define-key yas-minor-mode-map (kbd "C-\\") 'yas-expand))
+
+;;;; Macro support
+
(eval-and-compile
+ (defun add-hooks (hooks function &optional append local)
+ "`add-hook' for each in HOOKS."
+ (mapcar (lambda (h)
+ `(add-hook (quote ,h) ,function ,append ,local))
+ hooks))
+
+ (defun add-mode-hooks (modes function &optional append local)
+ "`add-hooks' with MODES renamed to mode-mode-hook."
+ (let ((mode-names (mapcar #'make-mode-hook-name modes)))
+ (add-hooks mode-names function append local)))
+
+ (defun level (lst)
+ (let ((lsts (mapcar (lambda (l) (if (listp l) l (list l))) lst)))
+ (apply #'append lsts)))
+
(defun loadpath-add-and-autoload (path)
"Add PATH to `load-path' and load a `loaddefs.el' if it exists."
(add-to-list 'load-path path)
@@ -119,12 +795,9 @@ MODE1 is enabled and vice-versa."
(when (file-exists-p loaddefs)
(load loaddefs))))
- (mapc #'loadpath-add-and-autoload
- '("~/.emacs.d/site-lisp" "~/projects/emacs/pony-mode/src"
- "~/.emacs.d/vendor-lisp/org/lisp"
- "~/.emacs.d/vendor-lisp/org/contrib/lisp"
- "~/.emacs.d/vendor-lisp/mozrepl"
- "~/.emacs.d/vendor-lisp/eap" "/usr/share/emacs/site-lisp")))
+ (defun make-mode-hook-name (mode)
+ "Get the hook name for MODE."
+ (intern (concat (symbol-name mode) "-mode-hook"))))
;;;; aliases
@@ -147,18 +820,6 @@ MODE1 is enabled and vice-versa."
(turn-off menu-bar-mode scroll-bar-mode tool-bar-mode blink-cursor-mode
column-number-mode line-number-mode tooltip-mode)
-(let ((theme (if (equal system-name "drd") 'yoshi 'leuven)))
- (let ((setp (not (daemonp))))
- (defun init-set-theme (frame)
- "Try to set the theme for the current (first) frame."
- (ignore frame)
- (unless setp
- (run-at-time .1 nil (lambda () (setq setp (load-theme theme t)))))))
-
- (if (daemonp)
- (add-hook 'after-make-frame-functions #'init-set-theme)
- (eval-after-init (load-theme theme t))))
-
;;;; eww
(stante-after eww
@@ -167,34 +828,19 @@ MODE1 is enabled and vice-versa."
;;;; Typography
-(defun init-locally-enable-double-spaces ()
- "Specify that two spaces end a sentence in the current buffer."
- (setq-local sentence-end-double-space t))
-
;; Use double spaces to end lines in Emacs Lisp. The checkdoc
;; function starts complaining if you don't.
(add-hook 'emacs-lisp-mode-hook #'init-locally-enable-double-spaces)
;;;; Symbols
-(defun init-set-emacs-lisp-symbols ()
- "Set a few extra UTF-8 symbols for use in emacs-lisp."
- (when (boundp 'prettify-symbols-alist)
- (setq prettify-symbols-alist
- (append prettify-symbols-alist
- '(("<=" . ?≤)
- (">=" . ?≥)
- ("sqrt" . ?√))))))
-
-
-(defun init-set-python-symbols ()
- "Set a few extra UTF-8 symbols for use in python."
- (when (boundp 'prettify-symbols-alist)
- (setq prettify-symbols-alist
- '(("lambda" . ?λ)
- ("<=" . ?≤)
- (">=" . ?≥)
- ("!=" . ?≠)))))
+(eval-and-compile
+ (mapc #'loadpath-add-and-autoload
+ '("~/.emacs.d/site-lisp" "~/projects/emacs/pony-mode/src"
+ "~/.emacs.d/vendor-lisp/org/lisp"
+ "~/.emacs.d/vendor-lisp/org/contrib/lisp"
+ "~/.emacs.d/vendor-lisp/mozrepl"
+ "~/.emacs.d/vendor-lisp/eap" "/usr/share/emacs/site-lisp")))
(add-hook 'emacs-lisp-mode-hook #'init-set-emacs-lisp-symbols)
(add-hook 'lisp-mode-hook #'init-set-emacs-lisp-symbols)
@@ -215,20 +861,9 @@ MODE1 is enabled and vice-versa."
:size 12.4
:weight 'normal))
-(defun sort-imports ()
- "Sort python multiline imports using `()'."
- (interactive)
- (save-excursion
- (sort-lines nil (1+ (search-backward "("))
- (1- (search-forward ")")))))
-
(stante-after simple
(define-key special-mode-map "z" #'kill-this-buffer))
-(defun stumpwm-command (cmd)
- "Execute CMD in stumpwm."
- (call-process init-stumpish-program nil nil nil cmd))
-
(defadvice windmove-do-window-select
(around init-windmove-stumpwm activate)
"If no window can be moved to, move stumpwm."
@@ -250,11 +885,6 @@ MODE1 is enabled and vice-versa."
(add-hook 'js2-mode-hook #'tern-mode)
-(defun init-switch-to-other-buffer ()
- "Switch to the most recently viewed buffer."
- (interactive)
- (switch-to-buffer (other-buffer)))
-
(global-set-key (kbd "C-. C-.") #'init-switch-to-other-buffer)
(stante-after woman
@@ -265,24 +895,6 @@ MODE1 is enabled and vice-versa."
(autoload 'moz-minor-mode "moz" nil t)
(add-hook 'javascript-mode-hook 'moz-minor-mode)
-(defun change-number-at-point (change-func)
- "Use CHANGE-FUNC to change the number at `point'."
- (let ((num (number-to-string (funcall change-func (number-at-point))))
- (bounds (bounds-of-thing-at-point 'word)))
- (save-excursion
- (delete-region (car bounds) (cdr bounds))
- (insert num))))
-
-(defun decrease-number-at-point ()
- "Take the number at `point' and replace it with it decreased by 1."
- (interactive)
- (change-number-at-point #'1-))
-
-(defun increase-number-at-point ()
- "Take the number at `point' and replace it with it increased by 1."
- (interactive)
- (change-number-at-point #'1+))
-
(global-set-key (kbd "C-c -") #'decrease-number-at-point)
(global-set-key (kbd "C-c +") #'increase-number-at-point)
@@ -311,152 +923,6 @@ MODE1 is enabled and vice-versa."
"Kill the term buffer if the process finished."
(kill-buffer (current-buffer)))
-(defun init-augment-sql-prompt ()
- "Add the MariaDB prompt to the `sql-pomrpt-regexp'."
- (if (eq sql-product 'mysql)
- (setq sql-prompt-regexp
- (rx (and line-start
- (or "mysql"
- (and "MariaDB [" (1+ nonl) "]"))
- "> ")))))
-
-(defun init-eshell-C-d ()
- "Either call `delete-char' interactively or quit."
- (interactive)
- (condition-case err
- (call-interactively #'delete-char)
- (error (if (and (eq (car err) 'end-of-buffer)
- (looking-back eshell-prompt-regexp))
- (kill-buffer)
- (signal (car err) (cdr err))))))
-
-(defun init-make-readable ()
- "Make non-programming buffers a little more readable."
- (setq line-spacing .2))
-
-(defun init-maybe-fci-mode ()
- "Turn on `fci-mode' if there is a filename for the buffer."
- (when (buffer-file-name)
- (fci-mode)))
-
-(defun init-set-keys-for-dired ()
- "Set somee keybindings for `dired'."
- (local-set-key (kbd "E") #'wdired-change-to-wdired-mode))
-
-(defun init-set-keys-for-eshell ()
- "Set some keybindings for `eshell'."
- (local-set-key (kbd "C-d") #'init-eshell-C-d))
-
-(defun init-set-keys-for-hy ()
- "Set some keybindings for `hy-mode'."
- (local-set-key (kbd "{") #'paredit-open-curly)
- (local-set-key (kbd "}") #'paredit-close-curly))
-
-(defun init-set-keys-for-tagedit ()
- "Set some keybindings for `tagedit-mode'."
- (local-set-key (kbd "M-k") #'tagedit-kill-attribute))
-
-(defun init-set-python-imenu-function ()
- "Set the `imenu-create-index-function' variable.
-
-For `python-mode' I prefer `python-imenu-create-flat-index'."
- (setq imenu-create-index-function #'python-imenu-create-flat-index))
-
-(eval-and-compile
- (defun add-hooks (hooks function &optional append local)
- "`add-hook' for each in HOOKS."
- (mapcar (lambda (h)
- `(add-hook (quote ,h) ,function ,append ,local))
- hooks))
-
- (defun add-mode-hooks (modes function &optional append local)
- "`add-hooks' with MODES renamed to mode-mode-hook."
- (let ((mode-names (mapcar #'make-mode-hook-name modes)))
- (add-hooks mode-names function append local))))
-
-(defun enable (functions)
- "Set the `disabled' property for each item in FUNCTIONS to nil."
- (mapc #'(lambda (f) (put f 'disabled nil)) functions))
-
-(defun hostname ()
- "Get the current machine's hostname."
- (substring (shell-command-to-string "hostname") 0 -1))
-
-(defun indent-defun ()
- "Indent the current defun."
- (interactive)
- (save-excursion
- (mark-defun)
- (indent-region (region-beginning) (region-end))))
-
-(eval-and-compile
- (defun level (lst)
- (let ((lsts (mapcar (lambda (l) (if (listp l) l (list l))) lst)))
- (apply #'append lsts))))
-
-(eval-and-compile
- (defun make-mode-hook-name (mode)
- "Get the hook name for MODE."
- (intern (concat (symbol-name mode) "-mode-hook"))))
-
-(defun move-beginning-of-dwim ()
- "Move to beginning of line either after indentation or before."
- (interactive)
- (let ((start (point)))
- (back-to-indentation)
- (if (= start (point))
- (move-beginning-of-line 1))))
-
-(defun oni-eshell-prompt ()
- "Show a pretty shell prompt."
- (let ((status (if (zerop eshell-last-command-status) ?+ ?-)))
- (concat
- (propertize (char-to-string status)
- 'face `(:foreground ,(if (= status ?+)
- "green"
- "red")))
- "> ")))
-
-(defun 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)))
- (started (and (boundp 'eshell-buffer-name) eshell-buffer-name
- (buffer-live-p (get-buffer eshell-buffer-name)))))
- (eshell)
- (when (and hasfile (eq eshell-process-list nil))
- (eshell/cd dir)
- (when started
- (eshell-reset)))))
-
-(defun reload-buffer ()
- "Reload current buffer."
- (interactive)
- (revert-buffer nil t nil))
-
-(defun set-emacs-lisp-keys ()
- "Set some keys for `emacs-lisp-mode'."
- (local-set-key (kbd "C-.") 'find-function))
-
-(defun set-smartparens-keys ()
- "Set some keys for `smartparens-mode'."
- (local-set-key [remap backward-delete-char] 'sp-backward-delete-char)
- (local-set-key [remap delete-char] 'sp-delete-char)
- (local-set-key [remap kill-word] 'sp-kill-word)
- (local-set-key [remap backward-kill-word] 'sp-backward-kill-word)
- (local-set-key (kbd "<C-left>") 'sp-forward-barf-sexp)
- (local-set-key (kbd "<C-right>") 'sp-forward-slurp-sexp)
- (local-set-key (kbd "M-J") 'sp-join-sexp)
- (local-set-key (kbd "M-S") 'sp-split-sexp))
-
-(defun turn-on-compilation-shell-for-pony ()
- "Turn on option `compilation-shell-minor-mode' for `pony-minor-mode'."
- (add-hook 'pony-minor-mode-hook 'compilation-shell-minor-mode nil t))
-
(stante-after appt
(setq appt-disp-window-function #'oni:appt-display-window-and-jabber)
(setq appt-display-diary nil))
@@ -906,437 +1372,12 @@ Also change directories to current working directory."
(help-at-pt-set-timer)
(windmove-default-keybindings)
-(defun oni:scroll-down-or-prev-page (arg)
- "Either scroll down or go to the previous page.
-
-Depending on the value of `buffer-narrowed-p'."
- (interactive "^P")
- (if (buffer-narrowed-p)
- (let ((scroll-error-top-bottom nil))
- (condition-case nil
- (scroll-down-command arg)
- (beginning-of-buffer
- (narrow-to-page -1)
- (goto-char (point-min)))))
- (scroll-down-command arg)))
-
-(defun oni:scroll-up-or-next-page (arg)
- "Either scroll up or go to the next page.
-
-Depending on the value of `buffer-narrowed-p'."
- (interactive "^P")
- (if (buffer-narrowed-p)
- (let ((scroll-error-top-bottom nil))
- (condition-case nil
- (scroll-up-command arg)
- (end-of-buffer
- (narrow-to-page 1)
- (goto-char (point-min)))))
- (scroll-up-command arg)))
-
(global-set-key (kbd "<prior>") 'oni:scroll-down-or-prev-page)
(global-set-key (kbd "<next>") 'oni:scroll-up-or-next-page)
;;; Finally, load any `customize' settings.
(load custom-file)
-
-(defun oni:after-save-func ()
- "Function for `after-save-hook'."
- (executable-make-buffer-file-executable-if-script-p)
- (let* ((dom-dir (locate-dominating-file (buffer-file-name) "Makefile"))
- (TAGSp (not (string= "" (shell-command-to-string
- (concat "grep \"^TAGS:\" " dom-dir "Makefile"))))))
- (when (and dom-dir TAGSp)
- (shell-command
- (concat "make -C " dom-dir " TAGS >/dev/null 2>&1")))))
-
-(defun oni:appt-display-window-and-jabber (min-to-app new-time appt-msg)
- "Send a message to my phone jabber account."
- (jabber-send-message (car jabber-connections) "phone@ryuslash.org"
- nil (format "%s%s (in %s minutes)"
- new-time appt-msg min-to-app) nil)
- (appt-disp-window min-to-app new-time appt-msg))
-;; (jabber-send-message (car jabber-connections)
-;; "aethon@muc.ryuslash.org" nil "Hi, I'm a programmatic message; this
-;; upens up possibilities :)" "groupchat")
-(defun oni:before-save-func ()
- "Function for `before-save-hook'."
- (if (eq major-mode 'html-mode)
- (oni:replace-html-special-chars))
- (if (not (eq major-mode 'markdown-mode))
- (delete-trailing-whitespace)))
-
-(defun oni:c-mode-func ()
- "Function for `c-mode-hook'."
- (local-set-key [f9] 'compile)
- (local-set-key "\C-j" 'oni:newline-and-indent))
-
-(defun oni:change-prev-case (num dir)
- (let ((regfunc (if (eq dir 'up) 'upcase-region 'downcase-region))
- (wordfunc (if (eq dir 'up) 'upcase-word 'downcase-word)))
- (if (> num 1)
- (funcall regfunc (point) (- (point) num))
- (funcall wordfunc -1))))
-
-(defun oni:close-client-window ()
- "Close a client's frames."
- (interactive)
- (server-save-buffers-kill-terminal nil))
-
-(defun oni:color-for (object)
- "Generate a hex color by taking the first 6 characters of OBJECT's MD5 sum."
- (format "#%s" (substring (md5 object) 0 6)))
-
-(defun oni:css-mode-func ()
- "Function for `css-mode-hook'."
- (local-set-key "\C-j" 'oni:newline-and-indent))
-
-(defun oni:current-jabber-status ()
- "Return a string representing the current jabber status."
- (or (and (not *jabber-connected*) "Offline")
- (and (not (string= *jabber-current-status* ""))
- *jabber-current-status*)
- "Online"))
-
-(defun oni:diary-display-func ()
- "Function for `diary-display-hook'."
- (diary-fancy-display))
-
-(defun oni:downcase-prev (num)
- (interactive "p")
- (oni:change-prev-case num 'down))
-
-(defun oni:go-mode-func ()
- "Function for `go-mode-hook'."
- (setq indent-tabs-mode nil)
- (local-set-key "\C-j" 'oni:newline-and-indent))
-
-(defun oni:haskell-mode-func ()
- "Function for `haskell-mode-hook'."
- (turn-on-haskell-indentation))
-
-(defun oni:indent-shift-left (start end &optional count)
- "Rigidly indent region.
-Region is from START to END. Move
-COUNT number of spaces if it is non-nil otherwise use
-`tab-width'."
- (interactive
- (if mark-active
- (list (region-beginning) (region-end) current-prefix-arg)
- (list (line-beginning-position)
- (line-end-position)
- current-prefix-arg)))
- (if count
- (setq count (prefix-numeric-value count))
- (setq count tab-width))
- (when (> count 0)
- (let ((deactivate-mark nil))
- (save-excursion
- (goto-char start)
- (while (< (point) end)
- (if (and (< (current-indentation) count)
- (not (looking-at "[ \t]*$")))
- (error "Can't shift all lines enough"))
- (forward-line))
- (indent-rigidly start end (- count))))))
-
-(defun oni:indent-shift-right (start end &optional count)
- "Indent region between START and END rigidly to the right.
-If COUNT has been specified indent by that much, otherwise look at
-`tab-width'."
- (interactive
- (if mark-active
- (list (region-beginning) (region-end) current-prefix-arg)
- (list (line-beginning-position)
- (line-end-position)
- current-prefix-arg)))
- (let ((deactivate-mark nil))
- (if count
- (setq count (prefix-numeric-value count))
- (setq count tab-width))
- (indent-rigidly start end count)))
-
-(defun oni:java-mode-func ()
- "Function for `java-mode-hook'."
- (local-set-key "\C-j" 'oni:newline-and-indent))
-
-(defun oni:js-mode-func ()
- "Function for `js-mode-hook'."
- (local-set-key "\C-j" 'oni:newline-and-indent))
-
-(defun oni:js2-mode-func ()
- "Function for `js2-mode-hook'."
- (oni:js-mode-func))
-
-(defun oni:lua-mode-func()
- "Function for `lua-mode-hook'."
- (local-unset-key (kbd ")"))
- (local-unset-key (kbd "]"))
- (local-unset-key (kbd "}")))
-
-(defun oni:markdown-mode-func ()
- "Function for `markdown-mode-hook'."
- (setq-local whitespace-style '(face trailing)))
-
-(defun oni:mini-fix-timestamp-string (date-string)
- "A minimal version of Xah Lee's `fix-timestamp-string'.
-Turn DATE-STRING into something else that can be worked with in
-code. Found at http://xahlee.org/emacs/elisp_parse_time.html"
- (setq date-string (replace-regexp-in-string "Jan" "01" date-string)
- date-string (replace-regexp-in-string "Feb" "02" date-string)
- date-string (replace-regexp-in-string "Mar" "03" date-string)
- date-string (replace-regexp-in-string "Apr" "04" date-string)
- date-string (replace-regexp-in-string "May" "05" date-string)
- date-string (replace-regexp-in-string "Jun" "06" date-string)
- date-string (replace-regexp-in-string "Jul" "07" date-string)
- date-string (replace-regexp-in-string "Aug" "08" date-string)
- date-string (replace-regexp-in-string "Sep" "09" date-string)
- date-string (replace-regexp-in-string "Oct" "10" date-string)
- date-string (replace-regexp-in-string "Nov" "11" date-string)
- date-string (replace-regexp-in-string "Dec" "12" date-string))
- (string-match
- "^\\([0-9]\\{2\\}\\)-\\([0-9]\\{2\\}\\)-\\([0-9]\\{4\\}\\)$"
- date-string)
- (format "%s-%s-%s"
- (match-string 3 date-string)
- (match-string 2 date-string)
- (match-string 1 date-string)))
-
-(defun oni:mode-line-current-song ()
- "Extract current song information from a path.
-
-EMMS only shows me the absolute path of a song, this function
-extracts the parts I want to know about."
- (let ((song (emms-track-name (emms-playlist-current-selected-track))))
- (if (string-match "\\([^/]+\\)/\\([0-9]\\{4\\}\\) - \\(.+\\)/\\([0-9]\\{2,3\\}\\) - \\(.+\\)\\..\\{3,4\\}$" song)
- (let ((band (substring song (match-beginning 1) (match-end 1)))
- (title (substring song (match-beginning 5) (match-end 5))))
- (format "[%s - %s]" band title))
- song)))
-
-(defun oni:move-end-of-dwim ()
- "Move to end of line, either before any comments or after."
- (interactive)
- (let ((start (point))
- (eolpos (line-end-position)))
- (beginning-of-line)
- (if (and comment-start
- (not (looking-at (regexp-quote comment-start)))
- (comment-search-forward eolpos t))
- (progn
- (search-backward-regexp (concat "[^ \t" comment-start "]"))
- (forward-char)
-
- (when (or (bolp)
- (= start (point)))
- (end-of-line)))
- (end-of-line))))
-
-(defun oni:myepisodes-formatter (plist)
- "Format RSS items from MyEpisodes as org tasks.
-PLIST contains all the pertinent information."
- (let ((str (plist-get plist :title)))
- (string-match
- "^\\[ \\([^\]]+\\) \\]\\[ \\([^\]]+\\) \\]\\[ \\([^\]]+\\) \\]\\[ \\([^\]]+\\) \\]$"
- str)
- (let* ((title (match-string 1 str))
- (episode (match-string 2 str))
- (name (match-string 3 str))
- (date (oni:mini-fix-timestamp-string (match-string 4 str))))
- (format "* ACQUIRE %s %s - %s \n SCHEDULED: <%s>"
- title episode name date))))
-
-(defun oni:newline-and-indent ()
- "`newline-and-indent', but with a twist.
-When dealing with braces, add another line and indent that too."
- (interactive)
- (if (and (not (or (= (point) (point-max))
- (= (point) (point-min))))
- (or (and (char-equal (char-before) ?{)
- (char-equal (char-after) ?}))
- (and (char-equal (char-before) ?\()
- (char-equal (char-after) ?\)))))
- (save-excursion (newline-and-indent)))
- (newline-and-indent))
-
-(defun oni:php-mode-func ()
- "Function for `php-mode-hook'."
- (local-set-key "\C-j" 'oni:newline-and-indent)
- (c-set-offset 'arglist-intro '+)
- (c-set-offset 'arglist-close '0)
- (setq-local fci-rule-column 80))
-
-(defun oni:prog-mode-func ()
- "Function for `prog-mode-hook'."
- (setq-local comment-auto-fill-only-comments t))
-
-(defun oni:python-mode-func ()
- "Function for `python-mode-hook'."
- (local-set-key (kbd "C->") 'python-indent-shift-right)
- (local-set-key (kbd "C-<") 'python-indent-shift-left)
- (set (make-local-variable 'electric-indent-chars) nil)
- (setq fci-rule-column 79
- fill-column 72)
- (setq-local whitespace-style '(tab-mark)))
-
-(defun oni:raise-ansi-term (arg)
- "Create or show an `ansi-term' buffer."
- (interactive "P")
- (let ((buffer (get-buffer "*ansi-term*")))
- (if (and buffer (not arg))
- (switch-to-buffer buffer)
- (ansi-term (getenv "SHELL")))))
-
-(defun oni:raise-scratch (&optional mode)
- "Show the *scratch* buffer.
-If called with a universal argument, ask the user which mode to
-use. If MODE is not nil, open a new buffer with the name
-*MODE-scratch* and load MODE as its major mode."
- (interactive (list (if current-prefix-arg
- (read-string "Mode: ")
- nil)))
- (let* ((bname (if mode
- (concat "*" mode "-scratch*")
- "*scratch*"))
- (buffer (get-buffer bname))
- (mode-sym (intern (concat mode "-mode"))))
-
- (unless buffer
- (setq buffer (generate-new-buffer bname))
- (with-current-buffer buffer
- (when (fboundp mode-sym)
- (funcall mode-sym))))
-
- (select-window (display-buffer buffer))))
-
-(defun oni:replace-html-special-chars ()
- "Replace special characters with HTML escaped entities."
- (oni:replace-occurrences "é" "&eacute;"))
-
-(defun oni:replace-occurrences (from to)
- "Replace all occurrences of FROM with TO in the current buffer."
- (save-excursion
- (goto-char (point-min))
- (while (search-forward from nil t)
- (replace-match to))))
-
-(defun oni:request-pull ()
- "Start a mail to request pulling from a git repository."
- (interactive)
- (let* ((default-directory
- (expand-file-name
- (or (locate-dominating-file default-directory ".git")
- (magit-read-top-dir nil))))
- (refs (magit-list-interesting-refs magit-uninteresting-refs))
- (from (cdr (assoc (completing-read "From: " refs) refs)))
- (url (read-from-minibuffer "Pull URL: "))
- (to (symbol-name (read-from-minibuffer "Up to (HEAD): "
- nil nil t nil "HEAD")))
- (patchp (and current-prefix-arg (listp current-prefix-arg))))
- (message "Requesting pull for %s from %s to %s at %s with%s patch"
- default-directory from to url (if patchp "" "out"))
-
- (compose-mail
- nil (concat
- "Requesting pull for "
- (file-name-base (directory-file-name default-directory))))
-
- (save-excursion
- (goto-char (point-max))
- (insert
- (shell-command-to-string
- (concat "git --git-dir='" default-directory ".git' --work-tree='"
- default-directory "' request-pull " (when patchp "-p ")
- from " " url " " to))))))
-
-(defun oni:self-insert-dwim ()
- "Execute self insert, but when the region is active call self
-insert at the end of the region and at the beginning."
- (interactive)
- (if (region-active-p)
- (let ((electric-pair-mode nil)
- (beginning (region-beginning))
- (end (region-end)))
- (goto-char end)
- (self-insert-command 1)
- (save-excursion
- (goto-char beginning)
- (self-insert-command 1)))
- (self-insert-command 1)))
-
-(defun oni:shorten-dir (dir)
- "Shorten a directory, (almost) like fish does it."
- (while (string-match "\\(/\\.?[^./]\\)[^/]+/" dir)
- (setq dir (replace-match "\\1/" nil nil dir)))
- dir)
-
-(defun oni:show-buffer-position ()
- "Show the position in the current buffer."
- (interactive)
- (message (format "%d:%d" (line-number-at-pos) (current-column))))
-
-(defun oni:show-org-index ()
- "Show the index of my org files."
- (interactive)
- (find-file "~/documents/org/index.org"))
-
-(defun oni:split-window-interactive (dir)
- "Split windows in direction DIR.
-
-Can also delete or switch to another window."
- (interactive
- (list (read-char "Direction (h,v,q,d,o): ")))
- (case dir
- ((?v) (split-window-vertically))
- ((?h) (split-window-horizontally))
- ((?q) (delete-other-windows))
- ((?d) (delete-window))
- ((?o) (other-window 1))))
-
-(defun oni:split-window-interactively (window)
- "Ask for a direction and split WINDOW that way.
-
-If no direction is given, don't split."
- (let ((dir (read-char "Direction (h,v): ")))
- (case dir
- ((?v) (split-window-vertically))
- ((?h) (split-window-horizontally))
- (t window))))
-
-(defun oni:start-python-test-mail-server ()
- "Run the python test mailserver."
- (interactive)
- (start-process "python-test-mail-server" "*py-mail-server*" "python" "-m"
- "smtpd" "-n" "-c" "DebuggingServer" "localhost:1025"))
-
-(defun oni:stop-python-test-mail-server ()
- "Stop the python test mailserver."
- (interactive)
- (kill-process "python-test-mail-server"))
-
-(defun oni:term-mode-func ()
- "Function for `term-mode-hook'."
- (setq truncate-lines nil))
-
-(defun oni:upcase-prev (num)
- (interactive "p")
- (oni:change-prev-case num 'up))
-
-(defun oni:vala-mode-func ()
- "Function for `vala-mode-hook'."
- (setq indent-tabs-mode nil))
-
-(defun oni:write-file-func ()
- "Function for `write-file-hooks'."
- (time-stamp))
-
-(defun oni:yas-minor-mode-func ()
- "Function for `yas-minor-mode-hook'."
- (define-key yas-minor-mode-map (kbd "TAB") nil)
- (define-key yas-minor-mode-map [(tab)] nil)
- (define-key yas-minor-mode-map (kbd "C-\\") 'yas-expand))
-
;;;; Connected modes
(link-modes outline-minor-mode persistent-outline-mode)
@@ -1344,64 +1385,17 @@ If no direction is given, don't split."
;;;; Make toggling outlines easier
-(defun init-set-tab-maybe-toggle-outline ()
- "Wrap the current function mapped to `TAB'."
- (let ((func (or (lookup-key (current-local-map) (kbd "TAB"))
- (lookup-key (current-global-map) (kbd "TAB")))))
- (local-set-key (kbd "TAB")
- (lambda ()
- (interactive)
- (if (outline-on-heading-p)
- (if (outline-invisible-p (line-end-position))
- (show-entry)
- (hide-entry))
- (call-interactively func))))))
-
(add-hook 'outline-minor-mode-hook #'init-set-tab-maybe-toggle-outline)
;;;; Share the output AND the command
-(defun shell-command-with-command (command &optional output-buffer)
- "Print both COMMAND and the output into OUTPUT-BUFFER."
- (interactive (list (read-shell-command "Shell command: " nil nil)
- current-prefix-arg))
- (when output-buffer
- (insert "`" command "':\n"))
- (shell-command command output-buffer))
-
-(defun init-set-keys-for-jabber-chat ()
- "Set certain keys for `jabber-chat-mode'."
- (local-set-key (kbd "M-!") #'shell-command-with-command))
-
(add-hook 'jabber-chat-mode-hook #'init-set-keys-for-jabber-chat)
(electric-indent-mode -1)
-(defun oni:eshell-handle-url ()
- (save-excursion
- (goto-char eshell-last-output-start)
- (while (re-search-forward
- "http://[^ \n]+" eshell-last-output-end :noerror)
- (make-button (match-beginning 0) (match-end 0)
- 'action (lambda (button)
- (browse-url (button-label button)))))))
-
(stante-after esh-mode
(add-to-list 'eshell-output-filter-functions #'oni:eshell-handle-url))
-(defun oni:current-dir-in-buffer-name ()
- (let ((branch
- (shell-command-to-string
- "git branch --contains HEAD 2>/dev/null | sed -e '/^[^*]/d'")))
- (rename-buffer
- (setq eshell-buffer-name
- (format "%s%s:%s" system-name
- (if (not (string= branch ""))
- (format "(%s)" (substring branch 2 -1))
- "")
- (oni:shorten-dir
- (abbreviate-file-name (eshell/pwd))))))))
-
(stante-after em-dirs
(add-hook 'eshell-directory-change-hook
#'oni:current-dir-in-buffer-name))