はいそろそろ夏、マコピーです。
きっかけ
最近Golangを書くことがあって、それを普段使っているvimで書こうとするとなかなか重い(補完あたりが悪さをしているっぽい)ので、この際だし深追いせずにGoを書く時はSublime Text3にしようかなと思い立ちました。
あとここ1年ぐらいはMacVim-Kaoriyaを使っていてコンソールのvimを使っていなかったのでGUIしかないSublimeであっても違和感がないかなーっていうのも理由の一つ。
インストール
homebrew-caskで入れました
$ brew cask install sublime-text3
参考:
みんなhomebrew-caskって知ってるか? - Qiita
2013年度 MacbookAirクリーンインストール祭 - パルカワ2
ちなみにひさいちはさっきMacbook Airにビールを飲ませたらしく、環境構築に関してはこれあるから大丈夫そうだけれど、まあがんばってほしいと思いました。
椅子に座ったまま後ろ振り返って、再度前を向くとエアーがビール飲んでてマジ???なにこれ???ってなってた。
— ひさいち (@hisaichi5518) 2014, 5月 18
まあTimeMachineのバックアップあるらしいけれど
Vim化する
Vim化するには以下の記事を参考にしました。
VimからSublime Text 3に移行してみた - norinyang メガ進化!
僕の使う大体の機能はだいたいこれでOK
あとOSのクリップボード共有なんですが、以下の設定で出来ました。
{ "vintage_use_clipboard": true, "vintageous_use_sys_clipboard": true }
vintageousも使っているとvintageous_use_sys_clipboardも設定しないといけないので、vintage_use_clipboardだけやってなんで変わらないの????ってなってハマっていました。
よく使っているVimPluginの機能をSublimeでも使えるようにする
- textobj-indent
textobj-indetはテキストオブジェクトを拡張してインデント単位でいろんなことを実行できるVimPluginです。
僕がよく使うのは"v"+"a"+"i"のストロークで同じインデント量の範囲を選択して、そのあと:を押して同じインデント料の範囲内だけで置換するとか、とか後述のtextmanipを使ってブロックを移動させたいとか、そういうときに使います。
textobj-indent + textmanip.vimの効能です http://t.co/aNiIPGq6kf
— /dev/null (@mackee_w) 2014, 5月 18
で、sublimeでこれをどうやるかというといろいろ調べたんですけれど、Command+Shift+jでインデント単位で選択出来るらしく、
SublimeText2 - Sublime Text2 のショートカット一覧 - Qiita
これをKey Bindings - Userで調べると以下の様な感じで設定してありました。
{ { "keys": ["super+shift+j"], "command": "expand_selection", "args": {"to": "indentation"} }, }
これをKey Bindings - Userの方にコピペして以下のように書き換えました。
{ // textobj-indent.vim like selection { "keys": ["v", "a", "i"], "command": "expand_selection", "args": {"to": "indentation"}, }, }
これでインデント単位の選択がv+a+iで出来るようになりました
- textmanip.vim
僕はtextmanip.vimというプラグインを使っていて、特に選択範囲ごと上下左右に移動するという機能を使っています。
どういうプラグインかは以下の記事や上のツイートを見ていただければ。
Vim-users.jp - Hack #223: テキストを直感的に移動、複製する
僕は.vimrcに以下の様な設定を書いてtextmanipを利用しています。
xmap <C-j> <Plug>(textmanip-move-down) xmap <C-k> <Plug>(textmanip-move-up) xmap <C-h> <Plug>(textmanip-move-left) xmap <C-l> <Plug>(textmanip-move-right)
で、選択範囲単位でどうやって移動するのかなと思って調べると、これもsublimeの機能として実現できるっぽいので、以下の様な設定をKey Bindingsに書きました。
{ // textmanip.vim like { "keys": ["ctrl+k"], "command": "swap_line_up", }, { "keys": ["ctrl+j"], "command": "swap_line_down", }, { "keys": ["ctrl+h"], "command": "unindent", }, { "keys": ["ctrl+l"], "command": "indent", }, }
左右移動は思えばただのインデントですね。こんなかんじです。
- tagジャンプ
ctagsのtagファイルを使ったタグジャンプも頻繁に使っています。
Vim でタグジャンプを使ってみる - Archiva
これはSublime Text3からの機能らしいgoto_definitionで実現できそうです。
// vim ctags jump like { "keys": ["ctrl+]"], "command": "goto_definition" }, { "keys": ["ctrl+t"], "command": "jump_back" },
だいたいこの2つしか使っていないのでこれで大丈夫っぽいです。
今のところやったのはこのぐらいです。
あとはGoSublimeを入れて終わりかなという感じです。
DisposaBoy/GoSublime · GitHub
ためしに仕事のPerlのプロジェクトを開いてみてタグジャンプなどをしてみたところ思いのほか便利で、Perlのほうでも乗り換えられるのでは??という気分がしております。僕がそんなにVimを使いこなしていないせいもあるかもしれませんが……。
とりあえずこれでGolangを書いてみたいと思います。
追記: ctrl + aで数値インクリメント/ctrl + xでデクリメント
vimにあるctrl+aでインクリメントするやつ出来ないの?と言われて確かに使うなーって思って調べて設定してみました。
以下のプラグインを使えば出来そうです。
rmaksim/Sublime-Text-2-Inc-Dec-Value · GitHub
Package ControlでInc-Dec-Valueで出てくるので選択してインストール。
同じキーバインドにするには以下を設定する。
// vim like inc/dec { "keys": ["ctrl+a"], "command": "inc_dec_value", "args": { "action": "inc_min" } }, { "keys": ["ctrl+x"], "command": "inc_dec_value", "args": { "action": "dec_min" } },
これでOK
追記: alignをやる
今までvimで変数代入とかの整形(=alignment)をalignta.vimというプラグインでやっていました。どういうふうにやっていたかというと、exコマンドで:Align =とかいちいちやっていて、Perlのハッシュの整形は頻繁にやるので上のtextobj-indentと組み合わせて,(カンマ)+a+iで同じインデント量を選択して=>でalignというショートカットを作っていました。
sublimeだと以下のプラグインを使うと良さそうです。
Sublime Alignment – a Sublime Text Package by wbond
これもInc-Dec-Valueと同様Package ControlでAlignmentで出てくるのでそれでインストール。
vintageousのexモードで何かを実行するというのはよくわからなかったのでctrl+iに以下のように割り当てました。デフォルトのcommand+ctrl+aは指がツライので。
// alighment { "keys": ["ctrl+i"], "command": "alignment" },
あとUser Prereferenceにも以下を設定。
"alignment_chars": [ ":", "=", "=>" ], "alignment_space_chars": [ "=", "=>" ],
追記その2:
alignment_space_charsなるオプションもあり、コレに入れとかないと=>とかが前のスペース無しでalignされてしまう。のでこれも入れておくことにしました。
カンマは誤爆がウザすぎるのでなくした。