Emacsのレジスタ機能を使って隔離された疑似クリップボード空間を手に入れました
Emacsのkill-region
(カット)(デフォルトではC-wに割り当てられる)はクリップボードに文字列を追加します.
いやカットがクリップボードに文字列を追加するのは当たり前ですね.
Emacsはそれに追加してkill-line
(行を削除する)コマンドやkill-word
(単語を削除する)などもクリップボードに文字列を追加します.
行や単語をテキストファイルの中で移動させたいことはよくあるため, 一々行を選択してカットする必要がなく, 削除と同じコマンドでカット出来るのは便利です.
削除時にカットされないテキストエディタだと, 領域の削除とカットを別コマンドで提供するか, 領域を選択してから動作を聞く必要があります.
しかし, 各ファイルに定型的な文字列を挿入したいときとかは, 削除時に先頭のクリップボードが書き換えられて不便です.
私はM-yにhelm-show-kill-ring
を割り当てているので,
過去のクリップボードも貼り付けることができますが,
一々遡ってペーストするのは面倒です.
他のカット動作から隔離されたクリップボードが欲しいから作ろうかなと思ったのですが, 調べてみたらそういうのが既にあるらしいですね.
レジスタ機能は名前だけ聞いたことがありますが使ったことはありませんでした.
- コピーアンドペーストを使いこなす(松山智大) — ありえるえりあ
- Emacsのレジスタ機能を使いこなす - Qiita
- Emacs で複数のコピーや位置を保存するレジスターとブックマーク機能 | プログラマーズ雑記帳
デフォルトのキーバインドだと即座に呼び出せなくて不便なので,
@
のレジスタを読み書きするコマンドを書いて割り当てました.
また,
insert-register
はyank
と異なりカーソルを貼り付けた文字列の後ろに移動させなくてそれが無性に気持ち悪かったため移動するようなコマンドを書きました.
Emacs使いのメンタルモデル的に動作は一致していて欲しい.
(defun copy-to-register-@ (start end &optional delete-flag region)
(interactive
(list
(region-beginning)
(region-end)
current-prefix-arg
t))
(copy-to-register ?@ start end delete-flag region))
(defun yank-register-@ ()
(interactive)
(insert-register ?@)
(goto-char (prog1 (mark t) (set-marker (mark-marker) (point) (current-buffer)))))
(global-set-key (kbd "C-M-w") 'copy-to-register-@)
(global-set-key (kbd "C-M-y") 'yank-register-@)
これで隔離された空間のクリップボードを手に入れることが出来ました.
私もこれのことを忘却せずに使いこなせると良いですね.