]> gitweb.factorcode.org Git - factor.git/blobdiff - misc/fuel/fuel-base.el
Use lexical scoping in all fuel sources
[factor.git] / misc / fuel / fuel-base.el
index 1a7cf4fbe6b7b157733e6648234b5eedd0025aa0..e62d9672d52a54f7d820b616d5c67f0acb16bbff 100644 (file)
@@ -1,10 +1,10 @@
-;;; fuel-base.el --- Basic FUEL support code
+;;; fuel-base.el --- Basic FUEL support code -*- lexical-binding: t -*-
 
-;; Copyright (C) 2008  Jose Antonio Ortega Ruiz
+;; Copyright (C) 2008 Jose Antonio Ortega Ruiz
 ;; See http://factorcode.org/license.txt for BSD license.
 
 ;; Author: Jose Antonio Ortega Ruiz <jao@gnu.org>
-;; Keywords: languages
+;; Keywords: languages, fuel, factor
 
 ;;; Commentary:
 
@@ -12,7 +12,7 @@
 
 ;;; Code:
 
-(defconst fuel-version "1.0")
+(defconst fuel-version "1.1")
 
 ;;;###autoload
 (defsubst fuel-version ()
   (interactive)
   (message "FUEL %s" fuel-version))
 
-\f
 ;;; Customization:
 
 ;;;###autoload
 (defgroup fuel nil
-  "Factor's Ultimate Emacs Library"
-  :group 'language)
-
-\f
-;;; Emacs compatibility:
-
-(eval-after-load "ring"
-  '(when (not (fboundp 'ring-member))
-     (defun ring-member (ring item)
-       (catch 'found
-         (dotimes (ind (ring-length ring) nil)
-           (when (equal item (ring-ref ring ind))
-             (throw 'found ind)))))))
-
-(when (not (fboundp 'completion-table-dynamic))
-  (defun completion-table-dynamic (fun)
-    (lexical-let ((fun fun))
-      (lambda (string pred action)
-        (with-current-buffer (let ((win (minibuffer-selected-window)))
-                               (if (window-live-p win) (window-buffer win)
-                                 (current-buffer)))
-          (complete-with-action action (funcall fun string) string pred))))))
-
-\f
-;;; Utilities
-
-(defun fuel--shorten-str (str len)
+  "Factor's Ultimate Emacs Library."
+  :group 'languages)
+
+;;; Compatibility with Emacs 24.3
+(unless (fboundp 'setq-local)
+  (defmacro setq-local (var val)
+    (list 'set (list 'make-local-variable (list 'quote var)) val)))
+
+(unless (fboundp 'defvar-local)
+  (defmacro defvar-local (var val &optional docstring)
+    (declare (debug defvar) (doc-string 3))
+    (list 'progn (list 'defvar var val docstring)
+          (list 'make-variable-buffer-local (list 'quote var)))))
+
+(unless (fboundp 'alist-get)
+  (defun alist-get (key alist)
+    (cdr (assoc key alist))))
+
+;;; Utilities:
+(defun fuel-shorten-str (str len)
   (let ((sl (length str)))
     (if (<= sl len) str
       (let* ((sep " ... ")
              (sepl (length sep))
              (segl (/ (- len sepl) 2)))
-        (format "%s%s%s"
-                (substring str 0 segl)
-                sep
-                (substring str (- sl segl)))))))
-
-(defun fuel--shorten-region (begin end len)
-  (fuel--shorten-str (mapconcat 'identity
-                                (split-string (buffer-substring begin end) nil t)
-                                " ")
-                     len))
-
-(defsubst empty-string-p (str) (equal str ""))
-
-(defun fuel--string-prefix-p (prefix str)
-  (and (>= (length str) (length prefix))
-       (string= (substring-no-properties 0 (length prefix) str)
-                (substring-no-properties prefix))))
-
-(defun fuel--respecting-message (format &rest format-args)
+        (format "%s%s%s" (substring str 0 segl)
+                sep (substring str (- sl segl)))))))
+
+(defun fuel-shorten-region (begin end len)
+  (fuel-shorten-str
+   (mapconcat 'identity
+              (split-string (buffer-substring begin end) nil t) " ") len))
+
+(defsubst fuel-region-to-string (begin &optional end)
+  (let ((end (or end (point))))
+    (if (< begin end)
+        (mapconcat 'identity
+                   (split-string (buffer-substring-no-properties begin end)
+                                 nil t) " ") "")))
+
+(defun fuel-respecting-message (format &rest format-args)
   "Display TEXT as a message, without hiding any minibuffer contents."
   (let ((text (format " [%s]" (apply #'format format format-args))))
     (if (minibuffer-window-active-p (minibuffer-window))
         (minibuffer-message text)
       (message "%s" text))))
 
+(defun fuel-mode--read-file (arg)
+  (let* ((file (or (and arg (read-file-name "File: " nil (buffer-file-name) t))
+                   (buffer-file-name)))
+         (file (expand-file-name file))
+         (buffer (find-file-noselect file)))
+    (when (and  buffer
+                (buffer-modified-p buffer)
+                (y-or-n-p "Save file? "))
+      (save-buffer buffer))
+    (cons file buffer)))
+
+;; I think it is correct to put almost all punctuation characters in
+;; the word class because Factor words can be made up of almost
+;; anything. Otherwise you get incredibly annoying regexps.
+(defun fuel-syntax-table ()
+    (let ((table (make-syntax-table prog-mode-syntax-table)))
+    (modify-syntax-entry ?\" "\"" table)
+    (modify-syntax-entry ?# "_" table)
+    (modify-syntax-entry ?! "_" table)
+    (modify-syntax-entry ?\n ">   " table)
+    (modify-syntax-entry ?$ "_" table)
+    (modify-syntax-entry ?@ "_" table)
+    (modify-syntax-entry ?? "_" table)
+    (modify-syntax-entry ?_ "_" table)
+    (modify-syntax-entry ?: "_" table)
+    (modify-syntax-entry ?< "_" table)
+    (modify-syntax-entry ?> "_" table)
+    (modify-syntax-entry ?. "_" table)
+    (modify-syntax-entry ?, "_" table)
+    (modify-syntax-entry ?& "_" table)
+    (modify-syntax-entry ?| "_" table)
+    (modify-syntax-entry ?% "_" table)
+    (modify-syntax-entry ?= "_" table)
+    (modify-syntax-entry ?/ "_" table)
+    (modify-syntax-entry ?+ "_" table)
+    (modify-syntax-entry ?* "_" table)
+    (modify-syntax-entry ?- "_" table)
+    (modify-syntax-entry ?\; "_" table)
+    (modify-syntax-entry ?\' "_" table)
+    (modify-syntax-entry ?^ "_" table)
+    (modify-syntax-entry ?~ "_" table)
+    (modify-syntax-entry ?\( "()" table)
+    (modify-syntax-entry ?\) ")(" table)
+    (modify-syntax-entry ?\{ "(}" table)
+    (modify-syntax-entry ?\} "){" table)
+    (modify-syntax-entry ?\[ "(]" table)
+    (modify-syntax-entry ?\] ")[" table)
+    table))
+
 (provide 'fuel-base)
+
 ;;; fuel-base.el ends here