annotate .elisp/textmate.el @ 22:8715ccb6f61b

Start using textmate.el.
author Augie Fackler <durin42@gmail.com>
date Fri, 12 Dec 2008 09:38:16 -0600
parents
children d6fd2964258c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
22
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
1 ;; textmate.el --- TextMate minor mode for Emacs
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
2
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
3 ;; Copyright (C) 2008 Chris Wanstrath <chris@ozmm.org>
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
4
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
5 ;; Licensed under the same terms as Emacs.
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
6
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
7 ;; Version: 0.1.0
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
8 ;; Keywords: textmate osx mac
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
9 ;; Created: 22 Nov 2008
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
10 ;; Author: Chris Wanstrath <chris@ozmm.org>
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
11
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
12 ;; This file is NOT part of GNU Emacs.
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
13
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
14 ;; Licensed under the same terms as Emacs.
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
15
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
16 ;;; Commentary:
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
17
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
18 ;; This minor mode exists to mimick TextMate's awesome
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
19 ;; features.
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
20
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
21 ;; ⌘T - Go to File
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
22 ;; ⇧⌘T - Go to Symbol
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
23 ;; ⌘L - Go to Line
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
24 ;; ⌘/ - Comment Line (or Selection/Region)
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
25 ;; ⌘] - Shift Right (currently indents region)
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
26 ;; ⌘[ - Shift Left (not yet implemented)
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
27 ;; ⌥⌘] - Align Assignments
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
28 ;; ⌥⌘[ - Indent Line
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
29 ;; ⌘RET - Insert Newline at Line's End
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
30 ;; ⌥⌘T - Reset File Cache (for Go to File)
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
31
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
32 ;; A "project" in textmate-mode is determined by the presence of
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
33 ;; a .git directory. If no .git directory is found in your current
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
34 ;; directory, textmate-mode will traverse upwards until one (or none)
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
35 ;; is found. The directory housing the .git directory is presumed
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
36 ;; to be the project's root.
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
37
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
38 ;; In other words, calling Go to File from
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
39 ;; ~/Projects/fieldrunners/app/views/towers/show.html.erb will use
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
40 ;; ~/Projects/fieldrunners/ as the root if ~/Projects/fieldrunners/.git
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
41 ;; exists.
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
42
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
43 ;;; Installation
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
44
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
45 ;; $ cd ~/.emacs.d/vendor
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
46 ;; $ git clone git://github.com/defunkt/textmate.el.git
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
47 ;;
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
48 ;; In your emacs config:
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
49 ;;
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
50 ;; (add-to-list 'load-path "~/.emacs.d/vendor/textmate.el")
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
51 ;; (require 'textmate)
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
52 ;; (textmate-mode)
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
53
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
54 ;;; Depends on imenu
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
55 (require 'imenu)
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
56
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
57 ;;; Minor mode
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
58
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
59 (defvar textmate-use-file-cache t
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
60 "* Should `textmate-goto-file' keep a local cache of files?")
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
61
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
62 (defvar textmate-completing-library 'ido
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
63 "The library `textmade-goto-symbol' and `textmate-goto-file' should use for completing filenames and symbols (`ido' by default)")
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
64
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
65 (defvar *textmate-completing-function-alist* '((ido ido-completing-read)
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
66 (icicles icicle-completing-read)
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
67 (none completing-read))
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
68 "The function to call to read file names and symbols from the user")
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
69
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
70 (defvar *textmate-completing-minor-mode-alist*
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
71 `((ido ,(lambda (a) (progn (ido-mode a) (setq ido-enable-flex-matching t))))
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
72 (icicles ,(lambda (a) (icy-mode a)))
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
73 (none ,(lambda (a) ())))
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
74 "The list of functions to enable and disable completing minor modes")
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
75
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
76 (defvar *textmate-mode-map* (make-sparse-keymap))
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
77 (defvar *textmate-project-root* nil)
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
78 (defvar *textmate-project-files* '())
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
79 (defvar *textmate-gf-exclude*
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
80 "/\\.|vendor|fixtures|tmp|log|build|\\.xcodeproj|\\.nib|\\.framework|\\.app|\\.pbproj|\\.pbxproj|\\.xcode|\\.xcodeproj|\\.bundle")
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
81
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
82 (defvar *textmate-keybindings-list* `((textmate-next-line
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
83 [A-return] [M-return])
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
84 (textmate-clear-cache
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
85 ,(kbd "A-M-t") [(control c)(control t)])
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
86 (align
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
87 ,(kbd "A-M-]") [(control c)(control a)])
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
88 (indent-according-to-mode
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
89 ,(kbd "A-M-[") nil)
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
90 (indent-region
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
91 ,(kbd "A-]") [(control tab)])
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
92 (comment-or-uncomment-region-or-line
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
93 ,(kbd "A-/") [(control c)(control k)])
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
94 (textmate-goto-file
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
95 ,(kbd "A-t") [(meta t)])
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
96 (textmate-goto-symbol
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
97 ,(kbd "A-T") [(meta T)])))
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
98
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
99 (defvar *textmate-project-root-p*
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
100 #'(lambda (coll) (or (member ".git" coll)
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
101 (member ".hg" coll)
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
102 ))
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
103 "*Lambda that, given a collection of directory entries, returns
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
104 non-nil if it represents the project root.")
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
105
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
106 ;;; Bindings
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
107
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
108 (defun textmate-ido-fix ()
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
109 "Add up/down keybindings for ido."
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
110 (define-key ido-completion-map [up] 'ido-prev-match)
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
111 (define-key ido-completion-map [down] 'ido-next-match))
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
112
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
113 (defun textmate-bind-keys ()
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
114 (add-hook 'ido-setup-hook 'textmate-ido-fix)
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
115
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
116 ; weakness until i figure out how to do this right
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
117 (when (boundp 'osx-key-mode-map)
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
118 (define-key osx-key-mode-map (kbd "A-t") 'textmate-goto-file)
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
119 (define-key osx-key-mode-map (kbd "A-T") 'textmate-goto-symbol))
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
120
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
121 (let ((member) (i 0) (access (if (boundp 'aquamacs-version) 'cadr 'caddr)))
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
122 (setq member (nth i *textmate-keybindings-list*))
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
123 (while member
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
124 (if (funcall access member)
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
125 (define-key *textmate-mode-map* (funcall access member) (car member)))
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
126 (setq member (nth i *textmate-keybindings-list*))
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
127 (setq i (+ i 1)))))
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
128
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
129 (defun textmate-completing-read (&rest args)
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
130 (let ((reading-fn (cadr (assoc textmate-completing-library *textmate-completing-function-alist*))))
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
131 (apply (symbol-function reading-fn) args)))
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
132
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
133 ;;; Commands
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
134
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
135 (defun textmate-next-line ()
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
136 (interactive)
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
137 (end-of-line)
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
138 (newline-and-indent))
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
139
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
140 ;; http://chopmo.blogspot.com/2008/09/quickly-jumping-to-symbols.html
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
141 (defun textmate-goto-symbol ()
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
142 "Will update the imenu index and then use ido to select a symbol to navigate to"
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
143 (interactive)
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
144 (imenu--make-index-alist)
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
145 (let ((name-and-pos '())
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
146 (symbol-names '()))
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
147 (flet ((addsymbols (symbol-list)
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
148 (when (listp symbol-list)
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
149 (dolist (symbol symbol-list)
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
150 (let ((name nil) (position nil))
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
151 (cond
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
152 ((and (listp symbol) (imenu--subalist-p symbol))
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
153 (addsymbols symbol))
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
154
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
155 ((listp symbol)
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
156 (setq name (car symbol))
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
157 (setq position (cdr symbol)))
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
158
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
159 ((stringp symbol)
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
160 (setq name symbol)
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
161 (setq position (get-text-property 1 'org-imenu-marker symbol))))
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
162
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
163 (unless (or (null position) (null name))
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
164 (add-to-list 'symbol-names name)
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
165 (add-to-list 'name-and-pos (cons name position))))))))
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
166 (addsymbols imenu--index-alist))
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
167 (let* ((selected-symbol (textmate-completing-read "Symbol: " symbol-names))
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
168 (position (cdr (assoc selected-symbol name-and-pos))))
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
169 (goto-char position))))
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
170
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
171 (defun textmate-goto-file ()
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
172 (interactive)
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
173 (let ((root (textmate-project-root)))
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
174 (when (null root)
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
175 (error "Can't find any .git directory"))
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
176 (find-file
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
177 (concat
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
178 (expand-file-name root) "/"
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
179 (textmate-completing-read
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
180 "Find file: "
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
181 (textmate-cached-project-files root))))))
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
182
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
183 (defun textmate-clear-cache ()
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
184 (interactive)
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
185 (setq *textmate-project-root* nil)
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
186 (setq *textmate-project-files* nil)
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
187 (message "textmate-mode cache cleared."))
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
188
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
189 ;;; Utilities
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
190
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
191 (defun textmate-also-ignore (pattern)
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
192 "Also ignore PATTERN in project files."
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
193 (setq *textmate-gf-exclude*
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
194 (concat *textmate-gf-exclude* "|" pattern)))
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
195
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
196 (defun textmate-project-files (root)
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
197 (split-string
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
198 (shell-command-to-string
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
199 (concat
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
200 "find "
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
201 root
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
202 " -type f | grep -vE '"
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
203 *textmate-gf-exclude*
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
204 "' | sed 's:"
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
205 *textmate-project-root*
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
206 "/::'")) "\n" t))
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
207
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
208 (defun textmate-cached-project-files (&optional root)
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
209 (cond
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
210 ((null textmate-use-file-cache) (textmate-project-files root))
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
211 ((equal (textmate-project-root) (car *textmate-project-files*))
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
212 (cdr *textmate-project-files*))
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
213 (t (cdr (setq *textmate-project-files*
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
214 `(,root . ,(textmate-project-files root)))))))
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
215
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
216 (defun textmate-project-root ()
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
217 (when (or
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
218 (null *textmate-project-root*)
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
219 (not (string-match *textmate-project-root* default-directory)))
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
220 (let ((root (textmate-find-project-root)))
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
221 (if root
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
222 (setq *textmate-project-root* (expand-file-name (concat root "/")))
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
223 (setq *textmate-project-root* nil))))
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
224 *textmate-project-root*)
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
225
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
226 (defun textmate-find-project-root (&optional root)
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
227 (when (null root) (setq root default-directory))
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
228 (cond
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
229 ((funcall *textmate-project-root-p* (directory-files root))
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
230 (expand-file-name root))
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
231 ((equal (expand-file-name root) "/") nil)
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
232 (t (textmate-find-project-root (concat (file-name-as-directory root) "..")))))
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
233
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
234 ;;;###autoload
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
235 (define-minor-mode textmate-mode "TextMate Emulation Minor Mode"
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
236 :lighter " mate" :global t :keymap *textmate-mode-map*
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
237 (textmate-bind-keys)
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
238 ; activate preferred completion library
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
239 (dolist (mode *textmate-completing-minor-mode-alist*)
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
240 (if (eq (car mode) textmate-completing-library)
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
241 (funcall (cadr mode) t)
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
242 (when (fboundp
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
243 (cadr (assoc (car mode) *textmate-completing-function-alist*)))
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
244 (funcall (cadr mode) -1)))))
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
245
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
246 (provide 'textmate)
8715ccb6f61b Start using textmate.el.
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
247 ;;; textmate.el ends here