Glide Note

glidenote's blog

「source ~/.vim/*.vim みたいなことをしたい」とあんちぽさんに質問された話

どういう心境の変化かあんちぽさんが最近Vimを使い始めていて、 社内IRCのvimチャンネルで結構質問をしてて、みんなでアレやコレや それぞれのやり方を教えてて、私も知らないことがかなりあってなかなか勉強になってる。

とてもVim歴9日と思えない質問をバンバンしてくるし、 「Emacsでは普通に出来るんだけど、Vimではどうやんの?」みたいな 煽りもちょいちょい入れてきて結構ウザい。

で昨日あんちぽさんから質問が出てた件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
18:46:56     antipop_ | source .vim/*.vim
18:47:01     antipop_ | みたいなことしたいんですが
18:47:05     antipop_ | なんかいい方法ありますか
18:52:03     antipop_ | *.vimがたくさんあるんですよ
18:52:18     antipop_ | {foo,bar,baz}.vimみたいな
18:52:23     antipop_ | カテゴリにわけて管理してる
18:52:29     antipop_ | だけど、いちいちsourceしたくない
18:52:45     antipop_ | なので、~/.vim/*.vimは全部自動的にsourceしたい
18:54:00     antipop_ | source ~/.vim/neobundle.vim
18:54:00     antipop_ | source ~/.vim/basic.vim
18:54:00     antipop_ | source ~/.vim/window.vim
18:54:01     antipop_ | source ~/.vim/moving.vim
18:54:03     antipop_ | source ~/.vim/editing.vim
18:54:05     antipop_ | source ~/.vim/search.vim
18:54:07     antipop_ | source ~/.vim/unite.vim
18:54:09     antipop_ | source ~/.vim/filer.vim
18:54:11     antipop_ | source ~/.vim/colors.vim
18:54:13     antipop_ | source ~/.vim/quickfix.vim
18:54:15     antipop_ | source ~/.vim/completion.vim
18:54:17     antipop_ | source ~/.vim/programming.vim
18:54:19     antipop_ | source ~/.vim/ruby.vim
18:54:21     antipop_ | source ~/.vim/tools.vim
18:54:23     antipop_ | source ~/.vim/misc.vim
18:54:25     antipop_ | とか~/.vim/vimrcにかいてるんす
18:54:29     antipop_ | カテゴリふやすごとに↑に追加するのがだるいので
18:54:33     antipop_ | 自動的によんでほしい

社内Vim使いには上みたいに設定ファイルを分割して使ってる人がいなくて不明だったので、 Twitterに書いたら、@kaoriyaさんと@rbtnnさんから速攻で助言を頂いた!! ありがたい。

上の二つの方法をあんちぽさんに教えたところ、下記のように~/.vim/conf.d/設定ファイル用ディレクトリを用意して、

1
2
~/.vim/conf.d/hoge.vim
~/.vim/conf.d/moge.vim

.vimrcに下記のように書いて実現出来た模様。なんか読み込む順番に依存関係があるとハマるらしい。

1
2
set runtimepath+=~/.vim/
runtime! conf.d/*.vim

え、俺が書くの… 。 ウォーキングデッド観てて忙しいんだけど。
というか普通に返答してしまったけど、「今でしょ」とか林先生を求めただけかもしれないと今気づいた。

下記のような感じであんちぽさんのおかげで社内IRCのvimチャンネルが活性化されて良い感じ。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
13:18:06     antipop_ | unite-grepとagよいですな 
13:19:26     antipop_ | grepなquickfixを自動的にuniteに展開してたんだけど 
13:19:38     antipop_ | trailing errorでて一回enterしないとならなくてだるい 
13:19:47     antipop_ | のでやめた 
13:24:17     antipop_ | Emacsにmoccur-grep-findって超絶便利なのがあるんだけど 
13:24:34     antipop_ | Qfreplaceが同じような感じだけど、なんかじゃっかん不安を感じる… 
13:25:17     antipop_ | あと、昨日Emacsの動きを確認しようと思って起動したら、ウィンドウの移動のしかたを忘れていて、マウスでぽちぽち選択しました… 
13:25:25     antipop_ | もうVimにそまっている… 
13:27:38        maeda | Vimもここ2、3年でPluginが量産されててどれ使えばいいのか調べるのが大変なんですよね 
13:27:55        maeda | ハセコさんのvimpusher見るのが良いんですが、 
13:27:56        maeda | http://www.vimpusher.com/plugins 
13:28:03     antipop_ | おっとそれだ! 
13:28:10     antipop_ | なんだっけあれ、ってなってだんだった 
13:28:25        maeda | http://www.vimpusher.com/users 
13:28:37        maeda | 最近も結構登録されてますね 
13:28:53        maeda | 外人が結構登録してる 
13:29:44     antipop_ | でもまあ、もう人気プラグインはだいたいみつくした 
13:30:21     antipop_ | 自分的に使いこなせそうもないのとかはいれない 
13:31:36     antipop_ | vim-textobj-multiblockが素晴らしいとおもいました 
13:32:11     antipop_ | i'とかi)とかi}とかだるすぎるのを、一発で全部できる 
13:33:49        maeda | http://d.hatena.ne.jp/osyo-manga/20130329/1364569153 
13:33:50     antipop_ | あと、Advent Calendar 2012ぜんぶよんだ 
13:33:54        maeda | チェックしてなかった 
13:34:32     antipop_ | Vimではtextobjがすごいとおもいました!(Emacsにないから 
13:41:19       kuroda | vim-textobj-multiblock よさそう。しらなかった。 
13:41:44        maeda | command! Ev edit $MYVIMRC 
13:41:44        maeda | command! Rv source $MYVIMRC 
13:41:50        maeda | とかを設定しておくと、 
13:42:01        maeda | :Ev で.vimrc開いて 
13:42:30        maeda | :Rv で再読み込み出来るので、 
13:42:51        maeda | 設定弄るときに便利です 
13:43:03        maeda | 最近教えてもらいました 
13:43:15 morygonzalez | 便利情報 
13:53:31       kuroda | ふーむ。ブレースでdibが動かない。なぜだ。 
13:57:19        maeda | :map dib 
13:57:44        maeda | とかで他のプラグインとかが勝手にキーバインド設定してないか見ると良いかもですね 
14:36:48       kuroda | YankRingとかぶってた… 
14:39:12     antipop_ | >< 
14:39:21     antipop_ | vim-startifyいいすね 
14:47:30     antipop_ | http://192.168.25.37/gyazo/data/6b89990b3923709da4a843e6f3eb6db5.png 
14:49:38       kuroda | vim-startify便利だ… 
14:49:46       kuroda | あんちぽさん便利… 
14:50:10     antipop_ | brew install figletして 
14:50:11       kuroda | bで選んで復数開けるんすなぁ 
14:50:16     antipop_ | 適当に文字つくる 
14:52:33       kitak_ | sugoi 
14:57:10     antipop_ | 誰もEmacsってかかれてるのにつっこまない 
14:57:13     antipop_ | くそくそっ 
15:04:13       okkun_ | figletの代わりにこれ http://patorjk.com/software/taag/#p=display&f=Graffiti&t=Type%20Something%20 使ってました 
15:04:41     antipop_ | なにこれすごい 
15:05:09       okkun_ | http://patorjk.com/software/taag/#p=display&f=Ghost&t=vim%207.4 
15:05:13       okkun_ | かわいい 
15:25:38        maeda | https://github.com/mhinz/vim-startify/issues/15 
15:25:40        maeda | うける 
15:25:54     antipop_ | ウガンダ 
15:40:06        mizzy | なんだこれw 
15:41:36        mizzy | http://d.hatena.ne.jp/tyru/20130212/pay_for_uganda これと何か関係あるのかな? 
15:44:24       kitak_ | ウガンダの子どもたちに寄付を」 
15:44:30        maeda | Vim起動するとウガンダの子どもへの援助を募るメッセージが出るんですが、vim-startify使うと無視されるからですねw 
15:44:30       kitak_ | みたいなメッセージをみかけたことがあるような 
15:45:50        mizzy | なるほどなるほど>vim-startifyを使うと無視 
15:46:08        mizzy | 理解した 
15:46:21        mizzy | ハイコンテキストだ… 
15:46:26     antipop_ | www 
15:46:29     antipop_ | Vimギャグ 
15:47:13        mizzy | Vimmerはこういうギャグも理解できるようにならないといけないんですね 
15:47:29        maeda | ですねw 
15:47:34     antipop_ | 私はすぐに理解しました 
15:47:39        mizzy | さすがだ 
15:47:44     antipop_ | 本物のVimmerなので。 
15:49:12        maeda | https://github.com/vim-jp/issues/issues/355 
15:49:50     antipop_ | 本物のVimmerになりたくない 
15:51:31        mizzy | 本物のVimmerすごい 

福岡支社でVim勉強会も開催されていたので、盛り上がってきてる気がする。

gistコマンドが便利だったのでzsh補完関数を書いた

Gist使ってますか!

普段はmattnさんのgist-vim経由でGistにpostしているんですが、 コマンドの結果とかをパイプとかで渡して、Gistにpost出来ないものかと思ってたら、 GitHub開発者のdefunkt氏が作ってた。全然知らなくて情弱丸出しだった。

メンテもちゃんとされてて、ver4.1.1以降なら2段階認証にも対応してる。

導入方法

1
gem install gist

Macなら

1
brew install gist

初期設定

1
gist --login

GH:E使ってる場合は、下記のような感じでURLを .bashrcとか.zshrcに書いておく

1
export GITHUB_URL=http://ghe.tokyo.pb/

使い方

a.rbをPOST。これが一般的な使い方

1
gist a.rb

複数を一気にPOST

1
2
gist a b c
gist *.rb

-fでファイル名を設定して、a.rbをPOST

1
gist -f test.rb <a.rb

などなど。

そのほかの使い方は公式ページを見てもらうのが良いかと思います。

https://github.com/defunkt/gist#command

私の実際の使い方

私はコマンドの結果を直接GistにPOSTしたいとき使ってるんですが、 SSL証明書を入れ替えして、opensslコマンドで確認したり

1
2
3
openssl s_client -connect github.com:443 -showcerts << EOF | gist
HEAD / HTTP/1.0
EOF

GistにPostされている内容

とかみたいに、使ってます。

その他の便利設定

下記のように.zshrcとかにaliasを設定しておくと、Gistにpostした後に ブラウザが開いて、GistのURLがクリップボードに自動で入ってくれるようになってます。

1
alias gist='gist -c -o -p'

あと用途的にコマンドとかの結果を直接POSTしてるので、思わぬ事故を防止するために-pを付けて、 デフォルト非公開でPOSTしてます。 社用MacはPOST先が社内GH:Eサーバなので、インターネット上に公開されるわけで無いんですが、念のため。 Gistは非公開設定でもURL知ってれば閲覧出来るので、誰かに伝えるときはURL渡して デフォルト非公開でも運用的に問題も無い感じです。

公開するものは基本的に見やすいようにvimで整形するので、 gist-vim経由でPOSTとgistと使い分けをしてます。

zshでの利用

zshで補完されないと不便だったので、zsh補完関数を書いて、zsh-completionsにmergeされているので、 zsh-completionsを利用していれば、gistコマンドが下記のように補完されるようになってます。

参考

新卒OJTにwemux(multi-user terminal multiplexing)を使って画面共有することにした

新卒氏がインフラに配属になって、横に座ってOJTをやっているんですが、 説明で自分の画面と、新卒氏の画面を行ったり来たりしてアレやコレや言って作業をしているのが かなり効率が悪かったので、1ヶ月くらい前からwemuxを使って画面を共有するようにした。

screenでも画面共有出来ますが、最近私がscreen使って無いのと、 新卒研修でtmuxを使えと 強制しておいたので、wemuxを使ってます。

wemuxの特徴

  1. tmux1.6以上が必要
  2. 単一の端末を複数人で共有出来る。
  3. 読み取り専用のmirror mode
  4. 複数人で操作ができるpair mode

などの特徴があります。

wemuxの導入

導入環境はCentOS5系で、tmux1.6が既に導入済みです。

wemux自体はtmuxのwrapperなので、tmux1.6以上が必要です。 weemuxは管理サーバ(sshの踏み台サーバ)で動かしてて、教える人と教わる人が ログインして画面共有をしています。

1
2
3
sudo git clone git://github.com/zolrath/wemux.git /usr/local/share/wemux
sudo ln -s /usr/local/share/wemux/wemux /usr/local/bin/wemux
sudo cp /usr/local/share/wemux/wemux.conf.example /usr/local/etc/wemux.conf

/usr/local/etc/wemux.confhost_listにwemuxで画面を共有するユーザを 下記のように記載

1
host_list=(glidenote tnmt lamanotrama)

wemuxの使い方

先にwemuxを起動した人がhost側になります。OJTでは教える側が先にwemuxを起動して hostになっています。(pair modeで動かしているので、両方が操作できますが、 一応形式的に教える人がhostになってます)

まず最初に教える側(私)が下記のような感じでwemuxを起動、

1
2
wemux
chmod 1777 /tmp/wemux-wemux

続いて教わる側(新卒氏)が

1
wemux

でclient側になります。引数でmodeを指定しない場合は、/usr/local/etc/wemux.confで 設定されているmodeで起動します。

wemuxを終了するときは、host側(私)がdetachして

1
wemux stop

すれば/tmp/wemux-wemuxが削除されます。/tmp/wemux-wemuxが残っていると 他の人がwemuxを起動してhostになれないので注意。

1ヶ月使ってみて感じたメリット、デメリット

メリット

  • tmuxで画面共有が出来る。
  • 自分の使い慣れたキーバインドで、説明が出来る。
  • 相手の操作を見るときも、わざわざディスプレイを見に行かなくても良い。
  • コピーモードの矩形選択を利用することで、指摘したい部分を選択出来る。

デメリット

  • tmux限定
  • wemux host側の.tmux.confが利用されるので、変態的なキーバインドだと教わる側や二人同時に操作できるpair modeできつい
  • wemux hostとclient側でディスプレイサイズが異なるとと、表示が残念な感じになる。

ホスト側とクライアント側で微妙にサブコマンドが違って、zshで補完されないと使い勝手が悪かったので、wemuxの補完関数を作って zsh-completionsにpull reqを出しておいたのが mergeされてるのでzsh-completions利用すればweemuxのコマンドが補完されるようになってます。

confはほぼデフォルトのままで使ってるんですが、1ヶ月くらい使ってみて特に不都合も無く良い感じに稼働してます。 同じ画面を見て作業出来るので、確認が楽に出来て、メンテとか重要作業でも使えるかなーと思案中。

参考

`gem install`で入れた`hub`が遅い話

ちゃんとマニュアル読んでれば「何を今さら」という感じなんですが、 hubコマンドについて、ちょっと調べ物をして、README読んでたら

1
Though not recommended, hub can also be installed as a RubyGem:

というのが目に入った。

理由のWhy to not use hub with RubyGemsをみると RubyGems経由でインストールしたhubは遅いから使うべきじゃ無いとベンチマーク結果とともに書いてある。

実際に手元のMacで比較

1
2
3
4
5
6
7
# No RubyGems
time (for i in {1..10}
do
  /usr/local/bin/hub --version > /dev/null
done)

( for i in {1..10}; do; /usr/local/bin/hub --version > /dev/null; done; )  0.55s user 0.22s system 83% cpu 0.925 total
1
2
3
4
5
6
7
# With RubyGems
time (for i in {1..10}
do
  ~/.rbenv/versions/1.9.3-p194/bin/hub --version > /dev/null
done)

( for i in {1..10}; do; ~/.rbenv/versions/1.9.3-p194/bin/hub --version > ; ; )  4.02s user 0.60s system 87% cpu 5.282 total

え、こんなに遅いの…

改善方法(というかちゃんとしたインストール方法)

公式に書いてあるようにmacならhomebrewで

1
brew install hub

Linuxなら

1
curl http://hub.github.com/standalone -sLo ~/bin/hub && chmod +x ~/bin/hub

で入れる。

RubyGems経由で導入した場合も、下記のようにstandalone形式で入れると早いとのこと。

1
2
gem install hub
hub hub standalone > ~/bin/hub && chmod +x ~/bin/hub

実際に測定してみた。

1
2
3
4
5
6
7
# Standalone via RubyGems
time (for i in {1..10}
do
 ~/bin/hub --version > /dev/null
done)

( for i in {1..10}; do; ~/bin/hub --version > /dev/null; done; )  0.56s user 0.22s system 84% cpu 0.928 total

確かに早い。

でもwhich hubとかすると、自分の環境ではgemで入れたhubが呼ばれてたので、 Macならhomebrew、Linuxはcurlで入れるとかが統一しておいて、gem install hubしないほうが良さそう。

2年近くhub使ってて初めて知った…

余談ですがzshのプロンプトにgitのブランチ名とか出してる場合、毎回hubが呼び出されている可能性があるので下記を忘れずに。

gitとhubを比べてみると結構速度に差があるな-

1
2
3
4
5
time /usr/local/bin/hub --version > /dev/null
/usr/local/bin/hub --version > /dev/null  0.06s user 0.02s system 83% cpu 0.093 total

time /usr/bin/git --version > /dev/null
/usr/bin/git --version > /dev/null  0.00s user 0.00s system 71% cpu 0.003 total

コミットメッセージを書くときにGitHubのユーザー名が補完されるようにした

gitでcommit messageを書くときに、関連する人にmentionを送ることが結構あるんですが、 GitHubとGitHub Enterpriseのユーザ名の覚えが曖昧で、毎回ブラウザでポチポチやって調べていて、 効率が恐ろしく悪かったので、同僚やmention送るユーザ名は辞書作って補完することにした。

GitHub Usernameの辞書を作成

1
2
mkdir -p ~/.vim/dictionary/
touch ~/.vim/dictionary/github_user.dict

~/.vim/dictionary/github_user.dictの中身は下記みたいな感じでユーザー名を列挙。

1
2
3
4
mizzy
lamanotrama
tnmt
hiboma

.vimrcの設定

作った辞書がcommit messageを書くときだけ読み込まれるように.vimrcに下記のように追加。 git commitしたときにfiletypeがgitcommitになってないと辞書が読み込まれないので注意

1
autocmd FileType gitcommit :set dictionary=~/.vim/dictionary/github_user.dict

下記みたいにGitHubのユーザー名が補完されるので、mentionが飛ばしやすくなる。

どうやってユーザー名を補完しようか調べてて、git commitでvimを起動するとfiletypeがgitcommitになるのを初めて知った。 たぶんこれを利用すればもっと便利なことが出来そうな気がする。

参考