From: Don Armstrong Date: Sat, 18 Jul 2015 00:42:52 +0000 (-0500) Subject: remove ecasound and emacs wiki X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=238b24ca30f2e642d808cd7b41e84e362db3a2d5;p=lib.git remove ecasound and emacs wiki --- diff --git a/emacs_el/ecasound.el b/emacs_el/ecasound.el deleted file mode 100644 index 895ee0c..0000000 --- a/emacs_el/ecasound.el +++ /dev/null @@ -1,2321 +0,0 @@ -;;; ecasound.el --- Interactive and programmatic interface to Ecasound - -;; Copyright (C) 2001, 2002 Mario Lang - -;; Author: Mario Lang -;; Keywords: audio, ecasound, eci, comint, process, pcomplete -;; Version: 0.8.2 - -;; This file is free software; you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 2, or (at your option) -;; any later version. - -;; This file is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs; see the file COPYING. If not, write to -;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;; This file implements several aspects of ecasound use: -;; -;; * A derived-major-mode, from comint mode for an inferior ecasound -;; process (ecasound-aim-mode). Complete with context sensitive -;; completion and interactive features to control the current process -;; using ECI. -;; -;; * Ecasound Control Interface (ECI) library for programmatic control -;; of a Ecasound process. This allows you to write Ecasound batch -;; jobs in Emacs-Lisp with Lisp functions and return values. Have a -;; look at eci-example and ecasound-normalize. -;; -;; * ecasound-ewf-mode, a mode for editing .ewf files. -;; -;; -;; Usage: -;; -;; You need at least ecasound 2.2.0 for this file to work properly. -;; -;; Put ecasound.el in your load-path and require it in your .emacs. -;; Set `ecasound-program' to the path to your ecasound executable. -;; -;; (setq load-path (cons "/home/user/elisp") -;; (require 'ecasound) -;; (setq ecasound-program "/home/user/bin/ecasound" -;; eci-program "/home/user/bin/ecasound") -;; -;; To set ecasound startup options use -;; -;; M-x ecasound-customize-startup RET -;; -;; Then use M-x ecasound RET to invoke an inferior ecasound process. -;; -;; For programmatic use of the ECI API, have a look at `eci-init', -;; `eci-command' and in general the eci-* namespace. -;; -;; Compatibility: -;; -;; This file only works with GNU Emacs 21. I've invested some minimal efforts -;; to get it working with XEmacs, but have so far failed to succeed. -;; Motivation isn't very high to get it working with XEmacs since I personally -;; never use it. So if you would like to use ecasound.el under XEmacs, you -;; will have ttodo -;; M-x toggle-debug-on-error RET -;; and see what you can figure out. I'm happy to receive useful suggestions. -;; -;; Todo: -;; -;; * Find a better way to do status info fetching... -;; * Add more conditions to the menu. -;; * Use map-xxx-list data in the ecasound-copp widget. This means we -;; need to merge cop-status and map-cop-list data somehow or have -;; the cop-editor fetch hints from map-cop/ladpsa/preset-list. -;; * Make `ecasound-signalview' faster, and allow to invoke it on already -;; opened sessions. -;; * Fix the case where ecasound sends output *after* the prompt. -;; This is tricky! Fixed for internal parsing, probably will leave -;; like that for interactive use, not worth the trouble... -;; * Copy documentation for ECI commands into eci-* docstrings and menu -;; :help keywords. -;; * Expand the menu. -;; * Bind most important interactive functions in ecasound-iam-mode-map -;; (which layout to use?) - -;;; History: -;; -;; Version: 0.8.2 -;; -;; * Added quite some missing docstrings. -;; * New variable `ecasound-last-command-alist'. Use that to do fancy stuff -;; to certain commands return values. -;; * New variable `ecasound-type-alist'. Normally you should not need to -;; change this, but it's nice to have it configurable. -;; * New function `eci-is-valid-p'. Rationale is that nil as return -;; value of a ECI command should indicate an error. So this function -;; with a -p suffix to use as a predicate. -;; * New variable `ecasound-parent' holds the parent buffer in a daemon buffer. -;; * New variables ecasound-timer-flag&interval. -;; * Renamed `eci-output-filter' to `ecasound-output-filter'. -;; * New variable ecasound-mode|header-line-format. -;; * `ecasound-cop-edit' now uses cop-set instead of -;; cop-select+copp-select+copp-set to update values. -;; * Fixed multiple-argument handling. They are separated with ',', not -;; with a space. -;; * New variable ecasound-sending-command, used to prevent the background -;; timer from coliding with other ECI requests. -;; -;; Version: 0.8.1 -;; -;; * Make ai|ao|cs-forward|rewind use ai|ao|cs-selected in the prompt -;; string of the interactive spec. -;; * New keymaps ecasound-audioin|audioout-map. -;; Now you can be very quick: -;; M-x ecasound RET M-i a - - -\n" - "The form presenting for doing searches when using httpd.el." - :type 'string - :group 'emacs-wiki-http) - -(defcustom emacs-wiki-http-support-editing t - "If non-nil, allow direct editing when serving over httpd.el. -Note that a page can be edited only if it is world-writable and -`emacs-wiki-use-mode-flags' is set, or if it matches one of the -regexps in `emacs-wiki-editable-pages'." - :type 'boolean - :group 'emacs-wiki-http) - -(defcustom emacs-wiki-http-edit-form - " -
- -
- -
-
\n" - "The form presenting for doing edits when using httpd.el." - :type 'string - :group 'emacs-wiki-http) - -(defun emacs-wiki-http-send-buffer (&optional title modified code - msg no-markup) - "Markup and send the contents of the current buffer via HTTP." - (unless no-markup (emacs-wiki-replace-markup title)) - (princ "HTTP/1.0 ") - (princ (or code 200)) - (princ " ") - (princ (or msg "OK")) - (princ httpd-line-terminator) - (princ "Server: emacs-wiki.el/2.26") - (princ httpd-line-terminator) - (princ "Connection: close") - (princ httpd-line-terminator) - (princ "MIME-Version: 1.0") - (princ httpd-line-terminator) - (princ "Date: ") - (princ (format-time-string "%a, %e %b %Y %T %Z")) - (princ httpd-line-terminator) - (princ "From: ") - (princ (substring emacs-wiki-maintainer 7)) - (when modified - (princ httpd-line-terminator) - (princ "Last-Modified: ") - (princ (format-time-string "%a, %e %b %Y %T %Z" modified))) - (princ httpd-line-terminator) - (princ "Content-Type: text/html; charset=iso-8859-1") - (princ httpd-line-terminator) - (princ "Content-Length: ") - (princ (1- (point-max))) - (princ httpd-line-terminator) - (princ httpd-line-terminator) - (princ (buffer-string))) - -(defun emacs-wiki-http-reject (title msg &optional annotation) - (with-temp-buffer - (insert msg ".\n") - (if annotation - (insert annotation "\n")) - (emacs-wiki-http-send-buffer title nil 404 msg))) - -(defvar emacs-wiki-buffer-mtime nil) -(make-variable-buffer-local 'emacs-wiki-buffer-mtime) - -(defun emacs-wiki-sort-buffers (l r) - (let ((l-mtime (with-current-buffer l - emacs-wiki-buffer-mtime)) - (r-mtime (with-current-buffer r - emacs-wiki-buffer-mtime))) - (cond - ((and (null l-mtime) (null r-mtime)) l) - ((null l-mtime) r) - ((null r-mtime) l) - (t (emacs-wiki-time-less-p r-mtime l-mtime))))) - -(defun emacs-wiki-winnow-list (entries &optional predicate) - "Return only those ENTRIES for which PREDICATE returns non-nil." - (let ((flist (list t)) - valid p) - (let ((entry entries)) - (while entry - (if (funcall predicate (car entry)) - (nconc flist (list (car entry)))) - (setq entry (cdr entry)))) - (cdr flist))) - -(defcustom emacs-wiki-max-cache-size 64 - "The number of pages to cache when serving over HTTP. -This only applies if set while running the persisted invocation -server. See main documentation for the `emacs-wiki-http' -customization group." - :type 'integer - :group 'emacs-wiki-http) - -(defun emacs-wiki-prune-cache () - "If the page cache has become too large, prune it." - (let* ((buflist (sort (emacs-wiki-winnow-list - (buffer-list) - (function - (lambda (buf) - (with-current-buffer buf - emacs-wiki-buffer-mtime)))) - 'emacs-wiki-sort-buffers)) - (len (length buflist))) - (while (> len emacs-wiki-max-cache-size) - (kill-buffer (car buflist)) - (setq len (1- len))))) - -(defun emacs-wiki-render-page (name) - "Render the wiki page identified by NAME. -When serving from a dedicated Emacs process (see the httpd-serve -script), a maximum of `emacs-wiki-max-cache-size' pages will be cached -in memory to speed up serving time." - (if (equal name emacs-wiki-index-page) - (with-current-buffer (emacs-wiki-generate-index t t) - (emacs-wiki-http-send-buffer "Wiki Index") - (kill-buffer (current-buffer))) - (let ((file (and (not (emacs-wiki-private-p name)) - (cdr (assoc name (emacs-wiki-file-alist))))) - (inhibit-read-only t)) - (if (null file) - (emacs-wiki-http-reject "Page not found" - (format "Wiki page %s not found" name)) - (set-buffer (get-buffer-create file)) - (let ((modified-time (nth 5 (file-attributes file)))) - (when (or (null emacs-wiki-buffer-mtime) - (emacs-wiki-time-less-p emacs-wiki-buffer-mtime - modified-time)) - (erase-buffer) - (setq emacs-wiki-buffer-mtime modified-time)) - (goto-char (point-max)) - (if (not (bobp)) - (emacs-wiki-http-send-buffer nil emacs-wiki-buffer-mtime - nil nil t) - (insert-file-contents file t) - (cd (file-name-directory file)) - (emacs-wiki-maybe) - (emacs-wiki-http-send-buffer nil emacs-wiki-buffer-mtime))) - (set-buffer-modified-p nil) - (emacs-wiki-prune-cache))))) - -(defun emacs-wiki-wikify-search-results (term) - "Convert the current buffer's grep results into a Wiki form." - (goto-char (point-max)) - (forward-line -2) - (delete-region (point) (point-max)) - (goto-char (point-min)) - (kill-line 2) - (let ((results (list t))) - (while (re-search-forward "^.+/\\([^/:]+\\):\\s-*[0-9]+:\\(.+\\)" nil t) - (let ((page (match-string 1))) - (unless (or (emacs-wiki-private-p page) - (string-match emacs-wiki-file-ignore-regexp page)) - (let ((text (match-string 2)) - (entry (assoc page results))) - (if entry - (nconc (cdr entry) (list text)) - (nconc results (list (cons page (list text))))))))) - (delete-region (point-min) (point-max)) - (setq results - (sort (cdr results) - (function - (lambda (l r) - (string-lessp (car l) (car r)))))) - (while results - (unless (emacs-wiki-private-p (caar results)) - (insert "[[" (caar results) "]] ::\n

") - (let ((hits (cdar results))) - (while hits - (while (string-match "" (car hits)) - (setcar hits (replace-match "" t t (car hits)))) - (while (string-match (concat "\\([^*?[/>]\\)\\<\\(" term "\\)\\>") - (car hits)) - (setcar hits (replace-match "\\1\\2" - t nil (car hits)))) - (insert " > " (car hits) "\n") - (setq hits (cdr hits)))) - (insert "

\n\n")) - (setq results (cdr results))))) - -(defun emacs-wiki-setup-edit-page (page-name) - (insert "" emacs-wiki-http-edit-form "") - (goto-char (point-min)) - (search-forward "%PAGE%") - (replace-match page-name t t) - (search-forward "%TEXT%") - (let ((beg (match-beginning 0)) - (file (emacs-wiki-page-file page-name)) - end) - (delete-region beg (point)) - (when file - (insert-file-contents file) - (save-restriction - (narrow-to-region beg (point)) - (goto-char (point-min)) - (emacs-wiki-escape-html-specials))))) - -(defun emacs-wiki-http-changewiki (&optional content) - "Change the contents of Wiki page, using the results of a POST request." - (require 'cgi) - (unless content - (goto-char (point-min)) - (if (not (re-search-forward "Content-length:\\s-*\\([0-9]+\\)" nil t)) - (emacs-wiki-http-reject "Content-length missing" - "No Content-length for POST request" - (concat "Header received was:\n\n" - (buffer-string) "\n")) - (let ((content-length (string-to-number (match-string 1)))) - (erase-buffer) - (read-event) ; absorb the CRLF separator - (let ((i 0)) - (while (< i content-length) - (insert (read-event)) - (setq i (1+ i)))))) - (setq content (buffer-string))) - (when content - (let* ((result (cgi-decode content)) - (page (caar result)) - (text (cdar result)) - (len (length text)) - (require-final-newline t) - (pos 0) illegal user) - (if (not (emacs-wiki-editable-p page)) - (emacs-wiki-http-reject - "Editing not allowed" - (format "Editing Wiki page %s is not allowed" page)) - (while (and (null illegal) - (setq pos (string-match "<\\s-*\\([^> \t]+\\)" - text pos))) - (setq pos (match-end 0)) - (if (assoc (match-string 1 text) emacs-wiki-dangerous-tags) - (setq illegal (match-string 1 text)))) - (if illegal - (emacs-wiki-http-reject - "Disallowed tag used" - (format "Public use of <%s> tag not allowed" illegal)) - (emacs-wiki-find-file page) - (if (setq user (file-locked-p buffer-file-name)) - (emacs-wiki-http-reject - "Page is locked" - (format "The page \"%s\" is currently being edited by %s." - page (if (eq user t) (user-full-name) user))) - (let ((inhibit-read-only t) - (delete-old-versions t)) - (erase-buffer) - (insert (if (eq (aref text (1- len)) ?%) - (substring text 0 (1- len)) - text)) - (goto-char (point-min)) - (while (re-search-forward "\r$" nil t) - (replace-match "" t t)) - (save-buffer) - ;; this is 0666 - there is no read syntax for octals which - ;; works across all emacsen - (let ((oct 438)) - (when (/= (file-modes buffer-file-name) oct) - (set-file-modes buffer-file-name oct))) - (kill-buffer (current-buffer))) - (with-temp-buffer - (emacs-wiki-file-alist) ; force re-check - (insert "") - (insert "Thank you, your changes have been saved to " page) - (insert ". You will be redirected to " - "the new page in a moment.") - (insert "") - (emacs-wiki-http-send-buffer "Changes Saved")))))))) - -(defvar httpd-vars nil) - -(defsubst httpd-var (var) - "Return value of VAR as a URL variable. If VAR doesn't exist, nil." - (cdr (assoc var httpd-vars))) - -(defsubst httpd-var-p (var) - "Return non-nil if VAR was passed as a URL variable." - (not (null (assoc var httpd-vars)))) - -(defun emacs-wiki-serve-page (page content) - (let ((handled t)) - (cond - ((string-match "\\`wiki\\?\\(.+\\)" page) - (emacs-wiki-render-page (match-string 1 page))) - - ((string-match "\\`editwiki\\?\\(.+\\)" page) - (let ((page-name (match-string 1 page))) - (if (not (emacs-wiki-editable-p page-name)) - (emacs-wiki-http-reject "Editing not allowed" - "Editing this Wiki page is not allowed") - (with-temp-buffer - (emacs-wiki-setup-edit-page page-name) - ;; this is required because of the : in the name - (emacs-wiki-http-send-buffer - (concat "Edit Wiki Page: " page-name)))))) - - ((string-match "\\`searchwiki\\?get" page) - (with-temp-buffer - (insert "" emacs-wiki-http-search-form "") - (emacs-wiki-http-send-buffer "Search Wiki Pages"))) - - ((string-match "\\`searchwiki\\?q=\\(.+\\)" page) - (let ((compilation-scroll-output nil) - (term (match-string 1 page))) - (unintern 'start-process) - (require 'compile) - (with-current-buffer (emacs-wiki-grep term) - (emacs-wiki-wikify-search-results term) - (emacs-wiki-http-send-buffer "Search Results") - (kill-buffer (current-buffer))))) - - ((string-match "\\`changewiki\\?post" page) - (emacs-wiki-http-changewiki content)) - - ((string-match "\\`diffwiki\\?\\(.+\\)" page) - ;; jww (2001-04-20): This code doesn't fully work yet. - (emacs-wiki-find-file (match-string 1 page)) - (require 'vc) - (require 'vc-hooks) - (let ((curr-ver (vc-workfile-version buffer-file-name))) - (vc-version-diff buffer-file-name - curr-ver (vc-previous-version curr-ver)) - (let ((inhibit-read-only t)) - (goto-char (point-min)) - (when (re-search-forward "^diff" nil t) - (forward-line) - (delete-region (point-min) (point))) - (insert "
")
-	  (emacs-wiki-escape-html-specials)
-	  (goto-char (point-max))
-	  (if (re-search-backward "^Process.*killed" nil t)
-	      (delete-region (point) (point-max)))
-	  (insert "
") - (emacs-wiki-http-send-buffer "Diff Results")))) - - (t - (setq handled nil))) - handled)) - -(defun emacs-wiki-serve (page &optional content) - "Serve the given PAGE from this emacs-wiki server." - ;; index.html is really a reference to the main Wiki page - (if (string= page "index.html") - (setq page (concat "wiki?" emacs-wiki-home-page))) - - ;; handle the actual request - (let ((vc-follow-symlinks t) - (emacs-wiki-report-threshhold nil) - (emacs-wiki-serving-p t) - httpd-vars project) - (save-excursion - ;; process any CGI variables, if cgi.el is available - (if (string-match "\\`\\([^&]+\\)&" page) - (setq httpd-vars - (and (fboundp 'cgi-decode) - (cgi-decode (substring page (match-end 0)))) - page (match-string 1 page))) - (setq project (httpd-var "project")) - (if project - (with-emacs-wiki-project project - (emacs-wiki-serve-page page content)) - (emacs-wiki-serve-page page content))))) - -(if (featurep 'httpd) - (httpd-add-handler "\\`\\(index\\.html\\|.*wiki\\(\\?\\|\\'\\)\\)" - 'emacs-wiki-serve)) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; -;; Support for multile Emacs Wiki projects -;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -(defgroup emacs-wiki-project nil - "Options controlling multi-project behavior in Emacs-Wiki." - :group 'emacs-wiki) - -(defvar emacs-wiki-current-project nil) -(defvar emacs-wiki-predicate nil) -(defvar emacs-wiki-major-mode nil) -(defvar emacs-wiki-project-server-prefix nil) - -(defcustom emacs-wiki-show-project-name-p t - "When true, display the current project name in the mode-line" - :group 'emacs-wiki - :type 'boolean) - -;; this might go away - did anyone prefer the old behavior? tell me! -(defvar emacs-wiki-old-project-change-p nil) - -(defcustom emacs-wiki-update-project-hook - '(emacs-wiki-update-project-interwikis) - "A hook called whenever `emacs-wiki-projects' is modified. -By default, this hook is used to update the Interwiki table so that it -contains links to each project name." - :type 'hook - :group 'emacs-wiki-project) - -(defun emacs-wiki-update-project-interwikis () - (let ((projs emacs-wiki-projects)) - (while projs - (add-to-list - 'emacs-wiki-interwiki-names - `(,(caar projs) - . (lambda (tag) - (emacs-wiki-project-interwiki-link ,(caar projs) tag)))) - (setq projs (cdr projs))))) - -(defcustom emacs-wiki-projects nil - "A list of project-specific Emacs-Wiki variable settings. -Each entry is a cons cell, of the form (PROJECT VARS). - -Projects are useful for maintaining separate wikis that vary in -some way. For instance, you might want to keep your work-related -wiki files in a separate directory, with a different fill-column: - -(setq emacs-wiki-projects - `((\"default\" . ((emacs-wiki-directories . (\"~/wiki\")))) - (\"work\" . ((fill-column . 65) - (emacs-wiki-directories . (\"~/workwiki/\")))))) - -You can then change between them with \\[emacs-wiki-change-project], -by default bound to C-c C-v. When you use \\[emacs-wiki-find-file] to -find a new file, emacs-wiki will attempt to detect which project it -is part of by finding the first project where emacs-wiki-directories -contains that file. - -VARS is an alist of symbol to value mappings, to be used locally in -all emacs-wiki buffers associated with that PROJECT. - -You may also set the variable `emacs-wiki-predicate' in this alist, -which should be a function to determine whether or not the project -pertains to a certain buffer. It will be called within the buffer in -question. The default predicate checks whether the file exists within -`emacs-wiki-directories' for that project. - -The variable `emacs-wiki-major-mode' can be used to determine the -major mode for a specific emacs-wiki buffer, in case you have -developed a customized major-mode derived from `emacs-wiki-mode'. - -The variable `emacs-wiki-project-server-prefix' is prepended to the -Interwiki URL, whenever an Interwiki reference to another project is -made. For example, if you had two projects, A and B, and in A you -made a reference to B by typing B#WikiPage, A needs to know what -directory or server to prepend to the WikiPage.html href. If this -variable is not set, it is assumed that both A and B publish to the -same location. - -If any variable is not customized specifically for a project, the -global value is used." - :type `(repeat - (cons - :tag "Emacs-Wiki Project" - (string :tag "Project name") - (repeat - (choice - (cons :tag "emacs-wiki-predicate" - (const emacs-wiki-predicate) function) - (cons :tag "emacs-wiki-major-mode" - (const emacs-wiki-major-mode) function) - (cons :tag "emacs-wiki-project-server-prefix" - (const emacs-wiki-project-server-prefix) string) - ,@(mapcar - (function - (lambda (sym) - (list 'cons :tag (symbol-name sym) - (list 'const sym) - (get sym 'custom-type)))) - (apropos-internal "\\`emacs-wiki-" - (function - (lambda (sym) - (and (not (eq sym 'emacs-wiki-projects)) - (get sym 'custom-type)))))))))) - :set (function - (lambda (sym val) - (set sym val) - (run-hooks 'emacs-wiki-update-project-hook))) - :group 'emacs-wiki-project) - -(defmacro with-emacs-wiki-project (project &rest body) - "Evaluate as part of PROJECT the given BODY forms." - `(with-temp-buffer - (emacs-wiki-change-project ,project) - ,@body)) - -(put 'with-emacs-wiki-project 'lisp-indent-function 1) - -(defun emacs-wiki-change-project (project) - "Manually change the project associated with the current buffer." - (interactive (list (completing-read "Switch to project: " - emacs-wiki-projects - nil t nil))) - (let ((projsyms (cdr (assoc project emacs-wiki-projects))) - sym) - (while projsyms - (setq sym (caar projsyms)) - (unless (memq sym '(emacs-wiki-predicate emacs-wiki-major-mode)) - (let ((custom-set (or (get sym 'custom-set) 'set)) - (var (if (eq (get sym 'custom-type) 'hook) - (make-local-hook sym) - (make-local-variable sym)))) - (if custom-set - (funcall custom-set var (cdar projsyms))))) - (setq projsyms (cdr projsyms)))) - (when (not (string= emacs-wiki-current-project project)) - ;; if it was a user request to change, change to the welcome buffer first - (if (and (interactive-p) - (not emacs-wiki-old-project-change-p)) - (with-emacs-wiki-project - project (emacs-wiki-visit-link emacs-wiki-default-page)) - (set (make-local-variable 'emacs-wiki-current-project) project) - (when emacs-wiki-show-project-name-p - (setq mode-name (concat "Wiki[" project "]")))))) - -(defun emacs-wiki-project-interwiki-link (project tag) - (with-emacs-wiki-project project - (if emacs-wiki-publishing-p - (concat emacs-wiki-project-server-prefix - (emacs-wiki-link-url (or tag emacs-wiki-home-page))) - (or (emacs-wiki-page-file (or tag emacs-wiki-home-page)) - ;; doesn't yet exist, so we don't qualify the name, causing it to be - ;; rendered as a bad link - tag)))) - -(provide 'emacs-wiki) -;;; emacs-wiki.el ends here