misc.el 4.63 KB
Newer Older
Richard M. Stallman's avatar
Richard M. Stallman committed
1
;;; misc.el --- some nonstandard basic editing commands for Emacs
Eric S. Raymond's avatar
Eric S. Raymond committed
2

3
;; Copyright (C) 1989, 2001-2011  Free Software Foundation, Inc.
Jim Blandy's avatar
Jim Blandy committed
4

Eric S. Raymond's avatar
Eric S. Raymond committed
5
;; Maintainer: FSF
Pavel Janík's avatar
Pavel Janík committed
6
;; Keywords: convenience
7
;; Package: emacs
Eric S. Raymond's avatar
Eric S. Raymond committed
8

Jim Blandy's avatar
Jim Blandy committed
9 10
;; This file is part of GNU Emacs.

11
;; GNU Emacs is free software: you can redistribute it and/or modify
Jim Blandy's avatar
Jim Blandy committed
12
;; it under the terms of the GNU General Public License as published by
13 14
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.
Jim Blandy's avatar
Jim Blandy committed
15 16 17 18 19 20 21

;; GNU Emacs 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
22
;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
Jim Blandy's avatar
Jim Blandy committed
23

24 25
;;; Commentary:

Eric S. Raymond's avatar
Eric S. Raymond committed
26
;;; Code:
Jim Blandy's avatar
Jim Blandy committed
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48

(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.
If no argument given, copy the entire rest of the line.
The characters copied are inserted in the buffer before point."
  (interactive "P")
  (let ((cc (current-column))
	n
	(string ""))
    (save-excursion
      (beginning-of-line)
      (backward-char 1)
      (skip-chars-backward "\ \t\n")
      (move-to-column cc)
      ;; Default is enough to copy the whole rest of the line.
      (setq n (if arg (prefix-numeric-value arg) (point-max)))
      ;; If current column winds up in middle of a tab,
      ;; copy appropriate number of "virtual" space chars.
      (if (< cc (current-column))
	  (if (= (preceding-char) ?\t)
	      (progn
49
		(setq string (make-string (min n (- (current-column) cc)) ?\s))
Jim Blandy's avatar
Jim Blandy committed
50 51 52 53 54 55
		(setq n (- n (min n (- (current-column) cc)))))
	    ;; In middle of ctl char => copy that whole char.
	    (backward-char 1)))
      (setq string (concat string
			   (buffer-substring
			    (point)
56
			    (min (line-end-position)
Jim Blandy's avatar
Jim Blandy committed
57 58
				 (+ n (point)))))))
    (insert string)))
Eric S. Raymond's avatar
Eric S. Raymond committed
59

Lute Kamstra's avatar
Lute Kamstra committed
60 61 62
;; Variation of `zap-to-char'.

(defun zap-up-to-char (arg char)
63
  "Kill up to, but not including ARGth occurrence of CHAR.
Lute Kamstra's avatar
Lute Kamstra committed
64 65 66 67 68 69 70 71 72 73 74 75 76
Case is ignored if `case-fold-search' is non-nil in the current buffer.
Goes backward if ARG is negative; error if CHAR not found.
Ignores CHAR at point."
  (interactive "p\ncZap up to char: ")
  (let ((direction (if (>= arg 0) 1 -1)))
    (kill-region (point)
		 (progn
		   (forward-char direction)
		   (unwind-protect
		       (search-forward (char-to-string char) nil nil arg)
		     (backward-char direction))
		   (point)))))

77 78 79 80 81 82 83 84 85 86 87 88 89 90
;; These were added with an eye to making possible a more CCA-compatible
;; command set; but that turned out not to be interesting.

(defun mark-beginning-of-buffer ()
  "Set mark at the beginning of the buffer."
  (interactive)
  (push-mark (point-min)))

(defun mark-end-of-buffer ()
  "Set mark at the end of the buffer."
  (interactive)
  (push-mark (point-max)))

(defun upcase-char (arg)
Lute Kamstra's avatar
Lute Kamstra committed
91
  "Uppercasify ARG chars starting from point.  Point doesn't move."
92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
  (interactive "p")
  (save-excursion
    (upcase-region (point) (progn (forward-char arg) (point)))))

(defun forward-to-word (arg)
  "Move forward until encountering the beginning of a word.
With argument, do this that many times."
  (interactive "p")
  (or (re-search-forward (if (> arg 0) "\\W\\b" "\\b\\W") nil t arg)
      (goto-char (if (> arg 0) (point-max) (point-min)))))

(defun backward-to-word (arg)
  "Move backward until encountering the end of a word.
With argument, do this that many times."
  (interactive "p")
  (forward-to-word (- arg)))

Juri Linkov's avatar
Juri Linkov committed
109 110
;;;###autoload
(defun butterfly ()
111 112 113 114 115 116 117 118
  "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/'."
Juri Linkov's avatar
Juri Linkov committed
119 120 121
  (interactive)
  (if (yes-or-no-p "Do you really want to unleash the powers of the butterfly? ")
      (progn
122 123 124 125 126
	(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))
Juri Linkov's avatar
Juri Linkov committed
127 128
	(sit-for (* 5 (/ (abs (random)) (float most-positive-fixnum))))
	(message "Successfully flipped one bit!"))
129 130
    (message "Well, then go to xkcd.com!")
    (browse-url "http://xkcd.com/378/")))
Juri Linkov's avatar
Juri Linkov committed
131

Richard M. Stallman's avatar
Richard M. Stallman committed
132 133
(provide 'misc)

Eric S. Raymond's avatar
Eric S. Raymond committed
134
;;; misc.el ends here