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

遅くなってしまいましたが、10/13(日)に武蔵境で開催されたmomonga.vim#2に参加したので、感想レポートをば

昼食

会場ともなった武蔵境プレイスで、参加者5名でお昼食をご一緒しました。 武蔵境プレイスが想像以上にお洒落空間でちょっと場違い感を感じつつも、カフェで優雅にランチ。 ランチの場ではVimmer特有のシャイフィールドを作りつつも小粋なVimトークで花をさかせつつ?美味しいランチを頂きました。

TokyoVimに参加して人生が変わりました! - daisuzu's notesを書かれたdaisuzuさんが隣にいらっしゃったので少しだけ 転職の話を少しお聞きするなどして有意義な時間を過ごすことができました。

もくもく会

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

やったことは以下3点

  1. 鳩サブレ
  2. capslock.vimにpull request
  3. Sticky Shiftを改良(capslockも可能に)

鳩サブレ

おやつに鳩サブレ持って行きました。

人数分なくて食べれなかった方すいません。。。

capslock.vimにpull requestを送る

最近Sticky Shiftを使おうと色々調べてる過程で知ったcapslock.vim にpull requestを送りました。

capslock.vimVim Hacksでも紹介があったのでご存じの方もいるかと思います。

Vim-users.jp - Hack #47: 大文字を連続で入力する

capslock.vimVim上で仮想的にcapslock機能を提供するVim pluginです。

key mappingしてcapslockをenable,disable,toggleしたりできます。

ただ、現状のcapslock.vimでは、 切り替えられるのはa-zA-Zだけで、0-9や記号などをcapslockで切り替える ことができません。

このため、1-9や記号などもcapslockで切り替えられるように修正して pull requestを送りました。 (10/19 15:40時点 未取込)

修正はグローバル変数でcapslockで切り替えるキーをカスタマイズ出来るように したことです。 以下の様な設定をvimrcに書いておけば、数字や記号も capslockで切り替えることができます。

" capslock for US keyboard
let g:capslock_key_mapping = {
  \ '1': '!',
  \ '2': '@',
  \ '3': '#',
  \ '4': '$',
  \ '5': '%',
  \ '6': '^',
  \ '7': '&',
  \ '8': '*',
  \ '9': '(',
  \ '0': ')',
  \ '`': '~',
  \ '-': '_',
  \ '=': '+',
  \ '[': '{',
  \ ']': '}',
  \ '\': '|',
  \ ';': ':',
  \ '''': '"',
  \ ',': '<',
  \ '.': '>',
  \ '/': '?',
  \ }

上記グローバル変数の辞書で設定しておけば、capslock切替時に keyvalueに変換することができます。

Sticky Shiftを改良(capslockも可能に)

上記capslock.vimは実は本題ではなく 本題はこちらでした(pull req送ったものの、結局自分では使う予定ない。。。)。

Sticky Shiftでちょっと使いづらいところがあったので改良しました。 (Sticky Shiftの改良と言うよりは、併用して使うcapslock追加と言ったほうが正しいかな)

VimでSticky Shift使う方法はVim Hacksでも紹介されており、自分も最近この設定をしてSticky Shiftを使用しています。

Vim-users.jp - Hack #54: VimでSticky Shiftを実現する

基本的には上記設定で十分なのですが、たまにSticky Shiftではなくcapslock的な操作をしたいことがあり、 その際はSticky Shiftだと、毎回;x;x;x;xのような操作をしなければならず 普通にShiftを使うより打ちづらくなってしまいます。

このため、capslockしたい場合にはcapslockするように設定を追加しました。

設定の追加は上記でpull reqしたcapslock.vim ではなく、みんな大好きsubmode.vimで実現することにしました。

設定は以下です。 ;<Tab>でcapslockに切り替えられるようにしています。

" capslock for US keyboard
let s:capslock_key_set = {
  \ '1': '!',
  \ '2': '@',
  \ '3': '#',
  \ '4': '$',
  \ '5': '%',
  \ '6': '^',
  \ '7': '&',
  \ '8': '*',
  \ '9': '(',
  \ '0': ')',
  \ '-': '_',
  \ '=': '+',
  \ '[': '{',
  \ ']': '}',
  \ ';': ':',
  \ '''': '"',
  \ ',': '<',
  \ '.': '>',
  \ '/': '?',
  \ '`': '~',
  \ ' ': ';',
  \ }
call submode#enter_with('capslock', 'cis', '', ';<Tab>', '<Nop>')
call submode#leave_with('capslock', 'cis', '', '<Tab>')
for s:char in range(char2nr('a'), char2nr('z'))
  call submode#map('capslock', 'cis', '', nr2char(s:char), nr2char(s:char-32))
endfor
unlet s:char
for [s:lhs, s:rhs] in items(s:capslock_key_set)
  call submode#map('capslock', 'cis', '', s:lhs, s:rhs)
endfor
unlet s:lhs
unlet s:rhs

submode.vimでinsert modeのmappingを するとなぜかカーソル位置で)が表示されるのが玉に瑕ですが、 実害はないので気にしないことにしました。 (わかりやすいように表示してるのかな?)

雑多な感想

  • unmoremasterさんがいつもの?アノニマス仮面を会議室の外からかぶってきてとてもシュールだったw
  • メンバーが濃ゆかった(名だたるVimmerが勢ぞろい)
  • puyo.vimがすごいことになってた
  • スペシャルゲストがShougoさんだったなんて全然気づかなかったわー(棒)
  • Shougoさんがまさかあんな格好で写真を撮られるとは。。。
  • MBP 15inch Retina欲しい。。。
  • 二次会でdaisuzuさんの転職話もっとお聞きしたかった
  • 二次会でVim談義もっと(ry

終わりに

家族の集まりがあったため、二次会以降参加できなかったのが唯一の心残りでしたが Lingrでの三次会の会話にも若干混ざったりもして、一日楽しい時間を過ごすことが出来ました。

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

また、momonga.vimもしくはxxx.vim(直近ではVimConfかな?)でお会いしましょう。

Happy Vim Life!

Vimで編集を効率的に行うための繰り返し操作について

Vim

この記事はVim Advent Calendar 2012の232日目の記事です。
231日目はrbtnnさんによる`vimproc#system({expr})`の{expr}の展開のされ方でした。

本記事は、Vimで編集を効率的に行うための繰り返し操作について記載します。

カーソル位置の単語編集の繰り返し

カーソル位置の単語を編集して同じ単語の編集をファイル内で繰り返したい場合、 以下の順で実行します。

  1. *でカーソル位置の単語で前方検索する
  2. (必要に応じて)Nで最初の位置に戻る(私は**Nをマッピングしてます)
  3. ciwでカーソル位置の単語を削除し編集する
  4. n.で単語の編集を繰り返し
  5. 確認不要だったり量が多ければ%s//<C-r>./g

以下は上記操作のGIF画像です。 screenshot1

最初から:substituteコマンドを使う事も考えられますが、 検索で確認しながら、編集に移行するかどうかを判断できるので 上記のようにまずは.での繰り返しを考えます。

:substituteのオプションでcをつけることにより確認もできます :%s/foo/bar/gcのように実行します。

上記では*を使っていますが、g*で、カーソル行の単語を 他の単語の一部として検索して置換することもできます。

  1. g*でカーソル位置の単語で前方検索する
  2. (必要に応じて)Nで最初の位置に戻る
  3. vと移動(lなど)で単語を選択し、cで編集する
  4. n.で単語の編集を繰り返し
  5. 確認不要だったり量が多ければ%s//<C-r>./g

以下は上記操作のGIF画像です。 screenshot2

visual modeで選択したテキストで検索できる visualstar.vimというVim pluginも合わせて使うと更に便利です。

検索でマッチする(しない)行を削除

:globalコマンドと:deleteコマンドを組み合わせて実行します。

" fooにマッチする行をすべて削除する
:g/foo/d

逆に検索でマッチしない行を削除したい場合 :vglobalコマンドと:deleteコマンドを組み合わせて実行します。

" fooにマッチしない行をすべて削除する(:vglobalコマンド使用)
:v/foo/d

編集の繰り返しとは話が若干それますが、:globalコマンドと:yankコマンドを 組み合わせて検索にマッチする行をすべてレジスタにコピーすることができます。

" aレジスタに検索にマッチする行をすべてコピー

" aレジスタをクリア
:let @a = ''
" fooにマッチする行をすべてヤンクしてaレジスタに追加(大文字で追加になる)
:g/foo/y A

コマンド繰り返し

@:で最後に実行したコマンドを実行できます。
例えば:bnコマンドを実行したあと@:で繰り返せばバッファ移動を繰り返せます。

:global:substituteコマンドを繰り返すこともできます。

:substituteコマンドは、&g&:&&などで繰り返すこと もできます。それぞれの意味は:help &などで調べて見てください。

マクロで繰り返し

マクロは難しいと思われている方もいるかもしれませんが、慣れればとても便利なので使ってみましょう
マクロを使いはじめるには、まずは行単位の操作をマクロとして記録することをおすすめします。

例:検索にマッチする行の行頭と行末に特定の文字列を挿入する

検索にマッチする行の、行頭と行末に特定の文字列を挿入する操作をマクロとして記録したい場合、以下のようにタイプします。

/fooのように検索したうえで

qqI/*<Esc>A*/<Esc>nq

を実行します。

上記を分割すると
qq:マクロ記録開始
I/*<Esc>:行頭に/を挿入
A*/<Esc>:行末に
/を挿入
n:検索前方移動
q:マクロ記録終了
となります。

これでqレジスタにマクロが記録されたので@qで同じ操作を繰り返せます。
マクロはcountが使えるので9@qなどと指定することでマクロを複数回実行出来ます。

以下は上記操作を繰り返したGIF画像です。 screenshot3

最後にエラーが発生していますが、これは9@qでマクロをcount指定で 実行した際、nの検索で検索文字見つからなかったために表示されたものです。
countでの繰り返しの中でエラーが発生するとマクロ操作が途中で止まるため、 検索でマッチする数がわからなくても適当に999@qなど、countを適当に指定して繰り返し実行できます。

複数ファイル一括操作

複数ファイル一括操作には、argdobufdowindotabdoなどが使用出来ます。
それぞれの詳細は:help argdoなどで調べてください。

ここではargdoを例として説明します。

カレントディレクトリ内のすべてのファイルを一括編集するには argsargdoのコマンドを組み合わせて実行出来ます。

" カレントディレクトリ内の拡張子がvimのファイルをすべてargdoの対象にする
:args *.vim
" カレントディレクトリ内のファイルのすべてのfooをbarに一括置換
:argdo %s/foo/bar/g
" 上記編集結果をすべてのファイルで保存
:argdo update

:argdoする前に:set hiddenしておく必要があります。
カレントディレクトリは:pwdコマンドで確認できます。

カレントディレクトリ内のすべてのファイルにマクロ実行するには argsargdoのコマンドを組み合わせて実行出来ます。

" カレントディレクトリ内の拡張子がvimのファイルをすべてargdoの対象にする
:args *.vim
" カレントディレクトリ内のファイルにマクロ実行
:argdo normal! 999@q
" 上記編集結果をすべてのファイルで保存
:argdo update

ここでは:args *.vimなどとしましたが、vimfiler.vim というVim pluginでのファイル指定および、actionでexアクションからargsコマンドを使うことにより、 指定したファイルに対して一括操作ができます。

編集操作を繰り返す際の考え方

Vimでの編集操作の繰り返しは:help repeat.txtを見てもわかるように大きく3つあります。

  1. .での繰り返し
  2. :substituteglobalvglobalなどのコマンドでの一括編集
  3. マクロ(qx,@q)での繰り返し

私が編集操作を繰り返す際に考えるのは、上記の13の順に繰り返しで編集操作できないか考えます。
まずは.で繰り返せるものなら.で繰り返します。
.で対応できないような操作はコマンドかマクロで対応します。
コマンドとマクロのどちらを使うかは場合によります。単純なパターンを書けるのであれば :substituteなどのコマンドを使うことを先に考える場合もありますし、 ちょっとパターンを書くのが面倒そうであればマクロを先に考える場合もあります。

例えばマクロの例であげたの操作は、以下のように書いても実現出来ますが、パターンを考えなくていい分、マクロで考えた方が若干楽です。

:s/\s*\zs.*/\/*&*\//g

このバランスは使っていくうちにわかっていくと思います。

コマンド、マクロで実行した上で、更に他のファイルにも同じ操作を繰り返したい場合は @:でのコマンド繰り返しや、normal! 999@aでのマクロ操作繰り返しを使います。
更に複数ファイルある場合は、argdobufdowindotabdoなどを 使用して繰り返します。

おまけ

qfreplaceというVim pluginを使用することで、 grepした結果のquickfixウィンドウの該当する各行を別バッファで開き、 そのバッファ上で編集を行い保存することで、該当行を編集することができます。

以下はqfreplaceを使った操作のGIF画像です。

screenshot4

grepでNeoBundleを検索して、quickfixウィンドウを開き、 qfreplaceで開いた 別バッファ上で編集することで該当行を編集しています。
上記GIF画像は1ファイルだけで編集していますが、qfreplaceで 開かれる別バッファでは複数ファイルの該当行を一緒に編集することができるため かなり強力です。

まとめ

以上が、Vimで編集を効率的に行うための繰り返し操作についてでした。

編集の繰り返しを使いこなせれば、編集効率がかなり上がります。
繰り返し同じ事をしてるな、と思ったら本記事を参考にして色々と 試してみてください。
皆さんの編集効率が上がれば幸いです。

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

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

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

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!