X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/430d2ee2919b2d4693780f2474ba40148442d206..ce1438d696bd670b5aba5690ce4f73b836b20194:/lisp/misc.el diff --git a/lisp/misc.el b/lisp/misc.el index c4ea715392..8087c7f525 100644 --- a/lisp/misc.el +++ b/lisp/misc.el @@ -1,17 +1,17 @@ -;;; misc.el --- some nonstandard basic editing commands for Emacs +;;; misc.el --- some nonstandard editing and utility commands for Emacs -;; Copyright (C) 1989, 2001, 2002, 2003, 2004, 2005, -;; 2006, 2007, 2008 Free Software Foundation, Inc. +;; Copyright (C) 1989, 2001-2011 Free Software Foundation, Inc. ;; Maintainer: FSF ;; Keywords: convenience +;; Package: emacs ;; This file is part of GNU Emacs. -;; GNU Emacs is free software; you can redistribute it and/or modify +;; GNU Emacs 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 3, or (at your option) -;; any later version. +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. ;; GNU Emacs is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -19,14 +19,15 @@ ;; 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., 51 Franklin Street, Fifth Floor, -;; Boston, MA 02110-1301, USA. +;; along with GNU Emacs. If not, see . ;;; Commentary: ;;; Code: +(eval-when-compile + (require 'tabulated-list)) + (defun copy-from-above-command (&optional arg) "Copy characters from previous nonblank line, starting just above point. Copy ARG characters, but not past the end of that line. @@ -55,7 +56,7 @@ The characters copied are inserted in the buffer before point." (setq string (concat string (buffer-substring (point) - (min (save-excursion (end-of-line) (point)) + (min (line-end-position) (+ n (point))))))) (insert string))) @@ -108,7 +109,82 @@ With argument, do this that many times." (interactive "p") (forward-to-word (- arg))) +;;;###autoload +(defun butterfly () + "Use butterflies to flip the desired bit on the drive platter. +Open hands and let the delicate wings flap once. The disturbance +ripples outward, changing the flow of the eddy currents in the +upper atmosphere. These cause momentary pockets of higher-pressure +air to form, which act as lenses that deflect incoming cosmic rays, +focusing them to strike the drive platter and flip the desired bit. +You can type `M-x butterfly C-M-c' to run it. This is a permuted +variation of `C-x M-c M-butterfly' from url `http://xkcd.com/378/'." + (interactive) + (if (yes-or-no-p "Do you really want to unleash the powers of the butterfly? ") + (progn + (switch-to-buffer (get-buffer-create "*butterfly*")) + (erase-buffer) + (sit-for 0) + (animate-string "Amazing physics going on..." + (/ (window-height) 2) (- (/ (window-width) 2) 12)) + (sit-for (* 5 (/ (abs (random)) (float most-positive-fixnum)))) + (message "Successfully flipped one bit!")) + (message "Well, then go to xkcd.com!") + (browse-url "http://xkcd.com/378/"))) + +;; A command to list dynamically loaded libraries. This useful in +;; environments where dynamic-library-alist is used, i.e., Windows + +(defvar list-dynamic-libraries--loaded-only-p) +(make-variable-buffer-local 'list-dynamic-libraries--loaded-only-p) + +(defun list-dynamic-libraries--refresh () + "Recompute the list of dynamic libraries. +Internal use only." + (setq tabulated-list-format ; recomputed because column widths can change + (let ((max-id-len 0) (max-name-len 0)) + (dolist (lib dynamic-library-alist) + (let ((id-len (length (symbol-name (car lib)))) + (name-len (apply 'max (mapcar 'length (cdr lib))))) + (when (> id-len max-id-len) (setq max-id-len id-len)) + (when (> name-len max-name-len) (setq max-name-len name-len)))) + (vector (list "Library" (1+ max-id-len) t) + (list "Loaded from" (1+ max-name-len) t) + (list "Candidate names" 0 t)))) + (tabulated-list-init-header) + (setq tabulated-list-entries nil) + (dolist (lib dynamic-library-alist) + (let* ((id (car lib)) + (from (get id :loaded-from))) + (when (or from + (not list-dynamic-libraries--loaded-only-p)) + (push (list id (vector (symbol-name id) + (or from "") + (mapconcat 'identity (cdr lib) ", "))) + tabulated-list-entries))))) + +;;;###autoload +(defun list-dynamic-libraries (&optional loaded-only-p buffer) + "Display a list of all dynamic libraries known to Emacs. +\(These are the libraries listed in `dynamic-library-alist'.) +If optional argument LOADED-ONLY-P (interactively, prefix arg) +is non-nil, only libraries already loaded are listed. +Optional argument BUFFER specifies a buffer to use, instead of +\"*Dynamic Libraries*\". +The return value is always nil." + (interactive "P") + (unless (bufferp buffer) + (setq buffer (get-buffer-create "*Dynamic Libraries*"))) + (with-current-buffer buffer + (tabulated-list-mode) + (setq tabulated-list-sort-key (cons "Library" nil)) + (add-hook 'tabulated-list-revert-hook 'list-dynamic-libraries--refresh nil t) + (setq list-dynamic-libraries--loaded-only-p loaded-only-p) + (list-dynamic-libraries--refresh) + (tabulated-list-print)) + (display-buffer buffer) + nil) + (provide 'misc) -;;; arch-tag: 908f7884-c19e-4388-920c-9cfa425e449b ;;; misc.el ends here