突然のVimコマンドを作った
なぜ作ったのか
基本的には思いつきが全て。 ただ理由を挙げるとするなら、最近vimでいろいろプラグインを使って遊んでたりするので、 自分でも作ってみようかなぁとか思ってたのが大きい。 今回、プラグインではなくコマンドを作成したのは、ここ(C++でゲームプログラミング 【Vim Advent Calendar 2012】Vim プラグインを github で公開するまで【1日目】を読んだから。
なので、そのうちプラグイン化するつもり。
vimスクリプトについて調べるのには、下の3つの情報源が本当に役立った。 ありがとうございました。
解説(というか自分のためのメモ)
コマンドの定義
ユーザコマンドの定義は次の書式
:command[!] [{属性}...] {コマンド名} {実行するコマンド}
関数を呼び出すにはcall {関数}
の書式で、callコマンドを通して関数を呼び出さなくては行けない。
それは、面倒なので、自作コマンドとして定義しておく事で、保存するときの:w
とか終了の:q
みたいなノリで自作関数を呼び出せる。
属性に-nargs={引数の数}
を指定し、呼び出す関数に<args>
を引数として指定する事で、コマンドの引数を関数に渡せる。
詳細はここを参照↓
関数定義
関数のスコープにはグローバルスコープとスクリプトスコープがある。
グローバルスコープは関数名がg:
から始まる関数のことで、グローバル域で有効になる。
今回だとg:totuzen
関数がそれにあたる。
スクリプトスコープはs:
から始まる関数で、その名の通りスクリプトファイル内でのみ有効になる。
なので、s:mozisu
関数はスクリプトファイル内からしか呼び出せない。
日本語を含む文字数のカウント
文字数の取得はstrlen({文字列})
だが、普通にutf-8のマルチバイト文字をstrlenすると、日本語の文字は1文字あたり3文字分カウントされてしまう。
:echo strlen('a') #=> 1 :echo strlen('あ') #=> 3
これを回避するために、substituteを使って、文字を全て1バイト文字に変換してしまってから、strlenで文字数を数える
substitute({ソース文字列},{置換元パターン},{置換文字列},{フラグ})
substitute("ほげfuga", ".", "x", "g") #=> xxxxxx strlen(substitute("ほげfuga", ".", "x", "g")) #=> 6
名無しのvim使い → Vimスクリプトリファレンス → 03. 変数 → 文字列型
ソースコード全文
使い方
↑上のtotuzen.vimファイルどこかに保存して、:source totuzen.vim
とコマンドを実行すればOK
:Totuzen "突然のvim"
とかコマンドを入れると、いい感じに突然の死っぽくしてくれる
書いたはいいが…
ここまで書いて、そう言えばVim Advent Calendar 2012がまだ続いてたなー、vimmerの方々はどうやらクリスマス終了のお知らせを受け取ったみたいだなーとか思ったのだけど、このネタすでに増産されてて車輪の再発名もいいところだった… まぁ、当たり前だよね…
- はわわーっ(@yomi322) Vimで突然の死に備える
- Unite.vimで突然の死に備える | かなりすごいブログ
- mattn/ctrlp-sudden-death · GitHub
- はじめてVimプラグインを書いた話 - metropolis
- 突然の死 - Memo
- CtrlPプラグインでの「突然の死」作ったった - 29th Sta.
ましてや、はじめてVimプラグインを書いた話 - metropolisなんて、ネタかぶりもいいところ… しかも、僕は後発のくせに特に目新しい機能なんてないしね…
でも、あくまで自分の勉強用に始めた事なのでいいのです。 誰かやってるからって何もしないより、とりあえず自分の手を動かしてみる方がいいよね。 趣味コーディングだしね。
というわけで、アドベントカレンダーには参加せずにひっそりとブログ更新です。 (ちなみに、突然の死の先達たちのコードはまだ読んでないです。プラグイン化まで実現してから、ゆっくりと読ませて頂いて、自分の実装と比較するつもり)
Vimテクニックバイブル ?作業効率をカイゼンする150の技
- 作者: Vimサポーターズ
- 出版社/メーカー: 技術評論社
- 発売日: 2011/09/23
- メディア: 単行本(ソフトカバー)
- 購入: 18人 クリック: 648回
- この商品を含むブログ (37件) を見る