Mercurial > dotfiles
view .elisp/settings/50.localfuncs.el @ 126:34b698771af9
emacs keybinding fixes
* Stop passing any keys through to the Mac layer
* M-shift-f is now textmate-find-in-project
* M-p bounces to matching paren (includes new elisp function to do that, is there a built in one?)
author | Augie Fackler <durin42@gmail.com> |
---|---|
date | Thu, 09 Jul 2009 13:32:06 -0500 |
parents | 15bcc3e0afeb |
children | e30655eb7050 |
line wrap: on
line source
(defun pyflakes-this-buffer () (interactive) (compilation-start (concat "cd " (file-name-directory buffer-file-name) "; pyflakes " (file-name-nondirectory buffer-file-name)) nil (lambda (mode) "*pyflakes*"))) (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)))) (goto-char position)))) (defun fullscreen () (interactive) (set-frame-parameter nil 'fullscreen (if (frame-parameter nil 'fullscreen) nil 'fullboth))) (defun hg-rm-this-file () (interactive) (shell-command-to-string (concat "hg rm " (shell-quote-argument buffer-file-name)))) ;; Lifted from http://code.google.com/p/ergoemacs/ (defun select-text-in-quote () "Select text between the nearest left and right delimiters. Delimiters are paired characters: ()[]<>«»“”‘’「」, including \"\"." (interactive) (let (b1 b2) (skip-chars-backward "^<>(“{[「«\"‘") (setq b1 (point)) (skip-chars-forward "^<>)”}]」»\"’") (setq b2 (point)) (set-mark b1) ) ) ;; Most of this was extracted from show-paren-function in paren.el from an emacs 23 nightly ;; Also, it seems like this really ought to be builtin, but I can't find it. (defun bounce-to-other-paren () (interactive) (let ((oldpos (point)) (dir (cond ((eq (syntax-class (syntax-after (1- (point)))) 5) -1) ((eq (syntax-class (syntax-after (point))) 4) 1))) pos mismatch face) ;; ;; Find the other end of the sexp. (when dir (save-excursion (save-restriction ;; Determine the range within which to look for a match. (when blink-matching-paren-distance (narrow-to-region (max (point-min) (- (point) blink-matching-paren-distance)) (min (point-max) (+ (point) blink-matching-paren-distance)))) ;; Scan across one sexp within that range. ;; Errors or nil mean there is a mismatch. (condition-case () (setq pos (scan-sexps (point) dir)) (error (setq pos t mismatch t))) ;; Move back the other way and verify we get back to the ;; starting point. If not, these two parens don't really match. ;; Maybe the one at point is escaped and doesn't really count. (when (integerp pos) (unless (condition-case () (eq (point) (scan-sexps pos (- dir))) (error nil)) (setq pos nil))) ))) ;; Highlight the other end of the sexp, or unhighlight if none. (if (and pos (integerp pos)) (goto-char pos) (message "No matching other paren found.") )))