(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)
(setq n (if arg (prefix-numeric-value arg) (point-max)))
(if (< cc (current-column))
(if (= (preceding-char) ?\t)
(progn
(setq string (make-string (min n (- (current-column) cc)) ?\s))
(setq n (- n (min n (- (current-column) cc)))))
(backward-char 1)))
(setq string (concat string
(buffer-substring
(point)
(min (save-excursion (end-of-line) (point))
(+ n (point)))))))
(insert string)))
(defun zap-up-to-char (arg char)
"Kill up to, but not including ARGth occurrence of CHAR.
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)))))
(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)
"Uppercasify ARG chars starting from point. Point doesn't move."
(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)))
(provide 'misc)