Home > ソフトウェア > リージョンを シェルコマンドの実行結果で置換3

リージョンを シェルコマンドの実行結果で置換3

整理してこんな形になった.まだ微妙にあやしいけどそのうちちゃんと 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))
★下記に2つの英単語をスペースで区切って入力してください

Home > ソフトウェア > リージョンを シェルコマンドの実行結果で置換3

Search
Feeds

Page Top