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): -