2019年5月25日土曜日

emacsのクリップボード(kill-ring)がディレクトリのパスで置き換えられることの対策


背景

emacsで文章をコピー(kill ring save)して、別のディレクトリにあるファイルを開いて、さっきの文章をペースト(yank)しようとすると、ディレクトリのパスがクリップボード(kill ring)に保存されていて、パスがペーストされることがあります。

度々遭遇して不便に感じていたので、解決方法を調べてみました。
備忘録を兼ねて、分かったことを共有します。

方法1: 過去にコピーした文章をペースト(yank next)する

C-y でペースト(yank)した後に M-y を入力すると、emacsは過去にコピーした文章を表示(yank next)してくれます。
これを利用することにより、emacsの設定を変えずとも、ディレクトリのパスがクリップボードにコピーされていても、 M-y を入力すれば期待する文字列をペーストできます。

方法2:  C-backspaceとM-Delでコピーされるのを止める

「emacs LocateFiles kill-ring config」というキーワードで検索していた所、下記のページが見つかりました。

Emacs で M-backspace で kill-ring に追加したくない

どうやら、ファイルを開く操作でパスがコピーされるのではなく、ファイルのパスをたどる時に使っていた C-backspace コマンドが意図しないパスのペーストを行っていたようです。

M-Del でのコピーを止めるには、上記のページとemacsのwikiで紹介されているとおり、下記の記述を ~/.emacs.d/init.elに追加してemacsを再起動します。

(defun delete-word (arg)
  "Delete characters forward until encountering the end of a word.
With argument, do this that many times."
  (interactive "p")
  (if (use-region-p)
      (delete-region (region-beginning) (region-end))
    (delete-region (point) (progn (forward-word arg) (point)))))

(defun backward-delete-word (arg)
  "Delete characters backward until encountering the end of a word.
With argument, do this that many times."
  (interactive "p")
  (delete-word (- arg)))

(global-set-key (read-kbd-macro "<M-DEL>") 'backward-delete-word)
(global-set-key (read-kbd-macro "<C-backspace>") 'backward-delete-word)

上記の設定を反映すると、今まで遭遇していた意図しないパスとペーストが発生しなくなりました。

余談: コピーした文章(kill-ring)を一覧で見る

コピーした文章の一覧(kill-ring)を見る機能は、emacsに標準では無いようです。
一覧を見るには、helmをインストールして「M-x helm-show-kill-ring」を実行するとか、emacs-goodies-elをインストールしてbrowse-kill-ringを実行するが必要です。

htlm-show-kill-ringを使うと、このようにコピーした文章の一覧を確認できます。


まとめ

ファイルのパスが意図せずコピーされてしまうのは、パスをたどる時に使っていた M-Del コマンドが原因であると分かりました。
C-backspaceとM-Del 実行時にコピーしないふるまいをemacsに設定することにより、ディレクトリが異なるファイル間でも滞り無く文章をコピーできるようになりました。

参考

Copy And Paste | Emacs Wiki
Emacs で M-backspace で kill-ring に追加したくない
Backward Delete Word | Emacs Wiki
初心者〜初級者のためのEmacs-Helm事始め : 前編
Keyboard Macros Tricks | Emacs Wiki

更新履歴

2019/05/27
C-backspaceでもコピーが発生していたので、M-DELと同様にコピーせず削除する処理に置き換えました。

0 件のコメント :