wisp
 
(Arne Babenhauserheide)
2015-12-25: plan for better indentation support in wisp-mode

plan for better indentation support in wisp-mode

diff --git a/wisp-mode.el b/wisp-mode.el
--- a/wisp-mode.el
+++ b/wisp-mode.el
@@ -3,7 +3,7 @@
 ;; Copyright (C) 2013  Arne Babenhauserheide <arne_bab@web.de>
 
 ;; Author: Arne Babenhauserheide <arne_bab@web.de>
-;; Version: 0.2.1
+;; Version: 0.2.2
 ;; Keywords: languages, lisp
 
 ;; This program is free software; you can redistribute it and/or
@@ -28,8 +28,9 @@
 ;; 
 ;; For details on wisp, see 
 ;; http://draketo.de/light/english/wisp-lisp-indentation-preprocessor
-;; 
-;; If you came here looking for wisp the lisp-to-javascript compiler[1], have a look at wispjs-mode[2].
+;;
+;; If you came here looking for wisp the lisp-to-javascript
+;; compiler[1], have a look at wispjs-mode[2].
 ;; 
 ;; [1]: http://jeditoolkit.com/try-wisp
 ;; 
@@ -70,7 +71,7 @@
 ; note: for easy testing: emacs -Q wisp-mode.el -e eval-buffer wisp-guile.w -e delete-other-windows
 
 
-(defvar wisp-builtin '("define" "define-syntax" "syntax-rules" "defun" "let*" "let" "setq" "set!" "set" "if" "when" "while" "set!" "and" "or" "not" "char=?"))
+(defvar wisp-builtin '("define" "define-syntax" "syntax-rules" "syntax-case" "define-syntax-rule" "defun" "let*" "let" "setq" "set!" "set" "if" "when" "while" "set!" "and" "or" "not" "char=?"))
 
 ; TODO: Add special treatment for defun foo : bar baz ⇒ foo = function, bar and baz not.
 ; TODO: Add highlighting for `, , and other macro-identifiers.
@@ -108,6 +109,41 @@
      ))
   "Default highlighting expressions for wisp mode.")
 
+(defun wisp-indent-current-line (&optional unindented-ok)
+  "Sets the indentation of the current line. Derived from
+indent-relative."
+  (interactive "P")
+  (let ((start-column (current-column))
+        indent)
+    (save-excursion
+      (beginning-of-line)
+      (if (re-search-backward "^[^\n]" nil t)
+          (let ((end (save-excursion (forward-line 1) (point))))
+            (move-to-column start-column)
+            ; TODO: If the previous line is less indented by exactly 4
+            ; characters, de-dent to previous-line minus 4. If the
+            ; previous line is more indented, indent to the
+            ; indentation of the previous line. If both lines are
+            ; equally indented, indent to either the previous line
+            ; plus 4, or to the first occurence of a colon, if that’s
+            ; less.
+            (if (or
+                 (= (current-column) (- 4 start-column))
+                 (and (< (current-column) start-column) (looking-at ":")))
+                (backward-char 1))
+            (or (looking-at "[ \t]")
+                unindented-ok
+                (skip-chars-forward "^ \t" end))
+            (skip-chars-forward " \t" end)
+            (or (= (point) end) (setq indent (current-column))))))
+    (if indent
+        (let ((opoint (point-marker)))
+          (indent-to indent 0)
+          (if (> opoint (point))
+              (goto-char opoint))
+          (move-marker opoint nil))
+      (tab-to-tab-stop))))
+
 ; use this mode automatically
 ;;;###autoload
 (define-derived-mode wisp-mode