Software Desing 2016年5月号の Vim 特集記事に寄稿しました

技術評論社から発売される Software Design 2016年5月号 の第1特集「Vim[実践]投入」に寄稿しました。

gihyo.jp

全5章の構成で、5人の Vimmer が1人1章を担当する豪華な内容になっています。

書いたこと

私は第2章「Vim だからできる、一歩先行く編集術」を担当しました。

今回の特集は、4月から新社会人になった方々をメインターゲットに、入門者向けの内容になっています。 その中でも第2章では、Vim ならではの機能について紹介しました。

この記事を見て、多くあるエディタの中から Vim を選ぶ意義について感じてもらえれば幸いです。

書けなかったこと

今回、これから Vim を使い始める人達を対象に記事を書くということで、help の引き方についての解説を入れたかったのですが、紙面の都合上叶いませんでした。

Vim を使っていくにあたって、help を引くことはとても重要です。Vim は設計上の目標(:help design-goals)の一つによくドキュメント化されていることを挙げており、大抵のことは help に書いてあります。また、プラグインについても、まともなプラグインであればドキュメントが書かれていて、Vim の中からいつでも参照できるようになっています。

調べ方を知っておくというのは Vim に限らず重要なことです。記事内での解説は叶いませんでしたが、もし Vim を使うことに決めた場合は、まずはヘルプのヘルプ(:help helphelp)などを見て引き方を知っておくとよいでしょう。

それでは、よい Vim ライフを!

カラースキームに個人的に求めるもの

最近 Vim のカラースキームの自作に関する記事をちらほら見かける。

私自身も最近、いいカラースキームないかなーと探していたりするので(作る気は皆無)、私が探す際のポイントなんかを書いておく。

ちなみにこの記事では主にカラースキームの機能面についてのみ言及する。 配色に関しては私はセンスがほぼないので、色について完全に感覚で選んでいて参考にならない。

一通りの色が定義してある

最重要項目なのだけど、できていないものが多い。個人的には全て設定されていてほしい。 大きく分けて Vim 自身が使う部品のハイライトと、テキスト内の構文ハイライトで使うものがある。

前者の一覧は :help highlight-groups で見ることができる。この記事を書いている時点での最新版である Vim 7.4.1639 では以下の 45 個だ。たまーに本体への機能追加で増えるので、注意したい。

                                                        *hl-ColorColumn*
ColorColumn     'colorcolumn' で設定された列の表示に使われる
                                                        *hl-Conceal*
Conceal         Conceal されたテキストの代わりに表示される代替文字の表示に使わ
                れる ('conceallevel' 参照)
                                                        *hl-Cursor*
Cursor          カーソル下の文字
                                                        *hl-CursorIM*
CursorIM        Cursorと同じだが、IMEモードにいるとき使われる|CursorIM|。
                                                        *hl-CursorColumn*
CursorColumn    'cursorcolumn' がオンになっているときのカーソルがある画面上の桁
                                                        *hl-CursorLine*
CursorLine      'cursorline' がオンになっているときのカーソルがある画面上の行
                                                        *hl-Directory*
Directory       ディレクトリ名(とリストにある特別な名前)
                                                        *hl-DiffAdd*
DiffAdd         差分モード: 追加された行 |diff.txt|
                                                        *hl-DiffChange*
DiffChange      差分モード: 変更された行 |diff.txt|
                                                        *hl-DiffDelete*
DiffDelete      差分モード: 削除された行 |diff.txt|
                                                        *hl-DiffText*
DiffText        差分モード: 変更された行中の変更されたテキスト |diff.txt|
                                                        *hl-ErrorMsg*
ErrorMsg        コマンドラインに現れるエラーメッセージ
                                                        *hl-VertSplit*
VertSplit       垂直分割したウィンドウの区切りとなる桁
                                                        *hl-Folded*
Folded          閉じた折り畳みの行
                                                        *hl-FoldColumn*
FoldColumn      'foldcolumn'
                                                        *hl-SignColumn*
SignColumn      目印|signs|が表示される行。
                                                        *hl-IncSearch*
IncSearch       'incsearch' のハイライト; ":s///c" で置換されたテキストにも使
                われる。
                                                        *hl-LineNr*
LineNr          ":number" と ":#" コマンドの行番号。'number' オプションか
                'relativenumber' オプションが設定されているときにはその表示に
                も使われる。
                                                        *hl-CursorLineNr*
CursorLineNr    LineNr と同じだが 'cursorline''relativenumber' が設定され
                ているときに現在行に使われる。
                                                        *hl-MatchParen*
MatchParen      カーソル下の文字、または直後の文字が括弧であるとき、その文字と
                対応する括弧に使われる。|pi_paren.txt|

                                                        *hl-ModeMsg*
ModeMsg         'showmode' のメッセージ (例. "-- INSERT --")
                                                        *hl-MoreMsg*
MoreMsg         |more-prompt|
                                                        *hl-NonText*
NonText         ウィンドウの端の '~' と '@'、'showbreak' で設定された文字など、
                実際のテキストには存在しない文字(例. 全角文字が行末に収まらな
                いとき ">" が表示される)。
                                                        *hl-Normal*
Normal          通常のテキスト
                                                        *hl-Pmenu*
Pmenu           ポップアップメニュー: 通常の項目。
                                                        *hl-PmenuSel*
PmenuSel        ポップアップメニュー: 選択されている項目。
                                                        *hl-PmenuSbar*
PmenuSbar       ポップアップメニュー: スクロールバー。
                                                        *hl-PmenuThumb*
PmenuThumb      ポップアップメニュー: スクロールバーのつまみ部分。
                                                        *hl-Question*
Question        ヒットエンタープロンプト|hit-enter|とyes/noクエスチョン
                                                        *hl-Search*
Search          最後に検索した語のハイライト('hlsearch')を参照。
                quickfixウィンドウ内の現在行のハイライトや、それに類するものに
                使われる。
                                                        *hl-SpecialKey*
SpecialKey      ":map" でリストされるメタキーと特別なキー。テキスト中の
                unprintableな文字を表示するのにも使われる。
                一般に: 実際とは異なる文字で表示されるテキスト
                                                        *hl-SpellBad*
SpellBad        スペルチェッカに認識されない単語。|spell|
                これは他のハイライトと同時に組み合わせられる。
                                                        *hl-SpellCap*
SpellCap        大文字で始まるべき単語。 |spell|
                これは他のハイライトと同時に組み合わせられる。
                                                        *hl-SpellLocal*
SpellLocal      スペルチェッカによって他の地域で使われると判断される単語。
                |spell|これは他のハイライトと同時に組み合わせられる。
                                                        *hl-SpellRare*
SpellRare       スペルチェッカによってまず使わないと判断される単語。|spell|
                これは他のハイライトと同時に組み合わせられる。
                                                        *hl-StatusLine*
StatusLine      カレントウィンドウのステータスライン
                                                        *hl-StatusLineNC*
StatusLineNC    非カレントウィンドウのステータスライン。
                Note: これが "StatusLine" に等しい場合、カレントウィンドウのス
                テータスラインに "^^^" が使われる。
                                                        *hl-TabLine*
TabLine         タブページの行の、アクティブでないタブページのラベル
                                                        *hl-TabLineFill*
TabLineFill     タブページの行の、ラベルがない部分
                                                        *hl-TabLineSel*
TabLineSel      タブページの行の、アクティブなタブページのラベル
                                                        *hl-Title*
Title           ":set all"、":autocmd" などによる出力のタイトル。
                                                        *hl-Visual*
Visual          ビジュアルモード選択
                                                        *hl-VisualNOS*
VisualNOS       vimが "Not Owning the Selection" のときのビジュアルモード選択。
                これをサポートしているのはX11GUI|gui-x11|と|xterm-clipboard|の
                み。
                                                        *hl-WarningMsg*
WarningMsg      警告メッセージ
                                                        *hl-WildMenu*
WildMenu        'wildmenu' 補完における現在の候補

後者の、構文ハイライトに使われるもののリストは、:help group-name で確認できる。

        *Comment        o コメント

        *Constant       o 定数
         String         o 文字列定数: "これは文字列です"
         Character      o 文字定数: 'c', '\n'
         Number         o 数値定数: 234, 0xff
         Boolean        o ブール値の定数: TRUE, false
         Float          o 不動小数点数の定数: 2.3e10

        *Identifier     o 変数名
         Function       o 関数名(クラスメソッドを含む)

        *Statement      o 命令文
         Conditional    o if, then, else, endif, switch, その他
         Repeat         o for, do, while, その他
         Label          o case, default, その他
         Operator       o "sizeof", "+", "*", その他
         Keyword        o その他のキーワード
         Exception      o try, catch, throw

        *PreProc        o 一般的なプリプロセッサー命令
         Include        o #include プリプロセッサー
         Define         o #define プリプロセッサー
         Macro          o Defineと同値
         PreCondit      o プリプロセッサーの #if, #else, #endif, その他

        *Type           o int, long, char, その他
         StorageClass   o static, register, volatile, その他
         Structure      o struct, union, enum, その他
         Typedef        o typedef宣言

        *Special        o 特殊なシンボル
         SpecialChar    o 特殊な文字定数
         Tag            o この上で CTRL-] を使うことができる
         Delimiter      o 注意が必要な文字
         SpecialComment o コメント内の特記事項
         Debug          o デバッグ命令

        *Underlined     o 目立つ文章, HTMLリンク

        *Ignore         o (見た目上)空白, 不可視  |hl-Ignore|

        *Error          o エラーなど、なんらかの誤った構造

        *Todo           o 特別な注意が必要なもの; 大抵はTODO FIXME XXXなど
                          のキーワード

こちらは、先頭に * が付いているものだけ定義されていればよい。それ以外のものはデフォルトで同じグループの * 付きのものにリンクされているので、同じ色で表示される。

CUI/GUI 対応

私は VimCUI でも GUI でも使うので、両対応のものが欲しい。両者でほぼ同じ見た目だと嬉しい。

実は CSApprox.vim というプラグインを使うと任意の GUI 向けカラースキームを CUI 向けに変換することができるのだけど…変換したファイルの管理などを考えると面倒なのであまりやりたくない。最初から対応していてくれると嬉しい。

background=dark

そろそろ完全に個人の好みの領域に入ってきました。黒背景が好きです。

単色系より色んな色が使われているやつ

単色系のはスタイリッシュではあると思うけども、せっかく色がついてるのに見分けづらかったりして実用性に疑問があるので。はい。個人的な好みになります。

VertSplit は文字が見えないやつ

完全に指定が細かくなってきた。ウィンドウの垂直分割(左右に分ける)の縦区切りの線、あれ | が使われているのだけど、背景色と前景色を同じにして見えなくなってるほうが好き。

すごく細かいところを挙げるとまだある気がするけどこの辺にしておこう。

以上

なにかオススメあったら教えてください。

参考

カラースキームを作ってみよう - 永遠に未完成

Minecraft サーバ Spigot のプラグインを Kotlin で書いてみたときのメモ

  • 個人の作業メモになるので、内容の保証は一切できないけれど、誰かの参考になれば。
  • 各レイヤーで何をやっているか知りたかったので、低レベルなところをコマンドラインでやってみている。
  • 実際に開発する場合はもうちょっとちゃんと環境を整えた方が良いように思う。
  • 私自身そんなに詳しいわけではないので突っ込み歓迎。

環境

このメモの手順通りに作業した場合には以下のようなディレクトリ構造になる。

.
|- kotlin            (Kotlin コンパイラ)
|- kikori-plugin     (木こりプラグイン)
|- kotlin-plugin     (Kotlin サンプルプラグイン)
|- hello-plugin     (Pure Java サンプルプラグイン)
|- spigot           (Spigot 自体のビルド作業用)
`- spigot-server    (Spigot サーバを動かす用)

Spigot とは

https://www.spigotmc.org/

Minecraft のサーバ。プラグインを入れられる。Java で動く。

Spigot の導入

大人の事情により Spigot はバイナリ配布されていない。代わりに簡単にビルドできるビルドツールがあるので、これでビルドする。

https://www.spigotmc.org/wiki/buildtools/

↑に各環境の詳細な手順が書かれているので、うまく行かない場合は読むとよい。

まずはビルドツールを取得する。

$ mkdir spigot
$ cd spigot
$ curl https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar -o BuildTools.jar

そしてこれを使ってビルド。今回は 1.9 を使う。今のところ、指定なしだと 1.8 がビルドされる模様。

ちなみにビルドツールを動かすには、Java の他に Git も必要。ない場合はインストールしておく。

$ java -jar BuildTools.jar --rev 1.9

めっちゃがんばってビルドしてくれる。しばし待つと、カレントディレクトリに spigot-1.9.jar ができる。これがサーバになる。

実際に起動してみる

https://www.spigotmc.org/wiki/spigot-installation/

まずはプラグインなしでとりあえず動かしてみる。実行は spigot-1.9.jar だけがあればできる。

こいつは起動時にカレントディレクトリにあれこれファイルやディレクトリを生成するので、新しいディレクトリで作業するのがよい。

$ mkdir ../spigot-server
$ cp spigot-1.9.jar ../spigot-server
$ cd ../spigot-server

引数が長いので、簡単に起動用のシェルスクリプトを作っておくと便利。

$ echo 'java -Xms512M -Xmx1024M -XX:MaxPermSize=128M -jar spigot-1.9.jar' > start.sh
$ chmod +x start.sh

起動する。

$ ./start.sh
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=128M; support was removed in 8.0
Loading libraries, please wait...
[19:04:47 INFO]: Starting minecraft server version 1.9
[19:04:48 INFO]: Loading properties
[19:04:48 WARN]: server.properties does not exist
[19:04:48 INFO]: Generating new properties file
[19:04:48 WARN]: Failed to load eula.txt
[19:04:48 INFO]: You need to agree to the EULA in order to run the server. Go to eula.txt for more info.
[19:04:48 INFO]: Stopping server
>

$ ls
eula.txt  logs/  server.properties  spigot-1.9.jar

$

初回は起動に失敗する。使用許諾契約に同意する必要がある。eula.txt というファイルが生成されているので、これを Vim などの適当なエディタで開く。

#By changing the setting below to TRUE you are indicating your agreement to our EULA (https://account.mojang.com/documents/minecraft_eula).
#Sun Mar 13 19:04:48 JST 2016
eula=false

EULA の URL があるので開いて目を通し、問題がなければ eula=falseeula=true に書き換えて保存。再び起動する。

$ ./start.sh
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=128M; support was removed in 8.0
Loading libraries, please wait...
[21:22:23 INFO]: Starting minecraft server version 1.9
[21:22:23 INFO]: Loading properties
[21:22:23 INFO]: Default game type: SURVIVAL
[21:22:24 INFO]: This server is running CraftBukkit version git-Spigot-6f291ea-55a8535 (MC: 1.9) (Implementing API version 1.9-R0.1-SNAPSHOT)
[21:22:24 INFO]: Unable to find file banned-players.json, creating it.
[21:22:24 INFO]: Unable to find file banned-ips.json, creating it.
[21:22:24 INFO]: Unable to find file ops.json, creating it.
[21:22:24 INFO]: Unable to find file whitelist.json, creating it.

...(中略)...

[21:23:31 INFO]: Preparing start region for level 2 (Seed: 5519750147800174725)
[21:23:32 INFO]: Preparing spawn area: 11%
[21:23:33 INFO]: Preparing spawn area: 25%
[21:23:34 INFO]: Preparing spawn area: 39%
[21:23:35 INFO]: Preparing spawn area: 51%
[21:23:36 INFO]: Preparing spawn area: 62%
[21:23:37 INFO]: Preparing spawn area: 75%
[21:23:38 INFO]: Preparing spawn area: 90%
[21:23:39 INFO]: Done (73.641s)! For help, type "help" or "?"
>

無事起動した。最後の > はプロンプトで、管理用のコマンドなどが実行できる。

この状態で Minecraft 1.9 のクライアントから Multiplayer でサーバに接続すれば、ゲームが遊べる。サーバとクライアントが同じマシンなら、接続先のサーバアドレスに localhost と入力して接続すれば OK。

サーバを終了させるには stop コマンドを実行すればよい。

Pure Javaプラグインを作ってみる

Kotlin に入る前に、まずは Pure Javaプラグインを作ってみる。改めて断っておくと、とりあえず動くことを確認するための作業なので、構成はものすごく適当。

まずはプラグインのプロジェクト用にディレクトリを作る。

$ mkdir ../hello-plugin
$ cd ../hello-plugin

プラグインをビルドするには、Spigot のライブラリが必要になる。最初にビルドした中にあるので、コピーしてくる。

$ cp ../spigot/Spigot/Spigot-API/target/spigot-api-1.9-R0.1-SNAPSHOT.jar spigot-api.jar

HelloPlugin.java として、以下のようなファイルを作る。

import org.bukkit.plugin.java.JavaPlugin;

public class HelloPlugin extends JavaPlugin {
  @Override
  public void onEnable() {
    getLogger().info("Hello, world!");
  }
}

プラグインがロードされた際に、ログに Hello, world! と表示するだけのプラグインだ。

これをコンパイルする。

$ javac -cp spigot-api.jar HelloPlugin.java

次に、プラグインの構成情報のためのファイル、plugin.yml を作成する。プラグインにはこれが必要になる。

# プラグイン名
name: hello
# プラグインのメインクラス。パッケージ付きのフルネームを書く
main: HelloPlugin
# プラグインのバージョン
version: 1.0

ここまででファイルは以下のような感じ。

.
|- HelloPlugin.class
|- HelloPlugin.java
|- hello.jar
|- plugin.yml
`- spigot-api.jar

プラグインに必要な plugin.ymlHelloPlugin.class を jar で固めて、サーバの plugins ディレクトリに放り込む。

$ jar cf hello.jar HelloPlugin.class plugin.yml
$ cp hello.jar ../spigot-server/plugins

あとはサーバを起動すれば、プラグインが読み込まれる。

$ cd ../spigot-server
$ ./start.sh
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=128M; support was removed in 8.0
Loading libraries, please wait...
[22:18:07 INFO]: Starting minecraft server version 1.9
[22:18:07 INFO]: Loading properties
[22:18:07 INFO]: Default game type: SURVIVAL
[22:18:08 INFO]: This server is running CraftBukkit version git-Spigot-6f291ea-55a8535 (MC: 1.9) (Implementing API version 1.9-R0.1-SNAPSHOT)
[22:18:08 INFO]: Server Ping Player Sample Count: 12
[22:18:08 INFO]: Using 4 threads for Netty based IO
[22:18:08 INFO]: Debug logging is disabled
[22:18:08 INFO]: Generating keypair
[22:18:09 INFO]: Starting Minecraft server on *:25565
[22:18:09 INFO]: Using epoll channel type
[22:18:09 INFO]: Set PluginClassLoader as parallel capable
[22:18:09 INFO]: [hello] Loading hello v1.0
[22:18:09 INFO]: **** Beginning UUID conversion, this may take A LONG time ****

...(中略)...

[22:10:53 INFO]: Preparing spawn area: 66%
[22:10:53 INFO]: Preparing start region for level 2 (Seed: 5519750147800174725)
[22:10:54 INFO]: [hello] Enabling hello v1.0
[22:10:54 INFO]: [hello] Hello, world!
[22:10:54 INFO]: Server permissions file permissions.yml is empty, ignoring it
[22:10:54 INFO]: Done (9.339s)! For help, type "help" or "?"
>

ログに Hello, world! と表示されている。[hello]プラグイン名だ。

Kotlin とは

https://kotlinlang.org/

JVM で動く実用的な言語。Android とかで動かすことも考えて作られてる。 先月の 2/15 に待望のバージョン 1.0 がリリースされた。

まとめると、私もよくわかってない。わかってないので今回触ってみることにした感じ。

インストール

今回はコマンドラインで動くコンパイラを入れる。

$ cd ..
$ curl -sL https://github.com/JetBrains/kotlin/releases/download/build-1.0.0/kotlin-compiler-1.0.0.zip -o kotlin-compiler-1.0.0.zip
$ unzip -q kotlin-compiler-1.0.0.zip
$ PATH=$PATH:$PWD/kotlinc/bin

$PATH はとりあえず設定したけど、必要なら .bachrc などできちんと設定すること。

Kotlin でプラグインを作ってみる

Kotlin もインストールできたので、プラグインを作ってみる。まずはディレクトリの作成。

$ mkdir ../kotlin-plugin
$ cd ../kotlin-plugin

ライブラリと plugin.yml も先に用意しちゃう。

$ cp ../spigot/Spigot/Spigot-API/target/spigot-api-1.9-R0.1-SNAPSHOT.jar spigot-api.jar
name: kotlin
main: KotlinPlugin
version: 1.0

そして Kotlin のソースコードkotlin.kt を作る。

import org.bukkit.plugin.java.JavaPlugin

class KotlinPlugin : JavaPlugin() {
    override fun onEnable() {
        getLogger().info("Hello, Kotlin!")
    }
}

コンパイルする。

$ kotlinc -cp spigot-api.jar kotlin.kt -include-runtime -d kotlin.jar

-include-runtime は、Kotlin のランタイムを jar に同梱して standalone にするためのオプション。実を言うと現段階のコードでは Kotlin のランタイムに依存していないので、これがなくても動くのだけど、書いていったらどうせ依存すると思うので今から入れておく。

さて、jar はできたけど、これには plugin.yml が含まれていないので入れる。

$ jar uf kotlin.jar plugin.yml

そしてサーバの plugins へ放り込んで動作確認。

$ cp kotlin.jar ../spigot-server/plugins
$ cd ../spigot-server
$ ./start.sh
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=128M; support was removed in 8.0
Loading libraries, please wait...
[05:24:36 INFO]: Starting minecraft server version 1.9
[05:24:36 INFO]: Loading properties
[05:24:36 INFO]: Default game type: SURVIVAL
[05:24:37 INFO]: This server is running CraftBukkit version git-Spigot-6f291ea-55a8535 (MC: 1.9) (Implementing API version 1.9-R0.1-SNAPSHOT)
[05:24:37 INFO]: Server Ping Player Sample Count: 12
[05:24:37 INFO]: Using 4 threads for Netty based IO
[05:24:37 INFO]: Debug logging is disabled
[05:24:37 INFO]: Generating keypair
[05:24:37 INFO]: Starting Minecraft server on *:25565
[05:24:37 INFO]: Using epoll channel type
[05:24:37 INFO]: Set PluginClassLoader as parallel capable
[05:24:38 INFO]: [kotlin] Loading kotlin v1.0
[05:24:38 INFO]: [hello] Loading hello v1.0
[05:24:38 INFO]: **** Beginning UUID conversion, this may take A LONG time ****

...(中略)...

[05:24:46 INFO]: Preparing spawn area: 68%
[05:24:47 INFO]: Preparing start region for level 2 (Seed: 5519750147800174725)
[05:24:48 INFO]: [kotlin] Enabling kotlin v1.0
[05:24:48 INFO]: [kotlin] Hello, Kotlin!
[05:24:48 INFO]: [hello] Enabling hello v1.0
[05:24:48 INFO]: [hello] Hello, world!
[05:24:48 INFO]: Server permissions file permissions.yml is empty, ignoring it
[05:24:48 INFO]: Done (10.087s)! For help, type "help" or "?"
>

ちゃんと動いてる。

もうちょっと実践的なやつを作ってみる

せっかくなので何か簡単に作ろうと思う。というわけで、木を破壊したらその木より上にある木も全部破壊してくれる、いわゆる木こり機能を作ってみる。

コードは Gist に貼っておく。以下。Kotlin のコードをまともに書いたのは今回が初めてなので、Kotlin らしくなっていいるかはわからない。良ければアドバイスください(Gistにコメントなど歓迎)。

kikori mod for Spigot by Kotlin

Spigot では様々なイベントに対して処理を行える。Listener インターフェースを実装したクラスで @EventHandler アノテーションをつけたメソッドを定義し、そこでイベントを受け取る。引数のイベントの型で受け取れるイベントが決まり、イベントのオブジェクトからイベントに関する情報が取れる。今回使った BlockBreakEvent なら、壊れたブロックや壊したプレイヤーの情報が取得できる。あとはこのクラスをプラグインマネージャに登録すればよい。

今まで通りビルドすれば動かせる。

$ kotlinc -cp spigot-api.jar kikori.kt -include-runtime -d kikori.jar
$ jar uf kikori.jar plugin.yml
$ cp kikori.jar ../spigot-server/plugins

結果は自分の手でご確認ください。(動画とか用意するの面倒)

参考リンク

はてなブログに移行した

現在手元の設定ファイル類を整理しており、どこかから拾ってきたようなファイルがいくらかあるので、それらを可能な限り排除しようとしていた。

その中にはてな記法Vim 向けの syntax ファイルがあり、これは hatena.vim に含まれているのだが、投稿機能は必要なかったので syntax ファイルだけ持っていたようだ。

hatena.vimプラグインとして管理してしまうことも考えたが、そもそもはてなブログにしてしまえば markdown になるから hatena.vim 必要なくなるのではってことで移行してみた。

以上。

vimproc に Windows の DLL ダウンロード機能を入れた

tl;dr

以下を vimrc の最初の方に書く。

let g:vimproc#download_windows_dll = 1

本文

vimproc は外部プロセスを非同期実行するのに必要な Vim のライブラリ。これを利用しているプラグインも結構ある。
これはとても便利なのだけど、動的ライブラリを別途ビルドする必要がある。
LinuxMac OS X なんかの環境では、標準でビルド環境が整備されているのもあり、ここで苦労することはあまりないと思う。しかし、Windows だと標準ではビルド環境がないため、ビルドすること自体が難しい。
kaoriya 版の Vim に同梱されている vimproc には DLL も含まれているので、これを利用している人もいるのではないだろうか。
ただ、最新版が使いたかったり、複数 OS で同じ設定を使いたいという理由でプラグインマネージャで vimproc を管理したい人もいるだろう。私がそうだ。そういった場合、kaoriya 版のプラグインはちょっと使いづらい。
とりあえずビルドだけでもなんとかならないか、と思って以前やったのがこれ。

Add appveyor.yml to build DLL for MS Windows by thinca · Pull Request #217 · Shougo/vimproc.vim · GitHub

これによって、vimproc のバージョンが上がり、タグが打たれると、自動で DLL がビルドされて誰でもダウンロードできるようになった。ダウンロードは以下のページからできる。

https://github.com/Shougo/vimproc.vim/releases

というわけで自分でビルドしなくてもダウンロードして配置するだけ。便利。だったのだけど、正直ダウンロードしてくるのも面倒になった。プラグインマネージャで vimproc をインストールした直後は必ず「DLL がない」とエラーが出る。とてもつらい。
すでにビルド済みバイナリはネット上にあるわけなので、ダウンロードも自動でやってくれるとラクチン。というわけでそういう機能を作った。

Download windows dll automatically by thinca · Pull Request #242 · Shougo/vimproc.vim · GitHub

最初は全自動だったのだけど、デフォルトでダウンロードされるのは困る、という意見もあり、確かにアグレッシブすぎる感じがしたので、設定を足した。以下の設定を vimrc に書いておけば、DLL がない場合は vimproc がロードされるタイミングで自動でダウンロードされる*1。また、DLL が古かった場合は自動で更新してくれる(この場合は Vim の再起動が必要)。

let g:vimproc#download_windows_dll = 1

この設定は vimproc が使用されるより前に書く必要があり、プラグインマネージャが vimproc を使う場合もあるため、できるだけ vimrc の先頭に書いた方が良い。
これでようやく vimproc の DLL との格闘に終止符を打てた気がする。
Vim には job という外部プロセスを非同期実行するための機能が入りつつあり、きちんと入って各プラグインがこちらを利用し始めたら vimproc 自体がオワコンになる可能性も 0 ではないが*2、今は気にしないでおこう…。

*1:ダウンロードも最初は curl 必須だったのだけど、raa0121 さんの提案で powershell でもダウンロードするようにしたので大抵の環境でダウンロード可能になった。raa0121++

*2:vimproc には非同期実行以外にもいくつか機能があるのでそっちの用途で使われる可能性はありそう

全角スペースを可視化するプラグイン zenspace.vim を作った

プログラミングをしていると、混ざっていると困る全角スペース。
可視化するように設定を書いている人も多いんじゃないでしょうか。
実際ググると、全角スペースを表示するための設定がたくさん出てきます。私も vimrc に設定書いてました。
でもこれ…みんなやってるなら、もうプラグインでよくない?
ってことでプラグインにしました。

zenspace.vim - Show Ideographic Space (a.k.a. Zenkaku Space).
https://github.com/thinca/vim-zenspace

全角スペースを表示するためだけのプラグインです。(画像内のタブの表示は 'listchars' によるもの)

デフォルトでは 'list' オプションの値に連動して、可視/不可視を切り替えます。なので、'list' オプションをオンにしてください。

set list

'list' オプションとかいいから常に表示しろよ、って場合は g:zenspace#default_mode を設定してください。

let g:zenspace#default_mode = 'on'

zenspace.vim は、常に表示する "on"、表示しない "off"、'list' オプションに追従する "list" の 3 つのモードがあり、ウィンドウ毎に独立しています。
デフォルト値を変える場合は上記の通り g:zenspace#default_mode を設定してください。個別のウィンドウで変更したい場合は :ZenSpaceOn :ZenSpaceOff :ZenSpaceList を使用してください。

Q & A

Q. 色を変えたいんだけど?
A. 赤に変える例を載せておきます。

augroup vimrc-highlight
  autocmd!
  autocmd ColorScheme * highlight ZenSpace ctermbg=Red guibg=Red
augroup END

Q. 普通のスペースとかは表示できないの?
A. 全角スペース専用です。通常のスペースやタブや行末スペースは、Vim 標準の 'listchars' オプションを設定するといい感じに表示できるので、そっちを使うことをオススメします。

Q. Conceal とか使って□で表示できない?
A. 検討したんですが、Conceal の制限がキツすぎて見送りました。詳細はこちらを読んでください。


Enjoy!

Boost.勉強会 #19 東京 に行ってきた

C++ まったく書いてないけどなぜか Boost.勉強会 #19 東京 に行ってきたよ。
C++ の最近の動向に軽く触れる感じでゆるーく感想書いてく。C++ よくわかってないのでよくわからない感想しか書けません。

Boostライブラリ一周の旅 1.59.0-1.60.0 - @

資料: http://www.slideshare.net/faithandbrave/boost-tour-1600
資料(マージ版): http://www.slideshare.net/faithandbrave/boost-tour-1600-merge

いつものやつ。
Boost.Test v3 で Power Assert 入ったのだいぶ強そうだった。

Effective Modern C++C++ Core Guidelines - @

資料: http://www.slideshare.net/ShintarouOkada/boost19-effective-modern-cc-core-guidelines

Effective Modern C++ 邦訳版を査読した話と、CppCoreGuidelines の話。
査読報酬で具体的な話が聞けたのだいぶ良さがあった。
CppCoreGuidelines は lint を提供することを想定しているとのことで、使えるようになったらとても便利そう。
詳しくない言語を書くとき、良い書き方なのかいつも気にしながら書こうとしてしまうのでそれだけでかなり時間がかかってしまうのだけど、lint があると安心して書いていけそう。

SIMD のゆるい話 - @

資料: http://www.slideshare.net/krustf/avx-simd

ゆるい話…なるほどわからん、という感じだった。すまぬ。

「女性のためのC++コミュニティ Ladies++ meetup #1」の紹介 - @

資料: http://www.slideshare.net/cocodrips/c-ladies

女性のためのC++コミュニティ Ladies++ meetup #1 の紹介。
コミュニティが始まったばかりで人脈があまりないので女性 C++er を紹介して欲しいとのことです。

クロスプラットフォームマルチメディアライブラリSDL2の紹介 - @

資料: http://www.slideshare.net/nyaocat/sdl2

SDL2 の紹介。

いつの間にかライセンスが zlib になっていたのと、Emscripten でブラウザにも対応していたの知らなかった。

クソザコ鳥頭が非順序連想コンテナに入門してみた - @

資料: http://www.slideshare.net/kariya_mitsuru/ss-55842496

非順序連想コンテナが仕様である処理時間を定数時間にするための実装の苦労がおもしろかった。

expectedによるエラーハンドリング - @

資料: http://www.slideshare.net/faithandbrave/error-handling-using-expected

expected の紹介。
Haskell の Either に成功/失敗の明確な意味を持たせたものと解釈した。
単に成功値か失敗値が欲しいというだけなら、variant でも目的は達成できるのかもしれないけど、インターフェースが成功/失敗に特化して作ってあるし、何より明確な意味があるのは便利。

Boost.Configについて - @

資料: http://www.flast.jp/article/boost-19-tokyo/index.html

コンパイラC++ のバージョンの差異を吸収するための中の人が使うライブラリの話。
なんというかやはり苦労してるんだな…という感じ。

メモリモデル再入門 - @

資料: https://docs.google.com/presentation/d/1ClVZvXo8lj7TE66hZ0eqNyVc1DBcRciJRXUxukhOb2k/pub#slide=id.p

スレッドとか Data Race とかの話。誰でもわかる基本的な例から徐々に複雑な例にしていく解説が上手いなと思った。
なかなか面白い話だったのでスライド最後まで完成させてほしかった…。

全体的な感想

割とわからないことだらけかなーとも思ってたけど、面白いセッションも結構あって良かった。
相変わらず C++ 書く機会ないですが、C++ は割と好きな言語なのでまた機会があれば参加したいです。