Emacs/Vimで、現在編集中のファイルフルパスをクリップボードにコピーする
2016-12-23
- PC
FirefoxにVimperator入れて使ってるが、y
だけで現在開いているサイトのURLをコピーできるのが便利。
(copy.js使うともっと便利。)
同じことをエディタでもできればいいと思ったので設定書いてみた。
Emacs LispもVim scriptも初心者なのでいろいろ調べた。
環境
特にバージョンとかは関係なく動くと思うが一応。
- OS: ArchLinux
- Emacs: 25.1.1
- Vim: 8.0
Emacs
(define-key global-map (kbd "C-z y")
'(lambda ()
(interactive)
(let ((fullpath (buffer-file-name)))
(message "copied fullpath: %s" fullpath)
(kill-new fullpath))))
C-z y で、現在開いているファイルのフルパスをコピーする。エコー領域にも表示される。
メモ
-
エコー領域
これは「ミニバッファ」と言うと思ってたが、 入力を待っているときはミニバッファと言い、 出力だけのときはエコー領域と言うらしい。 EmacsWiki: Echo AreaによればShort messages to the user appear commonly in the echo area. This area is shared with the minibuffer. The space occupied by the minibuffer for input is thus also used by the echo area for output. There are two names for this space because the behavior is different.
-
buffer-file-name
関数。ファイルのフルパスを返す。 -
default-directory
変数。ディレクトリのパスを返す。 今回は使わなかったが。 -
kill-new
関数。文字列をkill-ringに追加。 -
なぜ(interactive)をつけるのか
これはこういうものらしい。define-key
とかglobal-set-key
でキーバインドを設定するときは インタラクティブコマンドにしないといけないそう。 (interactive)をつけない場合、"Wrong type argument: commandp"という エラーメッセージが出る。M-x describe-function RET global-set-key
には以下のように書いてある。COMMAND is the command definition to use; usually it is a symbol naming an interactively-callable function.
参考
- Emacs で現在のファイルのパスを取得してクリップボードに保存 (org-link も) | Futurismo
上のコードはこのサイトのものを参考に(丸パクリ)した。diredモードのときの対応までしてある。 - EmacsWiki: Echo Area
エコー領域とミニバッファについて。 - emacs - "Wrong type argument: commandp" error when binding a lambda to a key - Stack Overflow
(interactive)について。 - local-set-keyに出てくる(interactive)
(interactive)について。
Vim
nnoremap <Space><C-g> :<C-u>echo "copied fullpath: " . expand('%:p') \| let @+=expand('%:p')<CR>
Space + C-g で、現在開いているファイルのフルパスをコピーする。エコー領域にも表示される。 Emacsで言うエコー領域を、Vimでは何と言うのかわからないが…。
メモ
- expand('%:p')
これでフルパスを取得。 - let @+=
これで+レジスタ(クリップボード)に、=の右側を入れる。 - .
Vim scriptでの文字列連結。 - <C-u>
bashでCtrl-uすればカーソルの左を全削除するが、あれと同じ。Vimでもコマンド打つときはそうなる。 ノーマルモードで数字打ったあとにコロン押してコマンドを打つと、 はじめに範囲指定が入って、余計なことをする。 <C-u>をやればその数字が消える。 1 C-g
おまけ。これはデフォルトで使えるコマンド。 このコマンドを打てばファイルフルパスが表示される。2 C-g
ならバッファ番号まで表示される。C-g
だけなら相対パス。
参考
- Vimのコマンドで関数の結果をクリップボードにコピーしたり - Qiita
ここにだいたい全部書いてある。 - vim-jp » Hack #35: ex コマンドを実行するキーマッピングを定義する
なぜキーマップのときに<C-u>を書くのか。 - Vim - 現在のファイルパスを表示する - ぼっち勉強会
1 C-g
について。