読者です 読者をやめる 読者になる 読者になる

Kuchitama Tech Note

はてな記法がいつまでたっても覚えられないので、はてなダイアリーからマークダウンが使えるこっちに引っ越してきました。

突然のVimコマンドを作った

vim

なぜ作ったのか

基本的には思いつきが全て。 ただ理由を挙げるとするなら、最近vimでいろいろプラグインを使って遊んでたりするので、 自分でも作ってみようかなぁとか思ってたのが大きい。 今回、プラグインではなくコマンドを作成したのは、ここ(C++でゲームプログラミング 【Vim Advent Calendar 2012】Vim プラグインを github で公開するまで【1日目】を読んだから。

なので、そのうちプラグイン化するつもり。

vimスクリプトについて調べるのには、下の3つの情報源が本当に役立った。 ありがとうございました。

解説(というか自分のためのメモ)

コマンドの定義

ユーザコマンドの定義は次の書式 :command[!] [{属性}...] {コマンド名} {実行するコマンド}

関数を呼び出すにはcall {関数}の書式で、callコマンドを通して関数を呼び出さなくては行けない。 それは、面倒なので、自作コマンドとして定義しておく事で、保存するときの:wとか終了の:qみたいなノリで自作関数を呼び出せる。

属性に-nargs={引数の数}を指定し、呼び出す関数に<args>を引数として指定する事で、コマンドの引数を関数に渡せる。

詳細はここを参照↓

Hack #158: ユーザコマンドを定義する

関数定義

関数のスコープにはグローバルスコープとスクリプトスコープがある。 グローバルスコープは関数名がg:から始まる関数のことで、グローバル域で有効になる。 今回だとg:totuzen関数がそれにあたる。

スクリプトスコープはs:から始まる関数で、その名の通りスクリプトファイル内でのみ有効になる。 なので、s:mozisu関数はスクリプトファイル内からしか呼び出せない。

モテる男のVim Script短期集中講座

日本語を含む文字数のカウント

文字数の取得は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. 変数 → 文字列型

備忘録 Vimのスクリプトでの置換用関数

ソースコード全文

使い方

↑上のtotuzen.vimファイルどこかに保存して、:source totuzen.vimとコマンドを実行すればOK

:Totuzen "突然のvim"とかコマンドを入れると、いい感じに突然の死っぽくしてくれる

書いたはいいが…

ここまで書いて、そう言えばVim Advent Calendar 2012がまだ続いてたなー、vimmerの方々はどうやらクリスマス終了のお知らせを受け取ったみたいだなーとか思ったのだけど、このネタすでに増産されてて車輪の再発名もいいところだった… まぁ、当たり前だよね…

ましてや、はじめてVimプラグインを書いた話 - metropolisなんて、ネタかぶりもいいところ… しかも、僕は後発のくせに特に目新しい機能なんてないしね…

でも、あくまで自分の勉強用に始めた事なのでいいのです。 誰かやってるからって何もしないより、とりあえず自分の手を動かしてみる方がいいよね。 趣味コーディングだしね。

というわけで、アドベントカレンダーには参加せずにひっそりとブログ更新です。 (ちなみに、突然の死の先達たちのコードはまだ読んでないです。プラグイン化まで実現してから、ゆっくりと読ませて頂いて、自分の実装と比較するつもり)

Vimテクニックバイブル ?作業効率をカイゼンする150の技

Vimテクニックバイブル ?作業効率をカイゼンする150の技