Edited at

atomのvim-modeのyank時にクリップボードにも入るようにする

More than 3 years have passed since last update.


2015/02/20 追記

vim-modeの0.33.0でクリップボードと無名レジスタの共有が追加されました。

https://github.com/atom/vim-mode/pull/525

現在は下記の設定を行う必要はありません。


はじめに

現在のところatomのvim-modeのyankはクリップボードと共有できません。

(atom: 0.165.0, vim-mode:0.21.0時点)

本家vimだとvimrcにset clipboard+=unnamedと書いておくと、yankした値はclipboardと共有できます。

vimエディタからクリップボードを利用する。 — 名無しのvim使い

vimで普段からこの設定に慣れていると、atomで使えないのに非常にストレスが溜まります。

これをなんとかしてみました。


init.coffeeにコマンドを定義する


init.coffeeとは

init.cofeeはatom起動時に、一番最後に読み込まれる設定ファイルです。

Customizing Atom

When Atom finishes loading, it will evaluate init.coffee in your ~/.atom directory, giving you a chance to run arbitrary personal CoffeeScript code to make customizations.

一番最後に適用されるのでここでvim-modeのコマンドを呼ぶこともできそうです。

ここに自分用のyankを作ることにします。


書いてみた


  • init.coffee

atom.workspaceView.eachEditorView (editorView) ->

editorView.command 'my-command:yank', ->
editorView.trigger('core:copy')
editorView.trigger('vim-mode:yank')

コマンド内容は'core:copy'と'vim-mode:yank'を2つやるってだけです。非常にシンプルです。

atom.workspaceView.eachEditorView (editorView)でeachしているeditorViewに紐付けると、editor viewでしか使えないコマンド、という定義ができるようです。

例えば、このコマンドはtree viewでは使えません。

githubの中の人の公開しているinit.coffeeを見たりしてこの記述に辿り着いたのですが、現在公式にはこのAPIは書いていない気がします。

(見落としてるだけかな?)


keybindを定義する

keymap.csonで先ほど定義したコマンドを割り当てます。


  • keymap.cson

'.editor.vim-mode:not(.insert-mode)':

'y' : 'my-command:yank'

すでに登録されているキーバインドをkeymap.csonに書いた場合は上書きになります。

この設定で、vim-mode本来のyankは使わずに、自分で定義したmy-command:yankを使うように上書きしています。


動作検証

init.coffeeは起動時に読み込まれるので、atomを再起動する必要があります。

yでyankした値がclipboardに入っていれば成功です!


終わりに

init.coffeeの書き方がわからなくて苦労してしまいましたが、なんとか動きました!

もっと良いやり方があるかもしれません。

ご存知の方は教えてください!


ところでatomのvim-modeにはこんなissueが上がっていた

https://github.com/atom/vim-mode/issues/308

なるほど、確かに"*yyでyankすればクリップボードに入りますね!

こうすれば*レジスタに入るので共有できるということですね。

でも毎回打つの面倒なので却下しました。

(設定でyank時に使うレジスタ変更できるPR出すのが正解ですね!だれかおねg)