リージョンとセレクション

Last modified: "2019/01/02 17:49:36"

Intro

Emacs を使ってた人でないと、「リージョン」と呼ばれるものはとてもわかりにくい気がする。 さらにその上 xyzzy では、セレクションリングやら、矩形処理などがあり、大変便利な反面、 かなりしばらく使っていても、とっても悩ましかったりする。


Table of contents


リージョンとは

xyzzy では、Windows でよく使われる選択範囲(Shift+ 矢印キーや、 マウスでドラッグした状態でハイライトされている領域=セレクション)に加え、 リージョンと呼ばれる範囲も定義することができるらしい。

リージョンとは、マーク位置 (mark) から、カーソル位置 (point) までの領域を言うみたい。 マークをつけるには、 C-SPC (set-mark-command) (または C-@ または M-SPC )する。

※キャレットの形状がブロックの場合は、キャレットの左側が対象となるみたい。

xyzzy のリージョンは、Emacs と違い領域に色がつかないため、ちょっと見にくい気もするが、 「共通設定」→「表示」→「マーク行の行番号を反転」にチェックを入れておくとマーク位置は、 いくらかわかりやすくなる。

私は、どうしてもリージョンに色をつけたかったので、こうしてみている。 → rv-region


削除バッファとクリップボード

xyzzy では、リージョン、セレクション(および矩形)それぞれに対して、 クリップボードまたは削除バッファに記憶させる関数が揃っているもよう。 削除バッファ(と言う名称が総称として正しいかどうかは定かではないけれど)は、 リージョンの場合はキルリング(*kill-ring*)、セレクションの場合はセレクションリング(*selection-ring*)、 矩形の場合は矩形削除バッファ(*rectangle-kill-buffer*)となるみたい。

削除バッファは、クリップボードと違い、履歴を持つことができるらしい。 キルリングの場合 *kill-ring-max* 分、セレクションリングの場合 *selection-ring-max* 分の履歴を持つことができるが、矩形削除バッファは、履歴をもてないみたい。

削除バッファは、すべてのバッファで共有されるが、他のプロセスで起動された xyzzy とは、 共有できない。(つまり xyzzy を 2 つ起動した場合に、 それぞれでキルリングを持つため共有はできないのだと思う。)

キルリングが履歴をもてることを利用し、こんな便利なこともできるらしい。 → yank-select

クリップボードの履歴は、こんな感じで作成して使ってみている。 → clipselect


リージョンの編集

キルリングを使った編集

kill-region (C-w) ----------- 切り取ってキルリングへ保存
copy-region-as-kill (M-w) --- コピーしてキルリングへ保存
yank (C-y) ------------------ キルリングから張り付け
yank-pop (M-y) -------------- 直前に貼り付けたデータをキルリングの一つ
                              前のデータに置換え
yank-and-pop ---------------- キルリングから張り付けし、キルリングの履歴
                              を一つ前に遡る

yank-pop は、yank もしくは、yank-pop 直後にしか実行できない。

yank-pop, yank-and-pop については、何がしかのデータをキルリングに保存した後、 実行して試してみると、なんとなくわかると思う。

クリップボードを使った編集

あまり使わなさそう。

kill-region-to-clipboard --- 切り取ってクリップボードへ保存
copy-region-to-clipboard --- コピーしてクリップボードへ保存

矩形処理

kill-rectangle -------- 矩形を切り取り
copy-rectangle -------- 矩形をコピー
yank-rectangle -------- 矩形を貼り付け
delete-rectangle ------ 矩形を削除
clear-rectangle ------- 矩形をクリア
overwrite-rectangle --- 矩形を上書き貼り付け

リージョン/マークの操作

リージョンの作成

以下のような関数を使ってリージョンの設定をすることもできるみたい。

mark-page (C-x C-p) ---- バッファ全体?をリージョンとして設定
mark-paragraph (M-h) --- 段落をリージョンとして設定
mark-word (M-@) -------- 単語をリージョンとして設定
mark-whole-buffer ------ バッファ全体をリージョンとして設定

私は、indent-region を M-i に割り当てているので、編集中の関数などをインデントする場合は、 そのコードのどこかにカーソルを置いた状態で、M-h M-i すると簡単にインデントができるので、 うれしい。

mark-page と mark-whole-buffer は、同じ動きをする気がするのだけれど、どう違うのだろう???

マークの操作

exchange-point-and-mark (C-x C-x) --- マーク位置に飛ぶ
mark-dialog-box (C-F2) -------------- マーク(のようなもの?)を複数設定

exchange-point-and-mark (C-x C-x) は、マーク位置にカーソルを移動し、 もとあったカーソル位置にマークをセットする。(つまり mark と point を入れ替える)。 C-x C-x を、連打すると、カーソルが 2 点を行き来する。


リージョンに対するその他の処理

リージョンを使用すると、以下のような処理がもれなくできるようになるみたい。 セレクションに対するその数より、多い。

downcase-region (C-x C-l) --- 小文字に変換
upcase-region (C-x C-u) ----- 大文字に変換
capitalize-region ----------- 単語の先頭の 1 文字を大文字に、2 文字目
                              以降は小文字に変換
string-rectangle ------------ 矩形リージョンの各行を指定した文字列に置換
narrow-to-region (C-x n) ---- ナロウイング
filter-region (C-x |) ------- 外部コマンドに渡す
indent-region --------------- 構造を考慮したインデント
fill-region ----------------- 詰め込み(指定された文字数で改行)
fill-region-as-paragraph ---- リージョン全体を 1 つの段落として詰め込み
quote-region ---------------- 行頭に引用符を挿入
shift-region ---------------- インデント
unshift-region -------------- インデント解除

セレクションの編集

クリップボードを使った編集

ここらは、Windows の標準的な操作と同じ。

copy-selection-to-clipboard (C-Insert) --- コピーしてクリップボードへ保存
kill-selection-to-clipboard (C-Delete) --- 切り取ってクリップボードへ保存
paste-from-clipboard (S-Insert) ---------- クリップボードから貼り付け

セレクションリングを使った編集

yank-selection-pop とかはないのだろうか?

copy-selection (F8) ------- コピーしてセレクションリングへ保存
kill-selection (F7) ------- 切り取ってセレクションリングへ保存
yank-selection (F9) ------- セレクションリングから張り付け
delete-selection ---------- セレクションを削除
yank-selection-and-pop ---- セレクションリングから張り付けし、キルリング
                            の履歴を一つ前に遡る

矩形処理で、クリップボードをを使った編集

このあたりの操作は、マウスでしている。→「マウス

copy-selection-to-clipboard (C-Insert) -------- コピーしてクリップボードへ保存
kill-selection-to-clipboard (C-Delete) -------- 切り取ってクリップボードへ保存
paste-rectangle-from-clipboard (S-C-Insert) --- クリップボードから貼り付け

copy-selection-to-clipboard や kill-selection-to-clipboard は、セレクションの状態により、 copy-rectangle-selection-to-clipboard や kill-rectangle-selection-to-clipboard を呼び出しているみたい。

矩形処理で、矩形キルバッファを使った編集

矩形処理を行う場合は、矩形キルバッファを使ったほうが貼り付け時にその方法がいろいろ選べるので便利。 矩形処理の場合は、セレクションの場合も、リージョンの場合も削除バッファとして *rectangle-kill-buffer* を使っているみたい。このあたりは、Ctrl+右クリックから実行できる。

copy-selection (F8) --------------- コピーして矩形キルバッファへ保存
kill-selection (F7) --------------- 切り取って矩形キルバッファへ保存
yank-rectangle-selection (S-F9) --- 矩形キルバッファから貼り付け
delete-rectangle-selection -------- 削除
clear-rectangle-selection --------- クリア
open-rectangle-selection ---------- 空白を挿入

copy-selection や kill-selection は、セレクションの状態により、 copy-rectangle-selection や kill-rectangle-selection を呼び出しているみたい。

yank-rectangle-selection を実行すると、以下から選択となる。

append-rectangle ----------- 行末へ追加(Append)
overwrite-rectangle -------- 上書き(Overwrite)
yank-rectangle ------------- 挿入(Insert)
yank-rectangle-as-region --- 文字列にして挿入(Insert-as-region)

セレクションの作成

セレクションは、Windows の標準的な操作である Shift + 矢印キーおよびマウスによる左ボタンドラック以外に、 文字モード選択/行モード選択/矩形選択の 3 パターンの選択状態を使い分けセレクションを作成することができる。

以下のコマンドにより選択状態に入った後は、矢印キーまたは、 C-n とか C-a などの移動系コマンドでセレクションを設定することができる。

start-selection-as-line (F6) ------- 行ブロック
start-selection-as-region (S-F6) --- 文字ブロック

F6 すると行モード選択となり、 再度 F6(または S-F6)すると選択状態が解除される。
S-F6 すると文字モード選択となり、再度 S-F6 すると矩形選択となる。 以降同じように S-F6 すると、文字モード選択と矩形選択がトグルされる。 選択状態が解除する場合は、F6 する。

その他、以下のような関数も用意されているみたい。

selection-whole-buffer --- バッファ全体をセレクションに
selection-paragraph ------ 段落をセレクションに

セレクションに対するその他の処理

downcase-selection ----------- 小文字に変換
upcase-selection ------------- 大文字に変換
capitalize-selection --------- 単語の先頭の 1 文字を大文字に、2 文字目
                               以降は小文字に変換
string-rectangle-selection --- 矩形セレクションの各行を指定した文字列に
                               置換
shift-selection -------------- インデント
unshift-selection ------------ インデント解除

とか。


削除バッファとクリップボードの同期

「ツール」→「共通設定」→「さまざま」にある、「削除バッファとクリップボードを中途半端に同期する」 にチェック (*sync-kill-ring-with-clipboard*) を入れると、xyzzy が activate / deactivate する度に、 *kill-ring* の先頭要素とクリップボードの同期を取ってくれるらしい。 xyzzy Part7 708 より。


更新履歴

[2003/01/01]
*selection-ring* とかの記述を追加し、書き直した。