Emacs のコピー用アドオン fcopy.el のバージョン 6.0 を github に置いた。
fcopy は Funny Copy (奇妙なコピー) モードという意味で、ぼくの最初の Emacs Lisp となる。昔、infoseek のホームページで配布していたのだけど、サービスがクローズされてしまった。以来、ダウンロードできない状況が続いていたけれども、github にようやく置くことができた。
以降、infoseek 時代のホームページをコピペする (全文、書き直すのは大変なので...)。文体も、昔のままなのは手を抜いただけ。。。
Funny Copy Mode
一般のコピーは、先に対象を選び、次に貼り付け場所を指定します。 Funny Copy は Funny Copy モードに入った場所を貼り付け場所とみなし、 コピーする対象だけを探します。
同じような事を書いてたなと思い当たる事があります。 上を見ると、はたして、その文章がある。二度手間は嫌なので、コピーしたい。 テキストを選び、元の位置に戻り、貼り付け、と。でも、待って下さい。 文章を書いていた途中なわけだから、貼り付け場所は、今ポイントのある位置に決まってます。 貼り付け場所が最初から分かっているのなら、「戻る」操作はまどろっこしいと思いませんか。
まとめてみましょう。普通コピーは
- 移動する。
- 範囲をリージョンで囲む。
- コピー用のコマンドを実行する。
- 貼り付け場所にもどる。
- ペースト用のコマンドを実行する。
という流れになります。 しかし、貼り付け場所が今ポイントのある場所なら、4. と 5. を省略出来ます。 そういう事をやって、ついでに移動・コピー用のコマンドも用意しちゃえ。 ってのが Funny Copy です。
Install
- Emacs の load-path の通っている所に fcopy.el を置きます。
- .emacs ファイルに次の設定を書きます。
(autoload 'fcopy-mode "fcopy" "copy lines or region without editing but modify." t) (global-set-key "\C-ck" 'fcopy-mode)
Using Funny Copy
Moving
まず、Funny Copy モードに入ります (C-c k or M-x fcopy-mode)。 Funny Copy モードに入った場所が、コピーしたテキストの貼り付け場所になります。 ここを「貼り付け位置」と呼ぶ事にします。
Funny Copy モードでは、文字の入力は出来ません。 代わりに 1 ストロークの移動用のコマンドを用意しました。 View モードと同じようなものだと考えて下さい。
例えば f と打つと、一単語先へと移動します。 b と打てば、一単語後ろへと戻ります。 普段の Emacs の移動用コマンドから、Ctrl を抜いたものとお考え下さい。 もちろん一文字先へ動くのには C-f が使えます。 同様に n で次の行に移り、p で前の行に動きます。 それから [space] と [backspace] で画面を前後にスクロール出来ます。
インクリメンタル・サーチを使えば、目的の場所により早くたどり着けます。 サーチは通常の C-s の他に s に割り当ててあります。 必要なテキストは以前の文書にある方が多いですから、 C-r もしくは r の方が需要は高いかもしれません。
Funny Copy に入ったはいいが、 やっばりコピーの必要は無かったと思い直す事もあるでしょう。 移動の最中に間違いを見つけてしまって、 すぐに修正したい時もあるかと思います。 Funny Copy には二種類の退避方法があります。状況に合わせてお使い下さい。
- C-g
- Funny Copy モードを抜けて、「貼り付け位置」まで戻ります。
- q
- Funny Copy モードをその場で抜けます。カーソルは移動しません。
Funny Copy モード内で ? と打つか、 C-h m とすると、簡単な説明が出ます。
Copy
コピーするテキストは見付かりましたか? 見付かったら、Funny Copy のコピー・コマンドを実行します。 コピーを実行するとカーソルは「貼り付け場所」に戻り、 対象のテキストが挿入され、Funny Copy モードを抜けます。 ペースト (貼り付け) 用コマンドはありません。
基本的なコピー・コマンドを紹介します。
- .
- マークを打って、リージョンを指定。
- k
- kill-line と同じ様に、カーソルから行末までをコピーします。
- RET
- あらかじめリージョンで囲むと、リージョンをコピーします。 範囲を指定しなければ、行全体をコピーします。 数引数を取ると、行頭・行末の余計な空白を取り除いてコピーします。
- M-RET
- 短形領域 (rectangle) をコピーします。あらかじめ範囲指定が必要です。
- w
- 単語 (Word) のコピーをします。数引数を取って複数の単語を指定する事も出来ます。 日本語では、単語の区切りが Emacs まかせになるので、怖いコマンドです。
- c
- 文字 (Character) をコピーします。数引数を取って複数の文字を指定する事も出来ます。
- C or Shift-Space
- 空白で区切られたブロックをコピーします。 例えば One-to-One (一対一) という単語は、Emacs は三つの単語として認識しますが、 Funny Copy は一つのブロックとして認識します。
- (
- 対になった文字列 (ex. (..), {..}, [..], <..>) に挟まれたテキストをコピーします。 あらかじめ、括弧の中に移動しておく必要があります。 ( で、括弧ごとコピーします。 ) で、括弧の中身だけをコピーします。
- '
- 対にならない文字 (ex. '..', "..", $..$) で囲まれたテキストをコピーします。 あらかじめ、括弧の中に移動しておく必要があります。 デフォールトではクォートを含んでコピーします。 数引数を取ると、含みません。 同様のコマンドで、 " も用意しました。
- ;
- コメントをコピーします。囲むタイプのコメント (ex. /*...*/, <!--...-->) ならその中身を、そうでないなら、コメント文字から行末までをコピーします。
- C-d
- 削除フラッグをトグルします (モード行に :d のマークが入ります)。 削除フラッグが立っていると、Funny Copy はコピーの対象を削除します。 世間一般でいう所のカットです。
Using Funny Modify
Overview
ほとんど同じテキストが欲しいのだけど、少しだけ修正を加える必要がある。 こんな時はコピーした後で、修正を加えなければなりません。 この修正が面倒だと、コピーするのと最初から全部書いてしまうのとどちらが楽か分からなくなります。 ジレンマです。Funny Copy とて例外ではありません。
例えば次のような場合です。
u(x) = u(x-1) + 8*u(x-2)*u(x-3) --:1 u(y) = u(y-1) + 8*u(y-2)*u(y-3) --:2
ラベル 2 を作る為に ラベル 1 をコピーしたいのですが、 式中の x を y に変える必要があります。
Funny Modify はこんな時に、修正を加える手助けをしてくれます。 Funny Modify はコピーするテキストを貼り付ける前に、 テキストを別バッファに一旦移します。 その中で修正を加えた後、テキストをあらためて貼り付けるのです。
Modify
Funny Copy でコピー・コマンドを実行する前に m を打ちます。 モード行に :m のマークが入ります。 修正モードに入る準備はこれだけです。
コピー・コマンドを実行すると、自動的に修正用のバッファに入ります。 これを modify バッファ と呼びます。 修正を加えたら、C-c C-c とタイプして下さい。 修正されたテキストが「貼り付け場所」に挿入されます。
途中で modify バッファを抜けたくなったら、 C-c C-q をタイプして下さい。
modify バッファでは、Funny Copy モードと同様、文字を挿入する事は出来ません。 これは、「テキストの修正は全て置換で行う」という指針に立っているからです。 ed ライクな考え方です。この置換中心のモードを edit mode と呼びます。
基本的なコピー・コマンドを紹介します。
- r
- 置換 (Replace) コマンドのメニューを出します。
- RET
- リージョンが存在すれば、そのテキストを置換し、無ければ query-replace を呼び出します。
- M-RET
- 正規表現を使った問い合わせ型の置換 (query-replace-regexp) です。 数引数を付けると replace-regexp を呼び出します。
- ; (semi-colon)
- 問い合わせ型の置換 (query-replace) です。
- : (colon)
- 正規表現を使った問い合わせ型の置換 (query-replace-regexp) です。
- +
- 文字列の一括置換 (replace-string) です。
- . (period)
- 数字だけの置換です。
- i
- 文字を挿入します。挿入する文字はミニ・バッファから聞いてきます。
edit mode の他に、 Funny Modify は overwrite mode も用意しています。 こちらに移るには、o と打って下さい。 edit mode に戻るには C-cC-e です。
Masayuki Ataka / 安宅 正之e-mail: masayuki.ataka@gmail.com
ややシンプルではありますが、標準配布の cua-mode に同様の機能がありますね。
ReplyDelete(cua-mode t)
(setq cua-enable-cua-keys nil)
の状態で、C-S-Space を押下すると編集ポイントがマークされ、
その状態で適当に移動しコピーするとその場で編集ポイントにコピーしたテキストが挿入されます。
はじめまして。cua-mode に同様の機能があるとは知りませんでした。情報ありがとうございます。今度、遊んでみます!
Delete