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

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

昼食

LingrGitHub Issuesにラーメン画像が貼り付けられたおかげでthincaさんのラーメン欲がリミットブレイクし、ラーメンを食べに行くことになりました。

魚介系のつけ麺で、濃厚で美味しゅうございました。

f:id:deris:20140201130152j:plain

もくもく会

以下簡単にもくもく会の成果をば

やったことは以下2点

  1. 最近作ったVim plugin、textobj-ipmacのdocを作成
  2. 汎用ログハイライトVim pluginの作成に着手(未完成)

textobj-ipmacのdocを作成

VACのネタにしたいので詳細は省きますが、最近作ったIPアドレスMACアドレスVimのテキストオブジェクトで扱うためのVim pluginのdocを書いてリポジトリへの pushまで行いました。

毎度思いますが、ドキュメント書くの大変ですね。

(英語力の無さに凹む…)

汎用ログハイライトVim pluginの作成に着手(未完成)

前日に思いついた汎用ログハイライトVim pluginの作成に着手しました。

syntaxや、highlight周りがよくわかっておらず、trial & errorで 頑張りましたが結局完成させることはできませんでした。

進捗…(乂'ω')スッ…

雑多な感想

  • puyo.vimを触ってたところバグを見つけたので、その場でrbtnnさんに報告したところものの数分で修正されました
  • C++のauto変数の実際の型を参照できるVim pluginをLindanさんが作ってて、スゲーとなった
  • thincaさんがその場で話題にしていたVim scriptネタをその場でVACをものの数分で記事にしてました
  • momongaさんが作ってたVim pluginそのうちVACで紹介されるらしいので楽しみ
  • 泊まりで参加できなくて残念だった。それにしても私以外みんな泊まりってスゴイw

終わりに

第1回から参加しているmomonga.vimですが、参加された方から刺激を受けてとても良い時間を過ごすことができました。 次回も参加できれば参加したいです。

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

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

Happy Vim Life!

Vimのタブで開いているバッファのdiffを簡単に表示するpluginを書いた

Vim

この記事はVim Advent Calendar 2013の57日目の記事です。
56日目はmanga_osyoさんによる:substitute をプレビューする over.vim にスクロール機能を実装したでした。

本記事では、Vimのタブで開いているバッファのdiffを簡単に表示するpluginを書いたのでご紹介します。

※ちなみに本日1/26は、私derisの誕生日だったりします。いわゆる誕生日VACです。わーい、めでたいですね(棒

vim-diffbuf

vim-diffbufはタブで 開いているバッファ同士のdiffをとるのが面倒で作ったpluginです。
(同一タブ内で開いていればwindo diffthisで一発なんですけどね…)

diffの対象にしたい1つ目のバッファをカレントバッファとした状態でDiffBufコマンドを 実行し、diff対象にしたいもう1つのバッファでも同様にDiffBufコマンドを実行すると、 新規タブ上で垂直分割した2つのdiff対象のバッファのdiffを開きます。

実際の動作は以下のGIFアニメを見てください。

screenshot

上記GIFアニメの例では、別タブで2つの無名バッファが開かれており、 それぞれのバッファをカレントバッファとした状態でDiffBufコマンドを 実行することで2つのバッファのdiffを新規タブで開いています。

vim-diffbufでは、1つ目のdiff対象でDiffBufコマンドを実行すると 内部で、diff対象を保存します。2つめのdiffでDiffBufコマンドを 実行した時に、2つのdiffを表示します。この際内部で保存したdiff対象 はクリアするため、再度、DiffBufコマンドを実行することで、別の diff対象同士のdiffをとることが可能です。

future work

まだ作りたてなので、インターフェースは、引数なしのDiffBufコマンド (と同様の関数diffbuf#diffbuf)のみと非常に単純なpluginです。 また、diffを開く際も、新規タブ&垂直分割と固定です。 そのうち機能拡張しようと思いますが、とりあえず使いながら使いづらいところを 拡張していこうと思っています。

今のところ思いつくのは以下のような拡張です。

  • バッファ番号指定のdiff
  • 開くウィンドウの指定(新規タブか既存タブか、垂直分割か水平分割か)

もし、要望があればフィードバックしていだけるとうれしいです。

まとめ

以上が、Vimで既存バッファをvimdiffしたいときに便利なpluginについてのご紹介でした。

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

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

明日のVim Advent Calendar 2013はhaya14busaさんです。

rengbang.vimにフォーマット指定とコマンドライン確認版コマンドを追加しました

Vim

rengbang.vimにフォーマット指定とコマンドライン確認版コマンドを追加したのでご紹介します。

はじめに

rengbang.vimは、Vimで連番を入力するためのVim pluginです。

以下のブログでご紹介しています。

Vimで連番を入力するためのVim pluginを作った

連番入力時のフォーマットを指定可能に

rengbang.vimで連番入力する際、001.,002.のような連番を入力したい時がちょくちょくあって、 Lingrでもthincaさんからご要望いただいたので追加しました。

以下にようにRengBangコマンドの第5引数に%03d.\ と指定することで、 001.のような連番入力が可能です。

" フォーマットに%03d\ と指定することで001., 002. のように連番入力できます。
:RengBang \(\d\+\)  0  1  0  %03d.\ 

RengBang10

なお、内部でprintf関数を使っているので、フォーマットはprintf関数の フォーマットで指定する必要があります。

printf関数のフォーマットが使えるので、例えば16進数で連番入力したい場合は 以下のようにすることも出来ます。

" フォーマットに%04Xと指定することで16進数で連番入力できます。
:RengBang \(\d\+\)  0  1  0  %04X.

RengBang16

コマンドラインでパラメータを指定できるコマンド追加

以前からRengBangコマンドの引数が多く、入力しづらくてどうにかしたいと 思っていました。

上記フォーマット指定追加により、引数が5個になり、フォーマットを指定するためには、 (他の引数の指定が不要でも)第4引数まで指定が必須で入力しづらく、これはもう駄目だと思い、 別インターフェース(RengBangConfirm)を用意することにしました。

RengBangConfirmコマンドは引数を指定せずに実行するコマンドで、 実行するとコマンドラインでパラメータの入力を確認します。 この際、デフォルト値が入力されている状態で確認するため、 変更の必要がなければそのまま<Enter>を押すだけですむため、 RengBangよりも入力が楽です。

以下のgifアニメのように動作します。

RengBangConfirm

フォーマットだけ変更したい場合は、4回<Enter>をタイプ してフォーマットだけ変更して実行できます。

また、パターンだけ入力したい場合は、1つ目の確認でパターンを入力した後、 <Esc>をタイプすることで、その後のパラメータの確認をスキップ(デフォルト値使用) することもできます。

パラメータ確認の順番のカスタマイズ

RengBangConfirmの追加でパラメータの入力は大分楽になったのですが、 5番目に確認するフォーマットは、他のパラメータよりも使用頻度が高そうなので 確認順番をカスタマイズできるようにしました。

以下の様に変数に確認したい順番を指定することでカスタマイズ可能です。

" デフォルトのRengBangConfirmでの確認の順番の設定
let g:rengbang_default_confirm_sequence = [
  \ 'pattern',
  \ 'start',
  \ 'step',
  \ 'usefirst',
  \ 'format',
  \ ]
" 以下の様にRengBangConfirmでの確認の順番を配列で指定できます。(formatを3番目に変更)
let g:rengbang_default_confirm_sequence = [
  \ 'pattern',
  \ 'start',
  \ 'format',
  \ 'step',
  \ 'usefirst',
  \ ]
" デフォルト値から変更しないパラメータは省略することもできます。
let g:rengbang_default_confirm_sequence = [
  \ 'pattern',
  \ 'start',
  \ 'format',
  \ ]

.vimrcに書いておくことで常に指定した順番で確認するようになります。

上記2番目の設定をした上でのRengBangConfirmの動作は以下です。

RengBangConfirmCustom

一応補足しておくと、g:rengbang_default_confirm_sequenceでのカスタマイズ はRengBangConfirmコマンドの確認順番のみ変更します。 RengBangコマンドなどの他のコマンドの引数の順番を変えるわけではありません。 (少なくとも今のところは。要望があれば変更するかも)

終わりに

自分の作業用に作っているVim pluginですが、興味があれば試してみてください。

Happy Vim Life!

Vimmerなら2013年中に試しておきたい海外産Vim plugin 8選

Vim

この記事はVim Advent Calendar 2013の15日目の記事です。
14日目はjoker1007さんによるwebapi-vimとBufWriteCmdでWeb上のリソースをVimで編集するでした。

本記事では、2013年中に試しておきた海外産Vim pluginを8個ご紹介します。

はじめに

なんで海外産限定なの?

理由は以下のとおりです。

  • 日本産のVim pluginは入れている人が多く日本語での情報も多い(vimrc読書会に参加した感覚として)
  • Vim Advent Calendar 2012が1年続いたこともあり、興味深い日本産Vim pluginが多すぎる…

海外でそこそこ流行っていても日本ではあまり知られていないVim pluginが多いのでもったいなーと思ったので、本記事を書こうと考えました。

ちなみに、今回ご紹介するのは今年私が見つけたVim pluginに限定しています。このため、海外産でも昔からある有名な plugin(surround.vimsyntastic.vimなどなど)についてはご紹介していません。

なお、海外産Vim pluginは日本産と比較すると、以下のようにあまりお行儀のよろしくないVim pluginの比率が多いので、使うときには注意した方がいいです。
(今回ご紹介したもののなかではほとんどありませんが)

  • pluginディレクトリ配下にすべてのコードを配置していてる(plugin配下は起動時に読み込まれるため起動が遅くなる)
  • デフォルトキーマッピングを無効化出来ない
  • キーマッピングを変更できない

もちろん全部が全部ではないですし、日本産でも同じようなものもありますが、比較すると多いように感じます。

海外産Vim pluginはアイディアが面白いものも多いので、どんどん新しいpluginを試してみることをおすすめします。 使ってみて気になる所があればpull requestを送るか、最悪気に入らない所があればforkしてオレオレ魔改造版を作るのもありです。 (それでも足りなければオレオレpluginを1から…)

では、本編に移ります。

vim-startify

Vimの起動画面に、直近で開いたファイルや、ブックマークしたファイルなどをショートカットで開ける画面を表示するpluginです。

以下にスクリーンショットを載せます。

画像

本pluginをインストールしておくと、上記画像記載のように、Vimの起動画面に 最近使ったファイルなどのパスが表示されます。 該当ファイルの先頭の数字、アルファベットをタイプするか、該当ファイルに カーソルをあわせ<Enter>を押下すると、対応するファイルを開けます。

インストールするだけでも便利ですが、自分で表示するファイルをカスタマイズしたりもできます。

設定項目は色々あるので、詳細は:help startifyでhelpを見ていただきたいですが、便利な設定を3つほど載せておきます。 以下の様に用意されている変数で設定できます。

" startifyのヘッダー部分に表示する文字列を設定する(dateコマンドを実行して日付を設定している)
let g:startify_custom_header =
  \ map(split(system('date'), '\n'), '"   ". v:val') + ['','']
" デフォルトだと、最近使ったファイルの先頭は数字なので、使用するアルファベットを指定
let g:startify_custom_indices = ['f', 'g', 'h', 'r', 'i', 'o', 'b']
" よく使うファイルをブックマークとして登録しておく
let g:startify_bookmarks = [
  \ '~/.vimrc',
  \ '~/localrepos/blog/vac_20131215.md',
  \ ]

vim-multiple-cursors

Sublime Text の機能として有名な、multiple cursorsの機能をVimに移植したpluginです。

multiple cursorsの機能とは、操作対象の箇所を複数選択した状態で、視覚的に操作内容を 確認しながら一括操作できる機能です。

Vimは、操作対象の特定、操作、そして操作繰り返すということが容易なので、Vim的に常用して 便利かというと微妙なところですが、内容的に興味深いので載せました。

(久しぶりに使ってみたら変な挙動をしたので試される方はご注意ください)

(海外でも一時的に話題になっていたのでgithubでのstarが1900近くいっています。すごい)

ちなみに、Vimでのmultiple cursors実装は、これ以外も色々あるようです。

ただ、私は上記理由から使ってません。Vimmerなら検索、操作、.での繰り返し、 マクロ、:substituteコマンドなどを組合せて使ったほうが速い、ですよね?

複数箇所を視覚的に操作内容を確認しながら編集したいのであれば、 操作感、機能的には異なるものですが、manga_osyoさん作のover.vim を使った方が使い勝手が良いように思います。

over.vimは、昨年のVim Advent Calendar 2012でも ご本人が紹介されていたので、ここではブログ記事のご紹介までにします。

Vim の :substitute をプレビューするプラグインつくった

vim-expand-region

visual modeでの選択範囲を、さらに外側にあるtextobjectsに拡張して選択したり縮小して選択したりすることが出来るpluginです。

以下にスクリーンショットを載せます。

f:id:deris:20151120010343g:plain

上記スクリーンショットでは、初めはiw、続いてiWibil(textobj-lineインストール要)と 拡張して、その後、逆順で縮小しています。

拡張、縮小するときに考慮するtextobjectsは以下の様にvim-expand-regionのグローバル変数で変更することができます。

" デフォルトの設定
let g:expand_region_text_objects = {
  \ 'iw'  :0,
  \ 'iW'  :0,
  \ 'i"'  :0,
  \ 'i''' :0,
  \ 'i]'  :1,
  \ 'ib'  :1,
  \ 'iB'  :1,
  \ 'il'  :0,
  \ 'ip'  :0,
  \ 'ie'  :0,
  \ }

上記のようにtextobjectsをキーとした辞書をグローバル変数に設定します。

値は、01を指定します。textobjectsがネストする場合は1、しない場合は0を指定します。

ちなみに、il, ieは、標準Vimのtextobjectsではなく、Vim pluginで追加可能なtextobjectsです。iltextobj-lineietextobj-entireどちらも便利なtextobjectsなので、試してみることをおすすめします。

また、上記グローバル変数名の後ろに_{filetype}をつけることによって、filetypeごとに設定を変えることができます。

" Rubyのときだけ有効な設定は以下の変数で設定できる
let g:expand_region_text_objects_ruby = {
  \ 'iw'  :0,
  \ 'iW'  :0,
  \ 'i"'  :0,
  \ 'i''' :0,
  \ 'i]'  :1,
  \ 'ib'  :1,
  \ 'iB'  :1,
  \ 'il'  :0,
  \ 'ip'  :0,
  \ 'ie'  :0,
  \ }

脱線(submode.vimを使って入力しやすく)

私はexpand-regionでデフォルトのキーマッピングである+_は使用していません。 expand-regionを使う時は、大抵の場合、繰り返し拡張を行うため、マッピングするキーによっては 繰り返し入力するのが面倒になります。
私は拡張のキーマッピング,eに設定しているのですが、単純にキーマッピングすると、 連続して拡張する際は,e,e,eと入力する必要があり、若干入力しづらいです。
また、縮小用に別でキーマッピングする必要があり、これを考慮するとあまりマッピングするキーは 増やしたくないため、拡張は,ee、縮小は,esなどとする必要があり、,ee,ee,eeと更に入力しづらくなります。

こういう、なにかの操作をやっている間に繰り返し入力する必要があるような場合は、 submode.vimを使うと便利です。

submode.vimをインストールして、 以下の設定をすると、,eでexpand-regionのモードに入り、以降はeで拡張、 sで縮小できます。

" expand-regionモードの設定。,eでモードに入り、eで拡張、sで縮小できる
call submode#enter_with('expand-region', 'nv', 'r', '<Leader>e', '<Plug>(expand_region_expand)')
call submode#map('expand-region', 'nv', 'r', 'e', '<Plug>(expand_region_expand)')
call submode#map('expand-region', 'nv', 'r', 's', '<Plug>(expand_region_shrink)')

スクリーンショットでもsubmode.vimを使っています。

,eeeeなどとできて便利です。

splitjoin.vim

1行のコードを文脈的に同じ意味の複数行のコードに相互変換するpluginです。

以下にスクリーンショットを載せます。

f:id:deris:20151120010337g:plain

スクリーンショットでは、Rubyの一行コードを複数行コードに変換しています。

本pluginはfiletypeによっていくつかの変換ルールが定義されています。

12/15(日)現時点では以下の言語の変換ルールが定義されています。

自分が望む言語の変換ルールがなければ、pull requestを送ってみてはいかがでしょうか?

linediff.vim

visual modeで2組の行を選択し、選択した2つのdiffをvimdiffで表示できます。

以下にスクリーンショットを載せます。

f:id:deris:20151120010326g:plain

比較したい行を、visual modeで選択した上で、:'<,'>Linediffコマンドを実行し、 さらに比較対象の行をvisual modeで選択した上で同様に、:'<,'>Linediffコマンド を実行すると、両者のdiffを新しくタブページを開き表示します。

デフォルトでは、新しくタブページを開き垂直分割で開きますが、以下の グローバル変数を変更することにより、好みによってカスタマイズすることもできます。

" 1つ目に選択した行をタブページで開く
let g:linediff_first_buffer_command = 'tabnew'
" 2つ目に選択した行を垂直分割して新しいウィンドウで開く
let g:linediff_second_buffer_command = 'rightbelow vertical new'

textobj-word-column.vim

同列にある単語を矩形選択で選択したりoperatorの対象として指定したりすることができるpluginです。

以下にスクリーンショットを載せます。

f:id:deris:20151120010345g:plain

例では同列にある単語をvicで選択した後、cで編集してます。同様にしてdicで削除したり、cicで編集したりすることができます。

同列の単語を一括して編集したいときにわざわざ<C-v>で矩形選択して調整しなくても、ざっくり選択できるので便利です。

ちなみに、本pluginは、最初に述べたあまり行儀の良くないpluginに属するため(pluginディレクトリ配下にすべてのコードを配置)、 気になる方は、これを解消したLindanさんのfork版を使うことも検討してもよいかもしれません。

ただ、Lindanさんのfork版は以下2点の外部インターフェースが異なるため、使うのであれば注意が必要です。

  • デフォルトのkey mappingがoriginal版と異なる。(original版が、ic,acなのに対し、Lindanさんのfork版は、iv,av)
  • kanaさん作のVim pluginである、textobj-userが必須となる。(多くの便利なtextobjectsが本pluginを必須としているためインストールしておくことをおすすめします)

switch.vim

文字列のトグルができます。

以下にスクリーンショットを載せます。

f:id:deris:20151120010340g:plain

例えば、trueという文字列上で、:Switchコマンドを実行することによりfalseという文字列に変更できます。 逆も同様です。

毎回コマンドを実行するのはめんどうなので、実際に使う際は直接コマンドを実行するの ではなく、以下の様に何かしらのキーにマッピングして使います。 (上記スクリーンショットでもマッピングしたキーで操作しています。)

" <Space>mに、switch.vimをマッピング
" nnoremap <Space>m  <Plug>(switch-next)
" 12/16 修正
nnoremap <Space>m  :<C-u>Switch<CR>

なお、toggle系のpluginは色々ありますが、本pluginは、 正規表現での設定によりかなり柔軟な設定ができることが特徴です。 また、グローバル変数の辞書で設定するのでカスタマイズも比較的容易です。

vim-signify

VCSの差分をsignで表示するpluginです。

以下にスクリーンショットを載せます。

f:id:deris:20151120010333g:plain

:SignifyToggleコマンドを実行すると、VCSの差分がVimのsignで 表示されます。 また、上記スクリーンショットの例では、次の差分、前の差分 への移動をマッピングしたキーで行っています。

差分の移動は以下の様にキーにマッピングしておくと便利です。 また、合わせて:SignifyToggleマッピングしておくと便利でしょう。

" 次の差分箇所に移動
nmap <Leader>gj <Plug>(signify-next-hunk)zz
" 前の差分箇所に移動
nmap <Leader>gk <Plug>(signify-prev-hunk)zz
" 差分箇所をハイライト
nmap <Leader>gh <Plug>(signify-toggle-highlight)
" 差分表示をトグルする(:SignifyToggleコマンドと同じ)
nmap <Leader>gt <Plug>(signify-toggle)

おまけ

新しいVim pluginを発掘する方法

新しいVim pluginを発掘するには以下の様な方法があります。

皆さんも試してみてください。そして面白そうなpluginがあったら 是非Vim Advent Calendarに投稿してみてください。

ちなみに、上記の中では「vimrc読書会に参加する」 が特にお勧めです。

今回ご紹介したpluginの作者

今回ご紹介したpluginはよくよく見てみると、作者が同じ方のものが結構あります。

作者ごとにまとめてみました。

AndrewRadevさんのpluginが3つもありますねw 面白いpluginを書く方は、他にも面白いpluginを書いている可能性が高いので、 作者のリポジトリを眺めてみるのも良いかもしれません。

まとめ

以上が、2013年中に試しておきたい海外産Vim plugin 8選でした。

本記事で紹介する以外にも海外産Vim pluginはたくさんあるので、 興味があればいろいろ調べて見てはいかがでしょうか?

(そしてVim Advent Calendar 2013のネタとすると一石二鳥)

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

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

明日のVim Advent Calendar 2013はc0hamaさんです。

VimConf2013に参加しました

日付的には昨日になってしまいましたが、本日(11/16(土))にクックパッド株式会社で開催されたVimConf2013に参加してきたので参加レポートをば

そして、この記事はVim Advent Calendar 2012の352日目の記事を兼ねてます。 351日目はsynganさんによるvim-gitlab 作ったでした。

LTしました

以前Vim Advent Calendar 2012でも記事を書いたduzzle.vimというVimでできるパズルゲームについてLTしました。スライドは以下です。

一応国際カンファレンスということで、英語でスライドを作成しましたが、英語はGoogle翻訳先生に頼り切りでした…
もしおかしな英語を見つけたらご指摘いただけるとありがたいです。(あとで修正できるのかな…)

実は、プレゼン直前にゲーム画面のハイライト(色付け)のために作ったsyntaxファイルが無くなっている事に気づき 泣きながらLT直前までsyntaxファイルを作りなおしていたという背景があったりしました…

(git addしたつもりがしていなくてなんか適当に操作してたら消えてしまったらしい…)

今となってはいい思い出ですw

雑多な感想

詳細な感想は他の方にお任せして雑多な感想をば

  • 最初から最後まで感極まってた
  • Vimmerとのランチ楽しかった
  • Kaoriyaさんのプレゼンに圧倒された。
  • クォートのtextobj、Kaoriyaさんが作ったということを知って衝撃を受けた。スゴすぎる
  • 皆さんのプレゼン非常に濃ゆくてすごかった
  • LT前の私のテンパリ具合がやばかった
  • 歌があれであれだった
  • 懇親会、daisuzuさんとの転職話や、cohamaさんとまさかの同会社話や、色々なVimmerの方とお話出来て楽しすぎた
  • だいぶVimmerの知り合いできてきてうれしい

終わりに

まだ、興奮冷めやらぬ感じですが、ほんとに感極まりっぱなしで非常に濃い一日を過ごすことが出来ました。

主催のujihisaさん、VimConf2013運営にかかわられた方、クックパッドの方、美人受付のさっちゃんさん、発表者の方、参加者の方、皆さん本当にありがとうございました。

また次回のVimConf2014もしくはxxx.vimでお会いしましょう。

そして、明日のVACはまだ決まっていないですが、他の方のVimConf2013の参加レポを期待しましょう!

Happy Vim Life!