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.

参考

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 だけなら相対パス。

参考