momonga.vim#6に参加しました

8/2(土)にドワンゴのセミナールーム(歌舞伎座タワー)で開催された momonga.vim#6に参加したので、感想レポートをば

0次会(PRONTOにて)

もくもく会自体は13:30からだったのですが、Vim熱が高まりすぎた数名 (主催のsupermomongaさん、thincaさん、Lindanさん、rbtnnさん、Shougoさん、私) が9〜10時くらいから、会場近くのPRONTOでティーを片手にもくもくしてました。

supermomongaさんは高まり過ぎたのか大分早起きしてしまったらしく 9時(前日の21時)に起きたため終始ウトウトしてました。

途中でたまたまお昼を食べに来た、りひにーさんと合流し一緒にランチを食べました。

流石に午前中から来ているだけあって、皆わくわく盛り上がっていました。

会場入り(ドワンゴ歌舞伎座タワーにて)

会場はドワンゴのセミナールームで、100人規模が入るらしくかなり広かったです (そもそも歌舞伎座タワーが巨大...)。

主催の江添さんがちょうどいらっしゃっていて、セミナールームに入れていただき、 会場設営を手伝ったり、もくもくしたり、rbtnnさんのmario.vimの原型を 見せてもらったりしていました。

40人規模のもくもく会を目の前に、わくわくが最高潮に達していました。

1次会(もくもく会)

もくもく会の細かい話は他の方の参加レポでも紹介されると思うので、 私はもくもく会でやったことだけレポします。

neco-rubymfをneocomplete対応した

前回のmomonga.vim同様、もくもく会のネタがなかったので、前回の続きでLingr のYo botでも 改良しようかなぁと思っていました。

で、Yo botをいじりつつ、LingrRubyVimプラグインについて話を聞いていたりしていたら、 ujihisaさんからこんなVim plugin(ujihisaさん作) があるよーと教えていただきました。

で、試そうとしたら動かず。。。 どうやらこのplugin、neocompleteの前身である neocomplcache依存で作られたもので、neocompleteには対応していませんでした。

そして、気づいたらこのpluginのneocomplete対応をするべくコード を書き始めていました。

何というyak shaving! yak shavingコワイ...

ということで対応して以下のリポジトリのmasterに直接pushしました。

neco-rubymf

ujihisaさんにコミット権を頂いたので、リポジトリはujihisaさんが作られた リポジトリにそのままコミットしています。

neocomplcacheとneocompleteで参照するパスが異なるため、 どちらにも対応する形となります。

正直、作っては見たものの自分が使うかどうかは微妙ですが、 気になる方は試してみてください。

あ、あとこれを作る際、わからないことが多々あり、neocompleteの作者であるShougoさんに 色々と質問させていただきました。(2次会に向かう電車の途中でも色々聞いてしまいました)

Shougoさん丁寧にご説明いただきありがとうございました。

もくもく会は直接Face to Faceで質問できたりするのでいいですね。

2次会(妖怪ハウスにて)

もくもく会の興奮も冷めやらぬ中、主催の江添さんがお住まいの シェアハウスである妖怪ハウスにおじゃましました。

妖怪ハウスではもくもくしたり、アイスを食べたり、江添さんに作っていただいたピザを 食べたり、仕事の辛い話を聞いていたりしました。

仕事 is つらい

仕事がつらい皆さんは、Vim pluginを書くと幸せになれると思うので皆さんどんどん書きましょう。

そんなこんなで、終電間近となり、momonga.vim#6 の興奮が冷めやらぬまま一人家路につきました。

雑多な感想

  • mario.vimすごい(rbtnnさんどこに向かってるのw)
  • Lindanさんの英語のやつ便利そう
  • basyuraさんに進捗プレッシャーを掛けるなどした
  • Shougoさんは相変わらず歌ってた
  • mittanさんに発売日前のVim scriptテクニックバイブルを見せていただいた
  • 今回は珍しく女性Vimmerがいらっしゃっていたので頑張って欲しい。女性Vimmerツチノコ並にレアなので、もっと女性Vimmerの参加者増えたらいいと思う
  • 折角テーブル単位で分かれてたんだから、もっと積極的に初対面の人ともコミュニケーションとればよかった
  • 40人でもくもく会って前代未聞じゃないの...

終わりに

主催の江添さんとsupermomongaさん、参加者の皆さん、ありがとうございました。

40人規模のもくもく会でどうなることかと思いましたが、 皆さん盛り上がっていて楽しいもくもく会を過ごすことが出来ました。

またどこかのXXX.vimでお会いしましょう。

Happy Vim Life!

momonga.vim#5に参加しました - LingrのYo bot作りました

7/26(土)に東京某所で開催されたmomonga.vim#5に参加したので、感想レポートをば

momonga.vim#6まであと数時間。間に合った...

もくもく会

はじめもくもく会のネタがなく、Vim本体のコードリーディングでもしようかなぁと考えていました。

しかし、気づいたらRubyLingr のYo bot作ってました。

まさに何を言っているのかわからねーと思うが状態でした...

LingrのYo bot

作成を進めたLingrのYo botについて簡単にご説明を

bot作成背景

最近、Lingrに入り浸っているのですが、仕事柄常時アクセスできるような環境ではなく 気づいたらLingr部屋がすごい盛り上がっていて話に乗りそびれてつらいみたいなことが 多々ありました。

そこでLingr部屋が盛り上がっていたら、最近話題?のYoを使ってYo通知するbotを作ろう と考えました。

botの機能

現在もちょこちょこ機能追加しているところですが、現状用意出来ている主要機能はざっくり以下です。

  • Lingr部屋が盛り上がってきたらYo allで通知する
  • !Yo [Yoアカウント]で、指定したYoアカウントにYo通知する
  • !Yo -pattern /パターン/で、パターンにマッチしたときに自分のYoアカウントにYo通知する
  • !Yo -waitfor [Lingr ID]で、指定したLingrユーザが発言したら自分のYoアカウントにYo通知する

ソースは以下に置いています

yo-lingrbot

食事会(2次会)

食事は近くのサイゼリヤでムシャムシャしました。

十数人いたので席がバラバラだったのがアレでしたが、 初参加の方とかと交流出来てよかったです。

初対面の方とVimの話するとき、どんな話をしたらVimレベルがわかるかそんな話を して、thincaさんが質問してもらえばいいのではという話をしてました。

momonga.vim#5.1(3次会)

主催のsupermomongaさん宅でもくもく3次会。

遅くなってしまうので最初は行く気はなかったのですが、 折角なので...と思い参加しました。

もくもく会(1次会)で作りきれなかったYo botをsupermomongaさんに色々相談しながら ちまちま更新していました。

勉強会はわからないところを既に経験されている方に色々聞けて ステップアップできるのでとても良いと思います。

一家に一匹モモンガが必要だと思いました。

雑多な感想

  • 今回も進捗プレッシャー強かった
  • 自己紹介のときに「ネタがなくて...」と言ったら、突っ込み入って完全にVimmer怖いと思った
  • Ruby力がなくて辛かった
  • Vimネタが枯渇してきている...
  • VimVim

終わりに

初参加の方とお話したり、いつもの面々と交流出来たりで良かったです。

主催のsupermomongaさん、参加者の皆さん、ありがとうございました。

本日のmomonga.vim#6に来られる方はまたよろしくお願いします!

Happy Vim Life!

TokyoVim#20に参加しました

TokyoVimの参加レポです。

TokyoVimやったこと

当日まで補欠だったため、もくもく会のネタを何も考えていなかったので、 その場で考えました。なんとか進捗が出せたと思います。
やったのは以下の内容。

  • 先日momonga.vim#4で作成したvim-magicalizeのドキュメントを作成しました。
  • 自作Vim pluginのparajumpのバグを修正しました。
  • paste系Vim pluginを試作しました。
  • vim-markdownのバグを修正して先ほどプルリクを送りました。

ハマリポイントだと思うので、parajumpのバグについて、簡単に説明します。

parajumpのバグ

parajumpは、ブレース({, })での段落移動を 改善するVim pluginで、空行以外に、スペースやタブだけの行も段落の区切りとして扱うように するVim pluginです。

このpluginは、内部でsearchpos関数を使用しているのですが、searchposはオプションの magicに依存するため、set magicset nomagicかによって、正規表現のメタ文字の 意味が異なります(search関数も同様)。

しかし、これを意識せず、デフォルトのmagic形式であることを考慮して正規表現を書いていたため、 set nomagicした場合に、意図しない正規表現searchposが動作していました。

修正は、正規表現の文字列に明示的にmagicであるという\m正規表現の頭に指定することで対応しました。

皆さんも、searchsearchposを使用する場合は、上記ご注意ください。

まとめ

当日まで参加できないと思っていたので参加できて良かったです。
TokyoVim主催のkanaさん、参加者の皆さんありがとうございました。

またどこかのVim勉強会でお会いしましょう!

Happy Vim Life!

momonga.vim#4に参加しました

6/7(土)に東京某所で開催されたmomonga.vim#4に参加したので、感想レポートをば

もくもく会

もくもく会では作り途中だったVim pluginの作成を進めました。

Vim pluginの作成

作成を進めたVim pluginについて、下記で説明します。

Vimには検索パターン内で使用可能な特殊文字を変更するためのmagicという 設定があり、この設定によってエスケープが必要な特殊文字が変わります。

例えば以下の様な感じです。

" hogeかhige(eは任意の繰り返し)だけの行にマッチするパターン

" magicだと
/\m^\(hoge\|hige*\)$

" very magicだと
/\v^(hoge|hige*)$

" nomagicだと
/\M^\(hoge\|hige\*\)$

" very nomagicだと
/\V\^\(hoge\|hige\*\)\$

それぞれ微妙にエスケープしている文字が違うのがわかると思います。 ちなみに先頭に\m,\v,\M,\Vがありますが、これらはそれ以降のパターンが それぞれmagic,very magic,nomagic,very nomagicで処理される という意味になります。

これら4つのパターンを相互変換するためのVim pluginを作成していました。

まだ完成していないのであれですが、例えばこんな感じで使えるようになる予定です。

" \m^\(hoge\|hige*\)$が出力される
echo magicalize#magicalize('\v^(hoge|hige*)$')

operatorも用意する予定なのでコード中のパターンも簡単に変換できるようになるはずです。

ちなみにmagicalizeというのはmagic化するという造語です。 英語圏の方には通じない気がしています。 Vim plugin名も、vim-magicalizeにしようと思っています。

magicについて詳しく知りたい方は、:help magicや、私が以前書いた以下の記事もご参照ください。

Vimでパターン検索するなら知っておいたほうがいいこと

テストが大体通ってきたので、ドキュメントを書いたらそのうちgithubにあげようと思います。

雑多な感想

  • 初めてmomongaさんの本体にお会いしたのですが、本当にももんがで、まさかのぬいぐるみでした。

  • momonga.vim会場のドアの前を女性が行ったり来たりしていたり、 一度はあまりに興奮した女性ファンが会場に乱入したりしていました (Vimの女性への人気の高さが伺えます。会場を間違えたふりをしていましたがただの照れ隠しだと思います)。

  • 「進捗どうですか?」という名のまさかりが飛び交っていてVimmer怖かったです。

  • Lindanさんに何のVim plugin作ってるんですか?と聞かれ、説明したのですが、 口頭で説明しているとき、なんで私はこんなものを作り始めたんだろうと 疑問に思ったけど答えは出ませんでした。 多分そこにネタがあったから作り始めたんだと思います。

  • 作成中のVim pluginが思いのほか正規表現がカオスな事になっており、 既にメンテ出来る気がしません。。。 使う予定もないのでとっとと仕上げて、次のVim pluginネタに着手したいです。

終わりに

お昼をご一緒したかったけど寝坊したり、カラオケには参加できなかったりで 残念な部分もありましたが、色々な方と交流出来て良かったです。

主催のsupermomongaさん、thincaさん、参加者の皆さん、ありがとうございました。

また、momonga.vimもしくはxxx.vimでお会いしましょう。

Happy Vim Life!

ぼくのかんがえたさいしょうのvimrc

この記事はVim Advent Calendar 2013の171日目の記事です。
170日目はmanga_osyoさんによるvim-operator-alignta つくったでした。

本記事では、ぼくのかんがえたさいしょうのvimrcを紹介します。

はじめに

さいしょうのvimrcとは?

何か中二病っぽいタイトルですが、わりとまじめに考えて作ったものです。

タイトルをパッと見て、「最小?最強のタイポじゃないの?」 と思われた方もいるかもしれません。 しかし、最強のvimrcではありません。 最小 のvimrcです。

私がここで言っている最小のvimrcとは以下のような意味です。

Vim pluginを入れず、必要最小限の設定だけをまとめたvimrc

Vim pluginを入れずというのがミソです。 また、ここで言っている最小限の設定とは、(個人的に)どうしても 必要なオプション設定とキーマッピングなどのことです。

さいしょうのvimrc作った理由

仕事上テスト機などの共用で使うようなマシンで、 ちょっと設定ファイルなどを編集したい場合に、 勝手にVimプラグインを入れづらかったり、 わざわざVimプラグインをいれるまでもなかったりする場合があります。

こういう時、私は今まで特に設定なしでVimを使っていたのですが、 バリバリカスタマイズした自分のvimrcに慣れきっていると、 操作が微妙にぎこちなくなります。 (もちろん操作できないということはないですが。。。)

かと言って、いつも使っているvimrcをそのまま入れると プラグインの設定がたくさんあるため、大量のエラーで まともに動きません。

このような背景があり、カスタマイズバリバリのvimrcとは別に ちょっとしたvimrc、つまり自分にとって最小限の設定を記載した vimrcを書くことにしました。 小さいvimrcであれば、さっとコピーしてさっと使うことが でき便利です。

さいしょうのvimrc

ぼくのかんがえたさいしょうのvimrcは、 .minimal_vimrcにおいてます。

今後変更するかもしれないので現時点(2014/5/21)での最新にリンクしています。

中身について簡単にざっとご紹介します。

なお、下記設定は全部を自分で考えたものではなく どなたかのvimrcを真似させていただいたものもあります。 どれがどなたの設定か覚えていないのですが、 この場を借りて御礼申し上げます。

syntax enable

構文ハイライトを有効にしています。 これでファイルタイプ別に色付けされるようになります。

set number
set ruler
set list
set listchars=tab:>-,trail:-,nbsp:%,extends:>,precedes:<,eol:<
set incsearch
set hlsearch
set nowrap
set showmatch
set whichwrap=h,l
set nowrapscan
set ignorecase
set smartcase
set hidden
set history=2000
set autoindent
set expandtab
set tabstop=2
set shiftwidth=2
set helplang=en

オプション設定は完全に好みなので、細かく説明はしません。
個人的には、行番号表示(number)や、検索周り(incsearch,hlsearch,ignorecase)、 行頭/行末でのカーソル移動(whichwrap)、隠れバッファ(hidden) あたりは、設定しておかないと操作しづらいです。

colorscheme desert

背景色黒ベースのカラースキーマが好きなのでdesertに設定しています。

nnoremap <Space>w  :<C-u>w<CR>
nnoremap <Space>q  :<C-u>q<CR>
nnoremap <Space>Q  :<C-u>q!<CR>

ファイル保存、ウィンドウクローズをキーにマッピングしてます。 タイプ数はそんなに変わらないと思われるかもしれませんが、 <Enter>を押さなくていい分、手軽にタイプ出来ますし、 :w[<Enter>などのタイポなども気にしなくてよくなります。
<Space>も非常にタイプしやすくプレフィクスキーにお勧めです。

nnoremap ;  :
nnoremap :  ;
vnoremap ;  :
vnoremap :  ;

よく使うコマンドラインモードに入るための:と、 よりタイプしやすい;を入れ替えています。
特にASCII配列キーボードだと、:はタイプ しづらいので、個人的に必須です。

nnoremap <Space>h  ^
nnoremap <Space>l  $

行頭/行末移動のキーを、マッピングしています。
タイプ数が多くなって押しづらくなってるじゃないかと 思わるかもしれませんが、デフォルトの^$は、 <Shift>と一緒にホームポジションから遠いキーを押す必要があるため、 押しづらく小指が疲弊してしまいます。
マッピングしている<Space>h<Space>lは片手でタイプ できてお勧めです。
<Space>は押しやすいので、Vimでキーをマッピングする際、 <Space>をプレフィクスキーとして使うと便利です。

nnoremap k   gk
nnoremap j   gj
vnoremap k   gk
vnoremap j   gj
nnoremap gk  k
nnoremap gj  j
vnoremap gk  k
vnoremap gj  j

表示行移動であるgjgkと、実際の行移動であるjkを 入れ替えています。
set wrapの設定をして、1行が表示上ラップしている場合に、 gjgkは、表示上の行での移動なのでjkより 便利なときがあるため入れ替えています。

nnoremap <Space>/  *<C-o>
nnoremap g<Space>/ g*<C-o>

*は、カーソル位置の単語で前方検索します。 これは非常に便利なコマンドで、よく使うのですが、 *はASCII配列キーボードだと、<Shift>を押しながら ホームポジションから遠いキーをタイプする必要があるので ちょっと押しづらいです。
そこで、<Space>/マッピングしています。 片手でタイプできてお勧めです。

g*は、*と違い、単語の一部にもマッチします。 こちらも同様にマッピングしています。

nnoremap <expr> n <SID>search_forward_p() ? 'nzv' : 'Nzv'
nnoremap <expr> N <SID>search_forward_p() ? 'Nzv' : 'nzv'
vnoremap <expr> n <SID>search_forward_p() ? 'nzv' : 'Nzv'
vnoremap <expr> N <SID>search_forward_p() ? 'Nzv' : 'nzv'

function! s:search_forward_p()
  return exists('v:searchforward') ? v:searchforward : 1
endfunction

nNは、最後の/?を繰り返します。

/で検索した場合と、?で検索した場合で、 nNで移動する方向が異なるのが不便でした。 このため、/?のどちらで検索した場合でも、nで前方検索 Nで後方検索するよう設定しています。

nnoremap <Space>o  :<C-u>for i in range(v:count1) \| call append(line('.'), '') \| endfor<CR>
nnoremap <Space>O  :<C-u>for i in range(v:count1) \| call append(line('.')-1, '') \| endfor<CR>

インサートモードに入らずに、カーソル行の下もしくは上に空行を挿入します。 countにも対応しているので、10<Space>oで10行挿入できます。

空行を挿入する+αも参考ください。

nnoremap <silent> tt  :<C-u>tabe<CR>
nnoremap <C-p>  gT
nnoremap <C-n>  gt

タブ関連のキーマッピングです。

私はタブを多用するので、新規タブの作成をタイプしやすいttに割り当てています。

また、タブ移動は、複数タブを確認しながら移動する場合に、 gtgtgtgtとタイプするするのがタイプしづらかったため <C-p><C-n>マッピングしています。

nnoremap <silent> <Esc><Esc> :<C-u>nohlsearch<CR>

set hlsearchで、検索時にマッチするテキストが強調表示されます。 検索テキストの強調表示は便利なのですが、検索が終わった後は 強調表示をオフにしたいので、nohlsearchコマンドを使います。

nohlsearchコマンドはちょいちょい使うため、<Esc><Esc>マッピングしています。

nnoremap ZZ <Nop>
nnoremap ZQ <Nop>

nnoremap Q gq

危険なキーを無効 or 別のキーにマッピングしています。

ZZZQはそれぞれ、「ファイルを保存して終了」、 「ファイルを保存せずに終了」です。

タイプしやすくて便利だったりするのですが、あまりに タイプしやすく、ZZをタイプするつもりが誤ってZQを タイプして悲しい気持ちになることが多々あります。 そのため、使わないよう空マップ<Nop>に指定してます。

また、QはExモードに切り替えます。 通常の使用でExモードを使うことはほとんどないため テキストを整形するgqマッピングしています。

onoremap aa  a>
onoremap ia  i>
onoremap ar  a]
onoremap ir  i]
onoremap ad  a"
onoremap id  i"

テキストオブジェクトで、i)i}などは、 ibiBに割り当てられていて、i)i}とタイプするのと 比較してタイプしやすいのですが、 i>i]i"はそのまま記号をタイプする必要があり 押しづらいため、上記のようにマッピングしています。

このキーマッピングの副作用として、上記テキストオブジェクト は、ASCII配列キーボードでもJIS配列キーボードでも同じキーで 操作する事ができるようになります。

inoremap jk  <Esc>

ノーマルモードに戻るための<Esc>はタイプしづらいので、 jkマッピングしています。 jkであれば、編集でjkを入力することはほとんどないですし、 誤ってノーマルモードでタイプしても上下移動するだけですみます。 何よりホームポジションを移動せずにタイプできるので 非常にタイプしやすいです。

このキーマッピングは人を選ぶと思います。

nnoremap gs  :<C-u>%s///g<Left><Left><Left>
vnoremap gs  :s///g<Left><Left><Left>

置換コマンドは多用するのですが、いちいちタイプするのが 面倒なので、gsキーにマッピングしています。
これで、gsとタイプすることで、即座に置換する文字列 の入力に移れます。

cnoremap <C-f>  <Right>
cnoremap <C-b>  <Left>
cnoremap <C-a>  <C-b>
cnoremap <C-e>  <C-e>
cnoremap <C-u> <C-e><C-u>
cnoremap <C-v> <C-f>a

コマンドラインモードでの移動をEmacsライクなキーに設定しています。

まとめ

以上が、ぼくのかんがえたさいしょうのvimrcのご紹介でした。
皆さんも、自分だけの「ぼくのかんがえたさいしょうのvimrc」を作ってみてはいかがでしょうか?

本題とはそれますが、Vimレベルが上がるのでvimrc読書会に参加することをおすすめします。毎週土曜日23時からやってます。

それではVim Advent Calendar 2013の171日目を終わります。