diff .elisp/textmate.el @ 24:d6fd2964258c

New version of textmate.el
author Augie Fackler <durin42@gmail.com>
date Tue, 16 Dec 2008 11:30:55 -0600
parents 8715ccb6f61b
children c7ff220bba9f
line wrap: on
line diff
--- a/.elisp/textmate.el
+++ b/.elisp/textmate.el
@@ -94,7 +94,9 @@
                                      (textmate-goto-file
                                       ,(kbd "A-t")   [(meta t)])
                                      (textmate-goto-symbol
-                                      ,(kbd "A-T")   [(meta T)])))
+                                      ,(kbd "A-T")   [(meta T)])
+				     (textmate-toggle-camel-case
+				      ,(kbd "C-_")   [(control _))))
 
 (defvar *textmate-project-root-p*
   #'(lambda (coll) (or (member ".git" coll)
@@ -186,6 +188,33 @@
   (setq *textmate-project-files* nil)
   (message "textmate-mode cache cleared."))
 
+(defun textmate-toggle-camel-case ()
+  "Toggle current sexp between camelCase and snake_case, like TextMate C-_."
+  (interactive)
+  (if (thing-at-point 'word)
+      (progn
+	(unless (looking-at "\\<") (backward-sexp))
+	(let ((case-fold-search nil)
+	      (start (point))
+	      (end (save-excursion (forward-sexp) (point))))
+	  (if (and (looking-at "[a-z0-9_]+") (= end (match-end 0))) ; snake-case
+	      (progn
+		(goto-char start)
+		(while (re-search-forward "_[a-z]" end t)
+		  (goto-char (1- (point)))
+		  (delete-char -1)
+		  (upcase-region (point) (1+ (point)))
+		  (setq end (1- end))))
+	    (downcase-region (point) (1+ (point)))
+	    (while (re-search-forward "[A-Z][a-z]" end t)
+	      (forward-char -2)
+	      (insert "_")
+	      (downcase-region (point) (1+ (point)))
+	      (forward-char 1)
+	      (setq end (1+ end)))
+	    (downcase-region start end)
+	    )))))
+
 ;;; Utilities
 
 (defun textmate-also-ignore (pattern)