Vim-users.jp
Vim勉強会#5が開催されました
- 2010-01-31 (日)
- イベント
2010年1月31日(日)、第五回目となる関西でのVim勉強会が開催され、大盛況の中終了しました。

- ujihisaさん: Vim初級者レッスン(前半)
- ujihisaさん: Vim初級者レッスン(後半)
- Sixeightさん: text-object
- 少佐さん: はじめてのVim
- tsukkeeさん: .vimrcの書き方
- .vimrc hackathon
Vim勉強会は、家に帰って感想記事を書いてブログを書いてトラックバック等を送るまでがVim勉強会です。
食べ放題のお菓子、カナダ土産の美味しいお菓子、活発な質問、居心地の良い空間、エネミー、そしてVimへの愛にあふれたすばらしい勉強会でした。勉強会の後の懇親会では、乾杯のときに「Vim」という声が自然と出てきたとか。いやはや、高まるVim熱は、とどまるところを見せません。
次回のVim勉強会は5月中旬に行なわれる予定です。
- Comments: 1
- Trackbacks: 1
Vim勉強会#5 ujihisa発表資料
- 2010-01-31 (日)
- イベント
Vim勉強会5 初級者向け講座
ujihisa
- http://ujihisa.blogspot.com/
- Vancouver, Canada
初級者とは
「初級者向け講座」 … 具体的に、初級者とは?
Vim使いのレベル10
- Lv1 vimtutorを終わらせた。あるいは、hjklで移動できて保存と終了ができる
- Lv2 ビジュアルモードを使うのをやめ、y}やdawなどの素晴らしい操作性に自己陶酔する
- Lv3 自分でインストールしたプラギンの数が5を越え、ダメプラギンはすぐに判別できるようになる
- Lv4 自分で作ったプラギンをvim.orgでリリースし、何人かをLife Changingさせる
- Lv5 他のアプリケーション使用時にescやiを打鍵してしまい、イラっとする日々を送る
- Lv6 シェルは当然vimshell。ネオコンなど大規模プラギンのバグを発見し、パッチ付きで報告する
- Lv7 Vim本体のソースコードを読み、あまりの魔界に発狂する
- Lv8 他言語インタフェース
if_***を作り、vim_devに投稿する。当然採用されない - Lv9 Vim本体の開発への貢献が日常になる。投稿し採用されたパッチ数が10を越える
- Lv10 神になる
つまり
- Lv1~Lv4 初級者
- Lv4~Lv7 中級者
- Lv7~Lv10 上級者
今日の目標
Lv4 自分で作ったプラギンをvim.orgでリリースし、何人かをLife Changingさせる
全員ここまでやる
Be Lv1
- Lv1 vimtutorを終わらせた。あるいは、hjklで移動できて保存と終了ができる
VimをインストールしてVimtutorを全部やる。25~30分。
$ vimtutor
Lv1の重要な点
u- undo。無制限
- Vimは終了しない
- キャンセルは
<C-r>
A- その行の行末から文字入力開始!
dw(delete 'word)- カーソル位置からその単語の終わりまでまとめて削除!
d$- カーソル位置から行末まで削除!
dd- その行を削除
p,P- 消した文字を貼付け。
PだとVim以外のソフトのペーストのような挙動
- 消した文字を貼付け。
0- 行頭に移動
ビジュアルモード
v- 一文字単位のビジュアルモード
V- 行単位のビジュアルモード
<C-v>- 矩形選択
vしてyでヤンク、あるいはdで削除できる!
Be Lv2
- Lv2 ビジュアルモードを使うのをやめ、y}やdawなどの素晴らしい操作性に自己陶酔する
非オブジェクト指向言語
値x に対して、 引数2 で、 関数f を実行する
f(x, 2)
オブジェクト指向言語
値x に対して、 引数2 で、 関数f を実行する
# f(x, 2)
x.f(2)
Vimのビジュアルモード
範囲x に対して、 引数2 で、 操作f を実行する
# f(x, 2)
# x.f(2)
x2f
Vimの非ビジュアルモード
範囲x に対して、 引数2 で、 操作f を実行する
# f(x, 2)
# x.f(2)
# x2f
2fx
例: 次の空行まで削除
ビジュアルモード
v}d
非ビジュアルモード
d}
非ビジュアルモードの薦め
- 自分で画面を確認する必要がない! EP確保 (後述)
- キータイプ数が少ない!
- 範囲の大きさに依存しない!
dawは?
text-objectの一つ。
詳しくは次のSixeightさんによるtext-objectのためだけのプレゼンに刮目せよ!
Be Lv3
- Lv3 自分でインストールしたプラギンの数が5を越え、ダメプラギンはすぐに判別できるようになる
Vim plugins
インストール: 単にファイルを置くだけ
- (大抵の場合) ビルドとかいらないよ!
便利で小さいプラギン
- quickrun
- 編集中バッファを「実行」する
- git-vim
- gitをラクに使う
- smartchr
- いい感じに文字入力をラクにする
便利で大きいプラギン
- neocomplcache
- 補完!
- vimshell
- Vim scriptで実装されたシェル
- blogger.vim
- blogspot.comにブログを投稿する
自己紹介
ujihisa
- http://ujihisa.blogspot.com/
- Vancouver, Canada
自分のプロジェクト
- quickrun.vim (現在はthincaさんがメインブランチ)
- blogger.vim
- few
関わっているプロジェクト
- Termtter
- Ruby Core
最近の活動
- アメリカの大学院入試。いまは結果待ち
- 明後日カナダに帰ります
- アセンブリ言語勉強しています (LLVM, IA-32)
Be Lv4
- Lv4 自分で作ったプラギンをvim.orgでリリースし、何人かをLife Changingさせる
プラギンの作り方
- Vimを使いまくる
- こんな機能があればラクなのになあと思う
- Vim標準でその機能があるか調べる
:h www.vim.orgにそのスクリプトがあるか調べる
#
- 大抵はすぐにいくつか見つかる
- 実際に使ってみる
- ヒドい出来具合に発狂する
- 自分で実装する
- githubで公開する
- vim.orgで公開する
今後の発展
- Vim用語を抑える
- Vim hacksを毎日読む
- Lingr Vim Roomに常駐する
Vim用語
- Bram
- 神
- 教皇
- エネミー
- hkn
Vim Hacks
- kana, ujihisa, thinca, Shougo, ukstudioらが執筆
- 時々ゲスト執筆者も。
ゲスト執筆者は常時募集中!
Lingr Vim Room
- 大勢が常に常駐
- tsukkeeさんのlingr-vimを使うとさらに快適に!
let g:loaded_vimlectur = 1
完
- Comments: 0
- Trackbacks: 0
Hack #120: gVim でウィンドウの位置とサイズを記憶する
- 2010-01-28 (木)
- Vim Hacks
GUI アプリケーションではよく終了時にウィンドウの位置とサイズを記憶し、次回起動時に復元するものを見かけます。Vim でも設定次第で同様のことが可能です。
設定
.gvimrc に以下のように書きます。
let g:save_window_file = expand('~/.vimwinpos')
augroup SaveWindow
autocmd!
autocmd VimLeavePre * call s:save_window()
function! s:save_window()
let options = [
\ 'set columns=' . &columns,
\ 'set lines=' . &lines,
\ 'winpos ' . getwinposx() . ' ' . getwinposy(),
\ ]
call writefile(options, g:save_window_file)
endfunction
augroup END
if filereadable(g:save_window_file)
execute 'source' g:save_window_file
endif
解説
g:save_window_file
この変数で指定するファイルにウィンドウの位置やサイズを保存します。expand() は ~ を $HOME に展開するのに必要で、その必要がない場合はなくても問題ありません。
設定の書き出し
augroup SaveWindow 〜 augroup END で、Vim の終了時に発生するイベントを登録しています。
ここでは Vim の終了時に s:save_window() と言う関数を呼ぶようにしています。そしてこの関数のなかで、g:save_window_file にウィンドウの位置とサイズの情報を Vim スクリプトの形式で書き出しています。
設定の読み出し
最後の if でウィンドウ情報ファイルが存在するかをチェックし、存在した場合はそのファイルを :source で読み込みます。情報ファイルは Vim スクリプトとして書き出されているので、:source するだけで位置とサイズが復元されます。
- Comments: 0
- Trackbacks: 0
Hack #119: neocomplcache Hacks(2) オムニ補完
- 2010-01-24 (日)
- Vim Hacks
二回目の今回はオムニ補完です。AutoComplPopでも自動呼び出しが可能ですが、neocomplcacheでは、それに改良を加え、設定しやすくなっています。
オムニ補完とは
オムニ補完とは、Vim組み込みで用意されている補完とは違い、文脈を解析して行う補完です。関数を'omnifunc'に設定し、<C-x><C-o>のキーシーケンスを入力することで呼び出されます。標準でもいくつかの言語のオムニ補完関数が用意されていますが、ユーザーが自分で定義することができます。
inoremap <expr><C-x><C-o> &filetype == 'vim' ? "\<C-x><C-v><C-p>" : neocomplcache#manual_omni_complete()
私はこのようにキーマッピングを設定し、Vim組み込みのオムニ補完を置き換えています。
拡張機能
neocomplcacheのオムニ補完には次のような拡張機能があります。
自動補完の文脈定義
g:NeoComplCache_OmniPatterns[filetype]を設定すれば、呼び出し条件をカスタマイズしたり、呼び出しを無効化することができます。
多数の言語に対応
AutoComplPopでは標準でPerl/Ruby/html/CSS/Pythoのオムニ補完が可能です。neocomplcacheではPerl以外の確認できたすべての言語に対応しています。キーワードパターンに追加するだけなので、新たな言語に対応させることが容易です。
補完スキップ
g:NeoComplCache_EnableSkipCompletionが1ならば(デフォルト)、候補の取得に時間がかかりすぎる場合、補完をスキップすることができます。
ワイルドカード
ほかの補完と同様、ワイルドカードによる絞り込みに対応しています。
エラーを出さない
特定のオムニ補完では、変な場所で呼び出すとエラーを出したりすることがあります。neocomplcacheではエラーをcatchしているので、neocomplcache内部にバグがない限り、オムニ補完中にエラーになることはありません。
補完環境の厳密な判定
PythonやRubyのオムニ補完は:pythonや:rubyが正常に動作する環境でなければ動作しません。よって、内部で判定しています。
ファイル名補完やバッファ名補完との同時呼び出し
オムニ補完とほかの補完を同時に呼び出せないAutoComplPopとは違い、neocomplcacheのオムニ補完はほかの補完と統合されています。 よって、同時に候補を出すことができるので、さらに便利に使えます。 ただし、オムニ補完の開始パターンが先にマッチした場合、オムニ補完の候補のみが計算されて表示されます。 これはVim自体の仕様です。これを防ぐためには、一度補完のポップアップを閉じて、補完を再呼び出しするしかありません。
キーワードの収集
空文字列でオムニ補完を呼び出してキーワードを収集してキャッシュし、オムニ補完候補として利用することができます。
neocomplcacheからオムニ補完関数を呼び出すときの注意
neocomplcacheは大抵のオムニ補完関数に対応していますが、オムニ補完関数を内部で無理矢理呼んで変換するという動作を行っているので、呼び出す関数によっては補完がうまく働かないことがあります。現在、complete_add()関数を内部で呼んでいる場合には動作がおかしくなることがわかっています。これはオムニ補完関数側がcomplete_add()を呼ばないようにするしかありません。
他に、Rubyのオムニ補完は時々フリーズする現象があることが報告されています。
これはRubyのオムニ補完が外部インタフェースを内部で使用しているためだと思われます。
Vimの外部インタフェース機能は不安定なので、時々エラーをはいたりフリーズすることがあります。
無効にしたい場合は.vimrcで
if !exists('g:NeoComplCache_OmniPatterns')
let g:NeoComplCache_OmniPatterns = {}
endif
let g:NeoComplCache_OmniPatterns['ruby'] = ''
と設定すると、無効にできます。これでは不便なので、Rubyのオムニ補完を書き直してくれる人を現在募集中です。
Shougo- Comments: 0
- Trackbacks: 0
Hack #118: ホームディレクトリをラクに入力する
- 2010-01-20 (水)
- Vim Hacks
問題
Vimのコマンドラインでホームディレクトリを入力する機会は比較的多いものの、~/という文字列を見ただけで小指に疲労が走ってくるのは、ほとんどのVimユーザに共通するのではないでしょうか。
もしも入力しやすいキー、例えばバックスラッシュなどで一発で~/が入力できれば、どんなに素晴らしいことでしょうか。
解決
以下のコードを~/.vimrcに記述することで、コマンドラインモードでバックスラッシュで~/が入力できる上、~/が来て欲しくなさそうなところではそのままバックスラッシュが入力されます。
function! HomedirOrBackslash()
if getcmdtype() == ':' && (getcmdline() =~# '^e ' || getcmdline() =~? '^r\?!' || getcmdline() =~? '^cd ')
return '~/'
else
return '\'
endif
endfunction
cnoremap <expr> <Bslash> HomedirOrBackslash()
この設定を有効にしたVimで:e \と打鍵すると、ただちに:e ~/に展開されます。
また、:s/\と打鍵した場合は、:s/\とそのままになります。(:s/~/のように展開されません)
発展
本Hackはcho45さんの.zshrcへのハックへのアナロジーで考案されました。
残念ながら現在cho45さんの最新版の.zshrcにはそのコードは存在していないようですが、
少し古いところに残っています。
著者の手元の.zshrcから引用すると、以下のようなコードでした。
expand-to-home-or-insert () {
if [ "$LBUFFER" = "" -o "$LBUFFER[-1]" = " " ]; then
LBUFFER+="~/"
else
zle self-insert
fi
}
zle -N expand-to-home-or-insert
bindkey "\\" expand-to-home-or-insert
ujihisa
- Comments: 0
- Trackbacks: 0
京都でVim勉強会#5が開催されます
- 2010-01-19 (火)
- その他
2010年01月31日(日)、京都でVim勉強会が開催されます。
参加登録や詳細はこちらを参照ください。 http://cotocoto.jp/event/37291
※画像はイメージです

高まるVim熱!
- Comments: 0
- Trackbacks: 0
Hack #117: 置換行為を繰り返す
- 2010-01-16 (土)
- Vim Hacks
問題
:substitute (:s)による置換処理は頻繁に使います。
バッファ全体を対象にする場合は:%s/foo/bar/gなどでできますし、
特定範囲のみを対象にする場合はVisual modeで選択しておいて
:s/foo/bar/gでできます。
では飛び飛びの場所で置換を行なう場合はどうでしょうか。
例えばソースコード中の特定の関数3つに対して置換を行なうとしましょう。
この場合は3箇所それぞれを対象として置換を実行することになりますが、
毎回
:s/foo/bar/g
のような長ったらしいコマンドを入力したくはありません。
<Up>/<Down>
でコマンドの入力履歴を辿って実行してもいいのですが、
これらのキーは概して遠い位置にあるため押下が面倒ですし、
押し易いキーバインドを設定することも面倒です。
どうにかして最小の手数で置換行為を繰り返せないでしょうか。
解決方法
以下のコマンドを実行します:
:s
通常、:sには検索パターンと置換文字列を指定しますが、
それらを省略した場合は最後に実行された
:sと同じ検索パターンと置換文字列で置換が行なわれます。
なお:sでは
:s/foo/bar/gc
などのフラグは無視されます。
フラグまで同一にする場合は:sの代わりに
:&&
を使います。
また1行だけ繰り返す場合には:sの代わりに
&
を使うこともできます。
参考資料
kana- Comments: 6
- Trackbacks: 0
Vim使いのレベル10
- 2010-01-13 (水)
- その他
- Lv1 vimtutorを終わらせた。あるいは、hjklで移動できて保存と終了ができる
- Lv2 ビジュアルモードを使うのをやめ、
y}やdawなどの素晴らしい操作性に自己陶酔する - Lv3 自分でインストールしたプラギンの数が5を越え、ダメプラギンはすぐに判別できるようになる
- Lv4 自分で作ったプラギンをvim.orgでリリースし、何人かをLife Changingさせる
- Lv5 他のアプリケーション使用時にescやiを打鍵してしまい、イラっとする日々を送る
- Lv6 シェルは当然vimshell。ネオコンなど大規模プラギンのバグを発見し、パッチ付きで報告する
- Lv7 Vim本体のソースコードを読み、あまりの魔界に発狂する
- Lv8 他言語インタフェースif_***を作り、vim_devに投稿する。当然採用されない
- Lv9 Vim本体の開発への貢献が日常になる。投稿し採用されたパッチ数が10を越える
- Lv10 神になる
文責: ujihisa
- Comments: 0
- Trackbacks: 1
Hack #116: 機能を割り当てるキーを探す際のヒント
- 2010-01-12 (火)
- Vim Hacks
Vim に新しくプラグインをインストールした際や、自分で便利な設定を書いた場合、それらの機能を素早く呼び出すために Key mapping を定義したいと思うでしょう。しかし、Vim では標準で多くの機能が各キーに割り当てられていて新しい機能を割り当てる場所が見つからないことがあります。本 hack ではそういった場合の手助けをします。
キーボードを眺める
キーボードを眺めて Vim における各キーの機能を思い出してください。思い出せないキーがあった場合、それはつまりあなたがそのキーの機能を使っていないということです。まずは :help でそのキーの機能を確認し、本当に必要ないと思えばそのキーには新しい便利な別の機能を割り当てられます。
プレフィックスキーを活用する
プレフィックスキーを使うことで、より多くの機能を割り当てることができます。ストローク数は 1 つ増えてしまいますが、キーボードのキーの数を考えるとこれは仕方がないでしょう。
以下にプレフィックスキーとして使えそうなキーを紹介します。
\
\ キーは標準の mapleader キーです。つまり、最初からプレフィックスキーとして使えるように空けられています。
<Space>
<Space> は非常に押し易い位置にあるにも関わらず、Normal mode ではカーソルを右に移動させるだけで、これは l と同じなので使われることは滅多にありません。これを使わない手はないでしょう。
m
m には標準でマークを付けると言う機能が割り当てられていますが、今は Visual mode もあるのでそれほど使われません。これをプレフィックスキーにしてしまうのも良いでしょう。
q
q はキーボードマクロの記録を開始するキーです。キーボードマクロは便利な機能なので潰すべきではありませんが、マクロとして記録できる場所は a から z まで 26 個もあります。そして、大抵はどこに記録したかなどは覚えていられないので、使い慣れた特定のキーを使うと思います。その場合、残りの使わないキーに対して機能を割り当てることができます。
また、再生用の @ キーも同様に使えるでしょう。
あまり使わないキーを退避させる
人によっては、たまにしか使わない、けれどたまには使うので使えないと困る、というキーがある場合があります。s f t などがその例です。 その場合、それらのキーをプレフィックス付きの場所に再マップすることでプレフィックスキーとして使えます。
nnoremap s <Nop>
nnoremap ss s
nnoremap sa func-a
nnoremap sb func-b
thinca
- Comments: 0
- Trackbacks: 0
日本のVim業界の近況について
- 2010-01-10 (日)
- その他
日本のVim業界の近況についてを若者に容易に伝えるのを目的とし、巷で静かなブームとなっている携帯小説の形式を用いて文書を紡ぎ上げることに成功した。以下に記す。
これはujihisaが作成したものをShougoが修正したものである。 また、この作品はフィクションである。どこかで見たようなフレーズがあったとしても、実在の人物とは全く関係ない。
- 元ネタ: http://love6.2ch.net/test/read.cgi/book/1191676700/45
- 転載元: http://vinarian.blogspot.com/2010/01/vimshougo.html
vimプラグインストーリー「Shougoの受難」
──アタシの名前はショウゴ。心に傷を負ったビム使い。モテカワスリムで補完体質の愛されガール♪
アタシがつるんでる友達は補完をやってるネコ、ビムにナイショで 非同期しているビムプロック。訳あって一から実装されたビムシェル。
友達がいてもやっぱり学校はタイクツ。今日もネコとちょっとしたことで口喧嘩になった。
ビム使い同士だとこんなこともあるからストレスが溜まるよね☆そんな時アタシは一人でギットハブを歩くことにしている。
がんばった自分へのご褒美ってやつ?自分らしさの演出とも言うかな!
「あームカツク」・・。そんなことをつぶやきながらしつこいプラギンを軽くあしらう。
「カノジョー、ちょっとsystem()させてくれない?」どいつもこいつも同じようなDOS窓付きのコードしかない。
イーマックスはシェルも動いてカッコイイけどなんか薄っぺらくてキライだ。もっと等身大のアタシを見て欲しい。
「すいません・・。」・・・またか、とセレブなアタシは思った。シカトするつもりだったけど、
チラっと開発者の男の顔を見た。
「・・!!」
・・・チガウ・・・今までのコードとはなにかが決定的に違う。スピリチュアルな感覚がアタシのビムを
駆け巡った・・。「・・(カッコイイ・・!!・・これって運命・・?)」
男はBramだった。連れていかれてハックされた。「キャーやめて!」今までやっていなかったパッチをきめた。
「ガシッ!ボカッ!」アタシはSEGVした。キャッシュ(笑)

- Comments: 0
- Trackbacks: 0
- Search
- Feeds
- Links

