Permalink
Find file
Fetching contributors…
Cannot retrieve contributors at this time
172 lines (148 sloc) 6.31 KB
;; Buffer-related defuns
(require 'imenu)
(defvar buffer-local-mode nil)
(make-variable-buffer-local 'buffer-local-mode)
(defun mode-keymap (mode-sym)
(symbol-value (intern (concat (symbol-name mode-sym) "-map"))))
(defun* buffer-local-set-key (key action)
(when buffer-local-mode
(define-key (mode-keymap buffer-local-mode)
key action)
(return-from set-key-buffer-local))
(let* ((mode-name-loc (gensym "-blm")))
(eval `(define-minor-mode ,mode-name-loc nil nil nil (make-sparse-keymap)))
(setq buffer-local-mode mode-name-loc)
(funcall mode-name-loc 1)
(define-key (mode-keymap mode-name-loc) key action)))
(defun create-scratch-buffer nil
"create a new scratch buffer to work in. (could be *scratch* - *scratchX*)"
(interactive)
(let ((n 0)
bufname)
(while (progn
(setq bufname (concat "*scratch"
(if (= n 0) "" (int-to-string n))
"*"))
(setq n (1+ n))
(get-buffer bufname)))
(switch-to-buffer (get-buffer-create bufname))
(emacs-lisp-mode)
))
(defun split-window-right-and-move-there-dammit ()
(interactive)
(split-window-right)
(windmove-right))
(defun toggle-window-split ()
(interactive)
(if (= (count-windows) 2)
(let* ((this-win-buffer (window-buffer))
(next-win-buffer (window-buffer (next-window)))
(this-win-edges (window-edges (selected-window)))
(next-win-edges (window-edges (next-window)))
(this-win-2nd (not (and (<= (car this-win-edges)
(car next-win-edges))
(<= (cadr this-win-edges)
(cadr next-win-edges)))))
(splitter
(if (= (car this-win-edges)
(car (window-edges (next-window))))
'split-window-horizontally
'split-window-vertically)))
(delete-other-windows)
(let ((first-win (selected-window)))
(funcall splitter)
(if this-win-2nd (other-window 1))
(set-window-buffer (selected-window) this-win-buffer)
(set-window-buffer (next-window) next-win-buffer)
(select-window first-win)
(if this-win-2nd (other-window 1))))))
(defun rotate-windows ()
"Rotate your windows"
(interactive)
(cond ((not (> (count-windows)1))
(message "You can't rotate a single window!"))
(t
(setq i 1)
(setq numWindows (count-windows))
(while (< i numWindows)
(let* (
(w1 (elt (window-list) i))
(w2 (elt (window-list) (+ (% i numWindows) 1)))
(b1 (window-buffer w1))
(b2 (window-buffer w2))
(s1 (window-start w1))
(s2 (window-start w2))
)
(set-window-buffer w1 b2)
(set-window-buffer w2 b1)
(set-window-start w1 s2)
(set-window-start w2 s1)
(setq i (1+ i)))))))
(defun ido-imenu ()
"Update the imenu index and then use ido to select a symbol to navigate to.
Symbols matching the text at point are put first in the completion list."
(interactive)
(imenu--make-index-alist)
(let ((name-and-pos '())
(symbol-names '()))
(flet ((addsymbols (symbol-list)
(when (listp symbol-list)
(dolist (symbol symbol-list)
(let ((name nil) (position nil))
(cond
((and (listp symbol) (imenu--subalist-p symbol))
(addsymbols symbol))
((listp symbol)
(setq name (car symbol))
(setq position (cdr symbol)))
((stringp symbol)
(setq name symbol)
(setq position (get-text-property 1 'org-imenu-marker symbol))))
(unless (or (null position) (null name))
(add-to-list 'symbol-names name)
(add-to-list 'name-and-pos (cons name position))))))))
(addsymbols imenu--index-alist))
;; If there are matching symbols at point, put them at the beginning of `symbol-names'.
(let ((symbol-at-point (thing-at-point 'symbol)))
(when symbol-at-point
(let* ((regexp (concat (regexp-quote symbol-at-point) "$"))
(matching-symbols (delq nil (mapcar (lambda (symbol)
(if (string-match regexp symbol) symbol))
symbol-names))))
(when matching-symbols
(sort matching-symbols (lambda (a b) (> (length a) (length b))))
(mapc (lambda (symbol) (setq symbol-names (cons symbol (delete symbol symbol-names))))
matching-symbols)))))
(let* ((selected-symbol (ido-completing-read "Symbol? " symbol-names))
(position (cdr (assoc selected-symbol name-and-pos))))
(push-mark (point))
(goto-char position))))
(defun untabify-buffer ()
(interactive)
(untabify (point-min) (point-max)))
(defun indent-buffer ()
(interactive)
(indent-region (point-min) (point-max)))
(defun cleanup-buffer ()
"Perform a bunch of operations on the whitespace content of a buffer.
Including indent-buffer, which should not be called automatically on save."
(interactive)
(untabify-buffer)
(delete-trailing-whitespace)
(indent-buffer))
(defun file-name-with-one-directory (file-name)
(concat (cadr (reverse (split-string file-name "/"))) "/"
(file-name-nondirectory file-name)))
(require 's)
(defvar user-home-directory (concat (expand-file-name "~") "/"))
(defun shorter-file-name (file-name)
(s-chop-prefix user-home-directory file-name))
(defun recentf--file-cons (file-name)
(cons (shorter-file-name file-name) file-name))
(defun recentf-ido-find-file ()
"Find a recent file using ido."
(interactive)
(let* ((recent-files (mapcar 'recentf--file-cons recentf-list))
(files (mapcar 'car recent-files))
(file (completing-read "Choose recent file: " files)))
(find-file (cdr (assoc file recent-files)))))