]> code.delx.au - gnu-emacs-elpa/commitdiff
Merge commit '98fe00fbd6a71ba1e79cf616f22c026c9d84adc7'
authorArtur Malabarba <bruce.connor.am@gmail.com>
Wed, 5 Aug 2015 21:52:25 +0000 (22:52 +0100)
committerArtur Malabarba <bruce.connor.am@gmail.com>
Wed, 5 Aug 2015 21:52:25 +0000 (22:52 +0100)
1  2 
packages/sotlisp/sotlisp.el

index 9be147cae82d689e60830ae1bebd4534a6ade47a,c67ed8a26c3f628a4e7d43a025ae24042f35efb7..6e4bb1168b0dc4e9f1c73b56133e785171577c79
@@@ -1,12 -1,12 +1,12 @@@
  ;;; sotlisp.el --- Write lisp at the speed of thought.  -*- lexical-binding: t; -*-
  
 -;; Copyright (C) 2014 Free Software Foundation, Inc.
 +;; Copyright (C) 2014, 2015 Free Software Foundation, Inc.
  
 -;; Author: Artur Malabarba  <bruce.connor.am@gmail.com>
 +;; Author: Artur Malabarba  <bruce.connor.am@>
  ;; URL: https://github.com/Malabarba/speed-of-thought-lisp
  ;; Keywords: convenience, lisp
  ;; Package-Requires: ((emacs "24.1"))
- ;; Version: 1.1
+ ;; Version: 1.2
  
  ;; This program is free software; you can redistribute it and/or modify
  ;; it under the terms of the GNU General Public License as published by
        (bound-and-true-p paredit-mode)
        (bound-and-true-p smartparens-mode)))
  
+ (defun sotlisp--looking-back (regexp)
+   (string-match
+    (concat regexp "\\'")
+    (buffer-substring (line-beginning-position) (point))))
  (defun sotlisp--function-form-p ()
    "Non-nil if point is at the start of a sexp.
  Specially, avoids matching inside argument lists."
    (and (eq (char-before) ?\()
-        (not (looking-back "(\\(defun\\s-+.*\\|lambda\\s-+\\)("))
+        (not (sotlisp--looking-back "(\\(defun\\s-+.*\\|lambda\\s-+\\)("))
         (not (string-match (rx (syntax symbol)) (string last-command-event)))))
  
  (defun sotlisp--function-quote-p ()
    "Non-nil if point is at a sharp-quote."
-   (looking-back "#'"))
+   (ignore-errors
+     (save-excursion
+       (forward-char -2)
+       (looking-at-p "#'"))))
+ (defun sotlisp--code-p ()
+   (save-excursion
+     (let ((r (point)))
+       (beginning-of-defun)
+       (let ((pps (parse-partial-sexp (point) r)))
+         (not (or (elt pps 3)
+                  (elt pps 4)))))))
  
  (defun sotlisp--function-p ()
    "Non-nil if point is at reasonable place for a function name.
@@@ -109,13 -125,19 +125,19 @@@ non-nil.
    (save-excursion
      (ignore-errors
        (skip-chars-backward (rx alnum))
-       (or (sotlisp--function-form-p)
-           (sotlisp--function-quote-p)))))
+       (and (sotlisp--code-p)
+            (or (sotlisp--function-form-p)
+                (sotlisp--function-quote-p))))))
  
  (defun sotlisp--whitespace-p ()
    "Non-nil if current `self-insert'ed char is whitespace."
+   (sotlisp--whitespace-char-p last-command-event))
+ (make-obsolete 'sotlisp--whitespace-p 'sotlisp--whitespace-char-p "1.2")
+ (defun sotlisp--whitespace-char-p (char)
+   "Non-nil if CHAR is has whitespace syntax."
    (ignore-errors
-     (string-match (rx space) (string last-command-event))))
+     (string-match (rx space) (string char))))
  
  \f
  ;;; Expansion logic
@@@ -140,6 -162,28 +162,28 @@@ Point is left where the `$' char was.  
               (sotlisp--auto-paired-p))
      (forward-char 1)))
  
+ (defun sotlisp--post-expansion-cleanup ()
+   "Do some processing conditioned on the expansion done.
+ If the command that triggered the expansion was a whitespace
+ char, perform the steps below and return t.
+ If the expansion ended in a $, delete it and call
+ `sotlisp--maybe-skip-closing-paren'.
+ If it ended in a space and there's a space ahead, delete the
+ space ahead."
+   ;; Inform `expand-abbrev' that `self-insert-command' should not
+   ;; trigger, by returning non-nil on SPC.
+   (when (sotlisp--whitespace-char-p last-command-event)
+     ;; And maybe move out of closing paren if expansion ends with $.
+     (if (eq (char-before) ?$)
+         (progn (delete-char -1)
+                (setq sotlisp--needs-moving nil)
+                (sotlisp--maybe-skip-closing-paren))
+       (when (and (sotlisp--whitespace-char-p (char-after))
+                  (sotlisp--whitespace-char-p (char-before)))
+         (delete-char 1)))
+     t))
  (defvar sotlisp--function-table (make-hash-table :test #'equal)
    "Table where function abbrev expansions are stored.")
  
@@@ -150,23 -194,18 +194,18 @@@ See `sotlisp-define-function-abbrev'.
      (skip-chars-backward (rx alnum))
      (let* ((name (buffer-substring (point) r))
             (expansion (gethash name sotlisp--function-table)))
-       (delete-region (point) r)
-       (if (sotlisp--function-quote-p)
-           ;; After #' use the simple expansion.
-           (insert (sotlisp--simplify-function-expansion expansion))
-         ;; Inside a form, use the full expansion.
-         (insert expansion)
-         (when (string-match "\\$" expansion)
-           (setq sotlisp--needs-moving t))))
-     ;; Inform `expand-abbrev' that `self-insert-command' should not
-     ;; trigger, by returning non-nil on SPC.
-     (when (sotlisp--whitespace-p)
-       ;; And maybe move out of closing paren if expansion ends with $.
-       (when (eq (char-before) ?$)
-         (delete-char -1)
-         (setq sotlisp--needs-moving nil)
-         (sotlisp--maybe-skip-closing-paren))
-       t)))
+       (if (not expansion)
+           (progn (goto-char r) nil)
+         (delete-region (point) r)
+         (if (sotlisp--function-quote-p)
+             ;; After #' use the simple expansion.
+             (insert (sotlisp--simplify-function-expansion expansion))
+           ;; Inside a form, use the full expansion.
+           (insert expansion)
+           (when (string-match "\\$" expansion)
+             (setq sotlisp--needs-moving t)))
+         ;; Must be last.
+         (sotlisp--post-expansion-cleanup)))))
  
  (put 'sotlisp--expand-function 'no-self-insert t)
  
@@@ -236,6 -275,7 +275,7 @@@ The space char is not included.  Any \"
      ("i" . "insert ")
      ("ie" . "ignore-errors ")
      ("ii" . "interactive")
+     ("il" . "if-let (($))")
      ("ir" . "indent-region ")
      ("jcl" . "justify-current-line ")
      ("jl" . "delete-indentation")
      ("wcb" . "with-current-buffer ")
      ("wf" . "write-file ")
      ("wh" . "while ")
-     ("wl" . "window-list nil 'nominibuffer")
+     ("wl" . "when-let (($))")
      ("we" . "window-end")
      ("ws" . "window-start")
      ("wtb" . "with-temp-buffer")
@@@ -481,7 -521,8 +521,7 @@@ removes hooks and abbrevs.
                         (looking-at-p "#'")))
        (thing-at-point 'symbol)
      (let ((fcap (function-called-at-point)))
 -      (if fcap
 -          (symbol-name fcap)
 +      (if fcap (symbol-name fcap)
          (thing-at-point 'symbol)))))
  
  (defun sotlisp-find-or-define-function (&optional prefix)
@@@ -549,3 -590,4 +589,3 @@@ With a prefix argument, defines a `defv
  
  (provide 'sotlisp)
  ;;; sotlisp.el ends here
 -