diff options
Diffstat (limited to '.emacs.d')
-rw-r--r-- | .emacs.d/init.el | 1380 |
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 "é" "é")) + +(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 "é" "é")) - -(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)) |