NeoBundleの相対パスからVim pluginのURLをブラウザで開く

Vim

この記事はVim Advent Calendar 2012の217日目の記事です。
216日目はmanga_osyoさんによるVim のプラグインを作る時に注意すべきことや便利なプラグインでした。

NeoBundleの相対パスから、Vim pluginのURLを開く設定についてです。

小ネタです。
たまにはこんなVACでもいいと思うので、皆さんもっと気軽にVACに投稿すればいいと思います。

はじめに

先日行われたTokyoVimのあとのmomonga.vim時のvimrc読書会で、 自分が書いてるvimrcの設定をthincaさんとsupermomongaさんに見せたところ 便利。と同意を頂いたので小ネタですが、VACに書くことにしました。

どういう時に使うかというと人のvimrcを読んでいる時、つまりvimrc読書会で このVim pluginなんだろう?と思った時にさっとURL開けるので便利です。

ちなみに、vimrc読書会は毎週土曜日23時から やっていてどなたでも参加可能なので、是非参加して見ることをおすすめします。

NeoBundleの相対パスから、Vim pluginのURLを開く

以下の設定をvimrcに書いて、例えばNeoBundle 'deris/vim-rengbang'と記載された行で、gzとタイプすると ブラウザでそのVim pluginのURL(この場合https://github.com/deris/vim-rengbang)をブラウザで開きます。
もしくは、visualモードでderis/vim-rengbangの部分を選択してgzとタイプしても開けます。

なお使用には、tyruさんが作られたopen-browser.vimを インストールしておく必要があります(NeoBundleでのインストールも一緒に下の設定に書いてます。)

NeoBundle 'tyru/open-browser'

nnoremap gz vi':<C-u>call ExecuteWithSelectedText('OpenBrowser https://github.com/%s')<CR>
vnoremap gz :<C-u>call ExecuteWithSelectedText('OpenBrowser https://github.com/%s')<CR>

" visualモードで最後に選択したテキストを%sで指定してコマンドを実行する {{{
function! ExecuteWithSelectedText(command)
  if a:command !~? '%s'
    return
  endif

  let reg = '"'
  let [save_reg, save_type] = [getreg(reg), getregtype(reg)]
  normal! gvy
  let selectedText = @"
  call setreg(reg, save_reg, save_type)
  if selectedText == ''
    return
  endif

  execute printf(a:command, selectedText)
endfunction
" }}}

gist

私のvimrcからほぼそのまま持ってきたものです。

normal modeの方は、vi'で相対パスを選択しているので、相対パスの文字列部分を ""でくくっている方はvi"のように適宜修正するか、visualモードで選択して開いてください。


ここまで書いてて、ちょっと汎用的じゃないなぁと思ったので、operator-user対応しました。
使用にはkanaさんが作られたoperator-userを インストールしておく必要があります(NeoBundleでのインストールも一緒に下の設定に書いてます。)

NeoBundle 'tyru/open-browser'
NeoBundle 'kana/vim-operator-user'

call operator#user#define('open-neobundlepath', 'OpenNeoBundlePath')
map gz <Plug>(operator-open-neobundlepath)
function! OpenNeoBundlePath(motion_wise)
  if line("'[") != line("']")
    return
  endif
  let start = col("'[") - 1
  let end = col("']")
  let sel = strpart(getline('.'), start, end - start)
  let sel = substitute(sel, '^\%(github\|gh\|git@github\.com\):\(.\+\)', 'https://github.com/\1', '')
  let sel = substitute(sel, '^\%(bitbucket\|bb\):\(.\+\)', 'https://bitbucket.org/\1', '')
  let sel = substitute(sel, '^gist:\(.\+\)', 'https://gist.github.com/\1', '')
  let sel = substitute(sel, '^git://', 'https://', '')
  if sel =~ '^https\?://'
    call openbrowser#open(sel)
  elseif sel =~ '/'
    call openbrowser#open('https://github.com/'.sel)
  else
    call openbrowser#open('https://github.com/vim-scripts/'.sel)
  endif
endfunction

gist

gzにkey mappingしているので、normalモードでgzとタイプし、 textobjects(i',iwとか)を入力するか、visualモードで選択したあとgzと タイプすることで、NeoBundleの相対パスからURLを開くことができます。

この設定では、最初の設定と比較して、http://~,https://~,git://~のパス、 およびNeoBundleのgithub:~,bitbucket:~,gist:~形式のパス、 www.vim.orgにあるVim pluginをホストしているhttps://github.com/vim-scripts のパス(NeoBundle 'project.tar.gz'とか)もURLで開くことができます。

operator-user対応したことで、若干タイプ数は増えましたが、大分汎用的になりました。

まとめ

以上が、NeoBundleの相対パスから、Vim pluginのURLを開く設定についてでした。

今回ご紹介した設定は、vimrc読書会に参加する上で便利な設定なので、本設定をした上で是非ご参加ください。毎週土曜日23時からやってます。

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

明日のVim Advent Calendar 2012はKSuzukiiiさんです。

TokyoVim#15に初参加しました

Vim

TokyoVimに初参加したので感想をば。
あと、同日深夜から開催されたmomonga.vimにも参加してきたので合わせて感想をば。

TokyoVimやったこと

おやつに何を持っていくかを考えすぎて、TokyoVimでやるネタを あまり考えていなかったのですが、やったことを箇条書きで。

  • おやつはラスクを持って行きました。
  • 自作pluginのgif動画を前にとったんですが、:lang Cすればメッセージが英語になって、よりworld wideになりますよと、h_eastさんからtwitterでご指摘を受けたので撮り直しました。
  • 温存していたvim-altrへのpull requestをしました。githubのissuesが英語だけだったので頑張って英語でコメントしたんですが、日本語でいいとkanaさんからありがたいお言葉をいただきました。

ちなみに、今回動画を撮り直したのは以下4つのplugin。

TokyoVim感想

感想を箇条書きで。

  • 初kanaさん!!! kanaさんのVim pluginにはいつもお世話になっているので感動。いつもお世話になっていますくらい一言お話すればよかった
  • 会場に漂うVimオーラが凄かった
  • ドーナツ美味しいレス。お菓子食べ過ぎた
  • 懇親会場はジョナサン。ジョナサンの一角でノートPCを広げる7人の怪しい集団というなんともシュールな光景でしたが楽しかったです

momonga.vimについて

TokyoVimのあと懇親会をはさんで、momonga邸にてmomonga.vim第1回が開催されました(お泊り)。
momonga.vimは、主催のsupermomongaさん、thincaさん、私derisの3人が参加しました。

キャパ的にmomonga.vimは3人が限界の模様です。

momonga.vimでは以下の催し事が行われました。

  • vimrc読書会に参加
  • AizuVim鑑賞会
  • 電波ソングを流しながらのもくもく会
  • Lingrを介しつつの面白おかしいトーク

まとめ

今週末は非常にVim充できました。
TokyoVim主催のkanaさん、お昼をご一緒していただいたrbtnnさん、参加者の皆さんありがとうございました。
また、momonga.vimでお泊りさせた頂いたsupermomongaさん、ご一緒にお泊りしたthincaさんありがとうございました。

また、TokyoVim & momonga.vimに参加したいと思います。

ではでは

Happy Vim Life!

Gifzoを使って自作Vim pluginにgif動画をつけた

Vim

はてなブログ Vimグループ作ったよ

こんにちは!derisです。

はてなブログVimグループを作ったので、お気軽にご参加ください。
私自身、はてなブログ グループの利点がまだよくわかっていませんので面白い使い方があれば(あるのかな?)是非教えて下さい。

はてなブログVimグループに投稿するのはこれが初です。

Gifzoを使って自作Vim pluginにgif動画をつけた

GifzoというGif動画作成&共有アプリがあるのですが、これがVim操作のGif動画作るのにすごい便利だったのでgithubに上げている自作pluginのREADMEすべてにgif動画を追加してみました。

columnjump
parajump
vim-textobj-enclosedsyntax
vim-fitcolumn
vim-duzzle
vim-rengbang

これで、かなり残念な英語を書いていても、なんとなくわかってもらえるはずです。

Gifzoについて

Gifzoの使い方は簡単で、アプリを起動したら、動画を取りたい範囲を選択して、Macならopt+rで録画開始、opt+rで録画終了、これだけです。
これで、Gif動画がGifzoのサーバにアップロードされるので、リンクをそのまま使うなり、gif動画 or MP4動画をダウンロードするなりして使うことができます。
上で追加したVim pluginのgif動画は、リンクに.gifの拡張子をつけてを貼り付けてます。 とても簡単。

アプリは、Win版とMac版があります。

慣れればとても便利ですが、ちょっとだけGifzoの動きで気になるところはあります。

  • 録画終了するためにはGifzoアプリに切り替えてからopt+rする必要がある(切替画面が映り込むことがあり悲しい
  • 範囲選択が矩形選択しかなく面倒

気になるところは今のところこれくらい。でも今のところ便利に使えているので皆さんも使ってみてください。

おわりに

Gifzoを使って、自作Vim pluginや便利だと感じるVim操作などのGif動画をブログに貼り付けて、Vim Advent Calendar 2012に投稿すればとても素敵だと思います。
2013も始まって半分くらい経ちますが、Vim Advent Calendar 2012はまだまだ続いています。

以上です。

でわでわ~

Happy Vim Life!

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

この記事はVim Advent Calendar 2012の198日目の記事です。
197日目はyonchuさんによるVim Advent Calendar 2012 に’はてブ数’を表示させるグリモンとブックマークレットを作ったよ!でした。

Vimで連番を入力するためのVim pluginについての記事です。

6/16 18:30 追記(operatorを本体に統合したので記載を修正)

はじめに

文章で説明するより使用している様子を見たほうがわかりやすいと思うので、 まずは以下のGIFアニメをご覧ください。 これは、Vim scriptの配列の値として、 0〜99までを設定するために 今回ご紹介するVim pluginを使っている様子です。

使用感

0を100個入力するところまでは、本pluginは関係ありません。 その後のRengBangコマンドを実行して、連番に置き換えているところが 本pluginの機能です。

本pluginは、私がLingrでこんなplugin欲しいなぁとつぶやいたところ、 manga_osyoさんが原型のscriptをものの数分で作ってくださったという経緯があります。
それを元に色々機能追加してplugin化したのが本pluginです。 この場を借りてmanga_osyoさんにお礼を言いたいと思います。ありがとうございます。manga_osyo++

あと、rengbang(連番)という名前をつけていただいたのはujihisaさんです。 短くてわかりやすくて、とてもいいネーミングで気に入ってます。 この場を借りてujihisaさんにお礼を言いたいと思います。ありがとうございます。ujihisa++

インストール方法

プラグイン名はvim-rengbangという名前で、githubにあげてます。

NeoBundleを入れていれば.vimrcに以下を書いておけばインストール出来ます。

6/16 18:30 追記(operatorを本体に統合したので記載を修正)

operator-user用のplugin(vim-operator-rengbang)も用意したので、必要であれば合わせて入れてください。 vim-operator-rengbangは単体では動かず、使用するためにはvim-rengbangと kanaさんが作られたvim-operator-userが必要です。 vim-rengbang用operatorをvim-rengbang内に統合しました。 vim-operator-rengbangは不要です。vim-operator-userが インストールされていればoperatorは使えますが、されていなければ使えません。

NeoBundle 'deris/vim-rengbang'

もちろん、.vim(Winであればvimfiles)配下に直接入れても構いません。

使い方

本pluginのインターフェースは3つあります。

  • コマンド
  • 関数
  • operator

順に使い方を説明します。

コマンド

2つのコマンドを用意しています。

  • RengBang
  • RengBangUsePrev
" [range]RengBang [{pattern} {start} {step} {use_first}]
"   [range]で指定された範囲の中から、{pattern}にマッチする部分
"   を順に連番と置き換える。
"   引数はいずれもオプションで、指定されていなければ
"   デフォルト値を使う
"   {pattern}は連番を挿入したい箇所の正規表現を指定する。デフォルト値は\(\d\+\)
"   {start}は連番の開始時の値を指定する。デフォルト値は0
"   {step}は連番入力時の階数を指定する。デフォルト値は1
"   {use_first}は連番挿入時、一番最初にマッチした部分の数字を
"   起点として連番を挿入するかどうかを指定する。
"   0は起点としない。1は起点とする。デフォルト値は0
"   ※ただし、{start}も指定されている場合
"     マッチした部分の数字 + {start}が起点となる

" 例:{pattern}
" visual modeで選択下範囲の、配列内の添字を連番で置き換え
:'<,'>RengBang \[\zs\(\d\+\)\ze\]
" \(...\)で指定している場合、自動で\zs,\zeを挿入するので上記は以下と同様
:'<,'>RengBang \[\(\d\+\)\]

" 行頭に連番を挿入
:'<,'>RengBang ^

" 行末に連番を挿入
:'<,'>RengBang $

" hogeの後に連番を挿入
:'<,'>RengBang hoge\zs

" パターン内にspaceを使いたい場合は\でエスケープする必要があるので注意
:'<,'>RengBang \ \(\d\+\)\ 

" 例:{start}
" 5から連番を始める(5 6 7 8 9...)
:'<,'>RengBang \(\d\+\) 5

" 例:{step}
" 5階数で連番を入力(1 6 11 16 21...)
:'<,'>RengBang \(\d\+\) 1 5

" 例:{use_first}
" 最初にマッチした数字から連番入力
" (例えば最初にマッチした数字が10の場合、10 11 12 13 14...)
:'<,'>RengBang \(\d\+\) 0 1 1

" [range]RengBangUsePrev {start} {step} {use_first}
"   一つ前に実行したRengBangもしくはRengBangUsePrevもしくは
"   次章で記載する関数連番入力系関数で指定した
"   引数を使用してRengBangを実行する
"   引数が指定されていればそれを使用し、指定されていなければ
"   一つ前に実行したときの引数を使う
"   一度も実行されていなければデフォルト値を使う

" 下記の順にコマンドを実行すると、RenbBangUsePrevは上のRengBangと同等になる。
:'<,'>RengBang \(\d\+\) 0 1 1
:'<,'>RengBangUsePrev

関数

3つの関数を用意しています。

  • rengbang#rengbang()
  • rengbang#rengbang_use_prev()
  • rengbang#config()
" rengbang#rengbang([{pattern}, {start}, {step}, {use_first}]) [range]
"   RengBangと同等。
" rengbang#rengbang_use_prev([{start}, {step}, {use_first}]) [range]
"   RengBangUsePrevと同等。

" patternの文字列を''で囲むところ以外、コマンドとあまり変わらない
:'<,'>call rengbang#rengbang('\(\d\+\)')
:'<,'>call rengbang#rengbang_use_prev()

" rengbang#config([{pattern}, {start}, {step}, {use_first}])
"   デフォルト値を変更する。
"   vimrcなどに書いておくことでデフォルト値を変更できる。

" 以下でデフォルト値を変更できる
:call rengbang#config('\[\zs\(\d\+\)\ze\]', 1, 5, 1)

operator

2つのoperatorを用意しています。

  • (operator-rengbang)
  • (operator-rengbang-useprev)

6/16 18:30 追記(operatorを本体に統合したので記載を修正)

operatorを使用するには、上でも記載したとおり、operatorを使用するには 別途vim-operator-rengbangもインストールしておく必要があります。

" <Plug>(operator-rengbang)
"   operatorで指定した範囲を[range]としてRengBangを実行します。
"   引数は全てデフォルト値を使用します。
" <Plug>(operator-rengbang-useprev)
"   operatorで指定した範囲を[range]としてRengBangUsePrevを実行します。
"   引数は一つ前にRengBang系コマンドor関数を実行したときの引数を使用します。

" operatorを使用するには以下のようにvimrcにkey mappingを設定しておきます。
map <Leader>sr <Plug>(operator-rengbang)
map <Leader>sp <Plug>(operator-rengbang-useprev)

使用例

正規表現で指定できる箇所に連番を挿入(or置き換え)できるので、 大抵のことはできますが、3つほど使用例をあげます。

先頭に連番を挿入する

使用例1

fooの後に連番を挿入する

使用例2

配列の添字がずれてしまったのをなおす

使用例3

マクロと比較して

マクロを使って連番を入力している方も多いかと思います。 マクロ使えばできるからpluginなんていらないじゃんという方もいるかと思いますが、 まぁそれはその通りで、何事もそうですが要は使いやすいと思った方を選べばいいのです。

自分も連番入力にはマクロを使うことが多いですが、場合によってはマクロで やるのが結構面倒な場合があったので本pluginを作りました。

ちなみに、マクロを使った連番、およびちょっとした便利scriptについては以下の記事が詳しいです。 (私もここで紹介されているscriptとマクロを併用していました)

Vimで番号を順番につける方法

本pluginとマクロどちらを使えばいいか、個人的な感覚ですが、ケースによって分けてみました。

本pluginを使う

  • 本pluginのデフォルト値で事足りる(コマンドor関数を引数なしで呼び出す。できればoperator使ったほうが楽)。
  • 連番を入力したいパターンが決まりきっている(vimrcにデフォルト値を設定して使用)。
  • 連番を挿入したいパターンがぱっと思い浮かぶ(その場でコマンドor関数を実行)。

マクロを使う

  • 連番入力と合わせて何かする必要がある。
  • 単純な連番ではなく、この範囲の数字は1で統一、この範囲の数字は2で統一といった複雑なことをする必要がある。
  • マクロが大好きで使うのが苦にならない(考える前に手が勝手に動く)

まとめ

以上が、Vimで連番を入力するためのVim pluginについての記事でした。

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

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

明日のVim Advent Calendar 2012はmanga_osyoさんです。

Vimでできる脱出系パズルゲーム

この記事はVim Advent Calendar 2012の184日目の記事です。
183日目はLinda_ppさんによる一時ウィンドウを手軽に出し入れできる tmpwin.vim を作ったでした。

Vimでできる脱出系パズルゲームのvim-duzzleを作ったのでご紹介します。 タイトルのゲームジャンル名はよくわからないので適当です(笑)。

はじめに

先日ポータル2というゲームをプレイしたのですが、あまりにも面白くて 自分も何かゲーム作りたいと思い、 ノリと勢いで作ったのが本ゲームです。 ポータル2は本題ではないので、紹介は記事の最後にしますが、ほんとうに面白いので 未プレイの方は是非プレイしてください。

なぜVimでゲームを作ったかと聞かれたらそこにVimがあったからとしか答えようがありません。。。

本ゲームはポータルにインスパイアされて作ったものですが、ゲーム内容はポータルとは何も関連がありません。

なお、このポータルというゲーム上の、ポータルという仕組みを某thincaさんがVimに持ち込もうとしています!!!
おそらく、そのうちVim Advent Calendarで記事を書かれると思うので、ポータルファンは楽しみ&必見ですね!

インストール方法

ただのVim pluginなので、他のVim pluginと同じようにインストールしてください。 NeoBundleをインストール済みであれば以下の様な感じで行けます。

NeoBundle 'deris/vim-duzzle'

もちろん、.vim(vimfiles)配下にコピペでも構いません。

開始方法

インストールしていれば、以下で開始出来ます。

:DuzzleStart

注意点として、ゲームの操作性のために独自キーマッピング (というかいろんなキーをつぶしたり設定しなおしたり)しています。

:(コマンドラインモードに移行)も使えないようにしているため、ゲーム終了には:bd!を 割り当てたQを使うしかなかったりします。

また、本ゲームは今日やっと動いた程度のできたてホヤホヤのαバージョンです。 極力作業用Vimとは別で、ゲーム用にVimを立ち上げることをおすすめします。

ゲーム実行中に問題があって、編集中のファイルが飛んでしまっても、 一切責任を取れませんのでご注意ください。

(まぁ、Vimならswapファイル作るようにしておけば万が一のことがあっても 回復出来ますけどね:help swap)

何か問題があれば本記事にコメントいただけると助かります。
(特に色々キーマップを設定されている方は弊害がある可能性が高いです。)

ゲーム内容

簡単に説明すると、与えられたVimコマンドを使って閉じ込められた部屋から出口(g)まで たどり着くゲームです。

やっていただくのが一番手っ取り早いと思います。

イメージは以下のGIFアニメーションをご覧ください。

画像

本ゲームの目的は、各部屋ごとに与えられたVimコマンドを 使って閉じ込められた部屋から脱出する(gまでたどり着く)ことです。 各部屋で与えられたVimコマンド以外は使えません。 一応キーマッピングで無効化して使えないようにしていますが、簡単な無効化しかしていないので 頑張れば、他のコマンドを使うことが出来るかもしれません。 ただ、ゲーム性が皆無になるのでおすすめしません。
(そういうハックを楽しむことが目的のゲームではありませんw)

キーを無効化する都合上、:も使えないようになっています。 なので、ゲームを終了したい場合は、Qを押下してください。

現状はVim標準コマンドだけですが、モチベーションが続けば、 そのうちゲームの拡張でVimとは関係ないコマンドも用意するつもりです。

ゲームカスタマイズ

本ゲームは自分でパズルを追加するようカスタマイズ出来るようになっています。 ゲーム内で使えるVimコマンドは、現在用意されているものしか使えませんが 同じようなパズルなら作れます。

autoload/duzzle以下にあるファイルを見ればなんとなく ゲームの追加方法がわかると思います。

追加用の関数は以下のように引数2つで呼び出します。

call duzzle#add_puzzle(
  \ '実験名(拡張ごとにパズルセットに名前を付けられるようにしています。)',
  \ {'パズルの情報を辞書形式で(詳細は実際のファイル参照)'}
  \ )

興味がある方は是非作ってみてください。 pull requestもお待ちしております。

別プラグインを作って、そのautoload/duzzle配下に同じようにファイルを配置することでも可能にしていますが、まだ動かないかもしれません。

おまけ

Vimでできる他のゲームの紹介

Lingrでmanga_osyoさんに教えていただくまで知らなかったのですが、実は Vimで出来るゲームは結構あります。
紹介記事は以下の様な物があります。

Vimで動くゲーム
3D in Vim

私はテトリスくらいしか知りませんでした。

正直どれもレベルが高いです。 興味があればプレイしてみると息抜きになっていいかもしれません。

ポータル2について

冒頭でもお話しましたが、少しだけポータル2の話をします。

ポータル2は、ポータルというゲームの続編でWikipediaによると アクションパズルゲームとあります。 初期のポータルはもともとオレンジパックという5本セットのゲームの1つだったんですが、 人気のためか?後日単品で発売されたという経緯があります。 そのゲームの続編がポータル2です。

Wikipedia:ポータル
Wikipedia:ポータル2

ゲームの肝はポータルという穴をうまく使ってゲームをクリアしていくことです。 説明が難しいのでWikipediaから抜粋します。

プレイヤーは「壁に向かって撃つと穴(ポータル)ができ、もう一つの穴の方へ移動できるポータル銃」を使い、様々な仕掛けをポータル銃で突破しながら出口へ向かう。ポータルを作れるのは金属製ではない床と壁と天井。ポータルを使って自分が移動するほか、スイッチを押すのに必要なキューブや、その他のものをポータルに入れて別の場所へ移動させる事も出来る。

なかなか、このゲームの面白さを説明するのは難しいのですが、 難しいステージ(ゲーム内ではチェンバー)をポータルをうまく使ってクリアした ときの感覚が爽快なのです。

ゲームをプレイした時の感想(イメージ)

  • 「おい、このチェンバーまじかよ。。。こんなんクリアできんのかよ」
  • 「あ!そういうことか!スゲー!マジスゲー!このゲーム考えた奴どういう頭してんだよ!」
  • 「ヒ、ヒエェ。。。(ゲームをやった事ある人ならどの場面か多分分かるはず)」

ポータルもポータル2も面白いので是非どちらともやって見ることをおすすめします。
(ちなみに個人的にはポータル2のほうが好きです。)

私はXBOX360版でやりましたが、PS3でもWindows,Macでもできます。
Windows,Mac版はセットのやつがお得っぽいです。

ポータル2 (価格改定版)

ポータル2 (価格改定版)

EA BEST HITS ポータル2

EA BEST HITS ポータル2

[価格改定]ポータル1&2パック【日本語版】

[価格改定]ポータル1&2パック【日本語版】

まとめ

以上がVimでできる脱出系パズルゲームについての記事でした。

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

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

明日のVim Advent Calendar 2012はcohamaさんです。