朝顔日記

続・よく使う置換をダイアログから

2003-12-22

20日の「よく使う置換をダイアログから」の lisp がバージョンアップして、複数文字列の置換に対応しました。multiple-replace の機能を利用するので、multiple-replace が必要です。もっとも、昨夜、multiple-replace 自体バージョンアップして multiple-replace 単体でも検索文字列、置換文字列のセットの設定を保存できるようになっています。xyzzyの使い方が分からぬやし 励ましあえ その3(793〜796) あたりがそれ。

こういう有用なものは2ちゃんの外にも保存しておいたほうがいいと思うので、自分用にlispファイルに仕立てたものをここにも書いておきます。以下、myreplace.l

;;; -*- Mode: Lisp; Package: User -*-
;;置換リスト
;;http://pc2.2ch.net/test/read.cgi/software/1063367821/ 793番さん

(require "multiple-replace") 

(defvar *replace-dialog-list-replace-list* nil) 

(define-history-variable *replace-dialog-list-replace-selection* nil) 

(defun replace-dialog-list-replace (&optional (replace-list *replace-dialog-list-replace-list*) 
&key (interactive-p t) noerror) 
(interactive) 
(multiple-value-bind (result data) 
(dialog-box `(dialog 5 5 219 450 
(:caption "置換") 
(:font 10 "MS Pゴシック") 
(:control 
(:static nil "置換リスト(&L)" #x50020000 7 5 113 10) 
(:listbox list nil #x50a10111 7 15 200 264) 
(:button whole "バッファの先頭から(&O)" #x50010003 22 284 113 14) 
(:button selection "セレクション内(&S)" #x50010003 22 301 113 14) 
(:button query "確認あり(&Q)" #x50010000 152 284 50 14) 
(:button all "全て置換(&A)" #x50010000 152 301 50 14) 
(:button IDCANCEL "&Cancel" #x50010000 152 318 50 14))) 
`((list . ,replace-list) 
(list . ,(car replace-list)) 
(whole . ,ed::*replace-whole-buffer*) 
(selection . ,*replace-dialog-list-replace-selection*)) 
`((selection :disable (whole))))
(when (and result data) 
(let ((replace-list (nth 2 (assoc 'list data))) 
(regexp (nth 3 (assoc 'list data))) 
(whole (cdr (assoc 'whole data))) 
(selection (cdr (assoc 'selection data)))) 
(setq ed::*replace-whole-buffer* whole 
*replace-dialog-list-replace-selection* selection) 
(when *replace-whole-buffer* (goto-char (point-min))) 
(cond (*replace-dialog-list-replace-selection* 
(ed::map-selection #'(lambda (start end) 
(goto-char (point-min)) 
(ed::perform-multiple-replace replace-list 
(eq result 'query) 
regexp 
interactive-p 
noerror)))) 
(t (ed::perform-multiple-replace replace-list 
(eq result 'query) 
regexp 
interactive-p 
noerror))))))) 

(define-key *global-keymap* #\M-R 'replace-dialog-list-replace);Alt+Shift+R 

こういうファイルを仕立てて、Siteinit.l に

(require "myreplace")

として、.xyzzy によく使う置換のリストを以下のような感じで書いておきます。

;;置換リスト
(setq *replace-dialog-list-replace-list* 
'(;("表示名" ("置換リスト(alist)") regexp(nil以外で正規表現を使う)) 
("実体参照化" (("&"."&amp;") ("<"."&lt;") (">"."&gt;")) nil)
("改行のみの行を削除" (("^\n" . "")) t)
("インデント解除" (("^[ \t]+" . "")) t)
("行末空白文字削除" (("[  \t]+$" . "")) t)
))

あらかじめ、multiple-replace を導入しておく必要がありますが、multiple-replace は今回のバージョンアップで NetInstaller 対応になったので導入も楽チンです。:-)

Alt+Shift+R すると、以下のスクリーンキャプチャのようなダイアログが出て、手軽に常用する置換が使えます。

よく使う置換のダイアログのスクリーンキャプチャ画像

OHKUBO Hiroshi さん、793さん、ありがとうございます。

「続・よく使う置換をダイアログから」へコメントをつける

書き込み時の挙動について
URI らしき文字列には自動的にリンクが張られます。また "<" や、">" は実体参照化されます。
スパム対策のため、リファラを切っていると投稿できません。

この記事の永続的 URI ならびに トラックバック ping URI
http://diary.noasobi.net/2003/12/diary_031222a.html