朝顔日記

カーソル位置の要素内容をクリップボードと入れ替え

2004-07-24

xyzzyの使い方が分からぬやし 励ましあえ その5 で、80番さん の要望で、83番さんが作った xyzzy 用の lisp が便利そうなのでご紹介。html+-mode 使用時にカーソル位置の要素内容をクリップボードの中身と入れ替えてくれるというものです。

例えば、現在クリップボードの中身が ほげほげ だとします。んで、以下のような html を編集しているとします。

<p>私は、<a href="http://www.jsdlab.co.jp/~kamei/">xyzzy</a> を使っています。</p>

頭の <p>私は、までのどこにカーソルがあっても、lisp を実行すると、クリップボードの中身と入れ替わって以下のようになります。

<p>ほげほげ</p>

また、<a href="http://www.jsdlab.co.jp/~kamei/">xyzzy のどこかにカーソルがあれば、以下のようになります。

<p>私は、<a href="http://www.jsdlab.co.jp/~kamei/">ほげほげ</a> を使っています。</p>

</a>上にカーソルがあると p 要素の内容がすべて入れ替わるのは仕様だと思います。まぁ、気にしない。あと、終了タグが省略されていても都合が悪いですが、そういうことはしないのでそれも問題なし。ということで、以下がその lisp です。元々は、bar というテケトーな名前でしたが、勝手に replace-this-element-by-clipboard と名づけてキーバインドはとりあえず、M-c に割り当ててみました。

;;カーソル位置の要素を、クリップボードと入れ替え。
;;xyzzyの使い方が分からぬやし 励ましあえ その5
;;http://pc5.2ch.net/test/read.cgi/software/1088948470/83
(require "html+-mode")
(defun replace-this-element-by-clipboard ()
(interactive)
(multiple-value-bind (a b c)
(ed::uplevel-tag)
(when a
(goto-char b)
(let ((p (if (while (scan-buffer ">" :tail t)
(unless (parse-point-syntax) (return t)))
(point)
(return-from bar)))
(regex (compile-regexp (concat "</" c "[> \t\n]"))))
(delete-region
p
(if (while (scan-buffer regex :regexp t)
(unless (parse-point-syntax) (return t)))
(point)
(return-from bar)))
(insert (get-clipboard-data))))))
(define-key ed::*html+-mode-map* '(#\M-c) 'replace-this-element-by-clipboard)

どこのどなたか知りませんが、要望を出してくださった80番さん、作ってくださった83番さん、ありがとうございます。

「カーソル位置の要素内容をクリップボードと入れ替え」へコメントをつける

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

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