2007年01月31日
リージョンを シェルコマンドの実行結果で置換3
- 2007-01-31 (Wed)
- ソフトウェア ( Meadow/Emacs )
整理してこんな形になった.まだ微妙にあやしいけどそのうちちゃんと elisp を勉強しよう.
(defun filter-command-region (start end command)
"Filter region by a command.
The region is passed to the command as input.
The region is overwritten by the result."
(interactive (perfom-command-region-interactive-func
"Shell command on region (filtering): "))
(perform-command-region-general start end command nil nil t))
(defun perform-command-region (start end command)
"Perform a command on region.
The region is passed to the command as input.
The region remains on top of the result."
(interactive (perfom-command-region-interactive-func
"Shell command on region: "))
(perform-command-region-general start end command nil nil nil))
(defun perform-command-region-comment (start end command)
"Perform a command on comment-region.
The region is uncommented and then passed to the command as input.
The comment-region remains on top of the result."
(interactive (perfom-command-region-interactive-func
"Shell command on commented region: "))
(perform-command-region-general start end command t nil nil))
(defun perfom-command-region-interactive-func (msg)
"A general interaction function for perform-command-region-general..."
(let (string)
(unless (mark)
(error "The mark is not set now, so there is no region"))
;; Do this before calling region-beginning
;; and region-end, in case subprocess output
;; relocates them while we are in the minibuffer.
(setq string (read-from-minibuffer msg
nil nil nil
'shell-command-history))
;; call-interactively recognizes region-beginning and
;; region-end specially, leaving them in the history.
(list (region-beginning) (region-end) string)))
;;
;; perform a command on region.
;;
(defun perform-command-region-general (start end command uncomment comment overwrite)
"A general function to perform a command on region.
uncomment: Set t to uncomment the region before passing it to the command.
comment : Set t to comment-out the region after the command.
overwrite: Set t to overwrite the region with the result of the command.
Otherwise the original region remains on top of the result.
"
(let ((swap (< start end)) (exit-status))
(if (not overwrite)
(let ()
(kill-region start end)
(setq sp (point-marker))
(yank nil)
(setq ep (point-marker)))
(let ()
(goto-char start)
(setq sp (point-marker))
(goto-char end)
(setq ep (point-marker))))
;; uncomment the region
(and uncomment (uncomment-region (marker-position sp) (marker-position ep))
(goto-char (marker-position sp))
(setq exit-status
;; see describe-function
;; error output is marged into standard output
(call-process-region (marker-position sp) (marker-position ep) shell-file-name t
(list t t)
nil shell-command-switch command))
;; swap the point and mark if necessary
(and swap (goto-char (marker-position sp)))
;; yank the original contents
(if (not overwrite)
(let ()
(setq p1 (point-marker))
(yank nil)
(setq p2 (point-marker))
(and comment (comment-region (marker-position p1) (marker-position p2)))
(setq p1 nil)
(setq p2 nil)
))
(setq sp nil)
(setq ep nil)
exit-status))
;;
;; Key bindings
;;
(defun filter-command-region-keybindings ()
"Set up default key bindings for filter-command-region, ..."
(interactive)
(define-key global-map [(control ?!)] 'filter-command-region)
(define-key global-map [(control meta ?#)] 'perform-command-region)
(define-key global-map [(control meta ?!)] 'perform-command-region-comment))
- Comments: 0
- TrackBack (Close): -