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日目を終わります。

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さんです。