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

Osaka.vim #7 に行ってきた

vim event

今更何を言い出すんだ、という感じではあるけども、次回 Osaka.vim #8 が来週に控え、さすがに何か残しておくか、という気持ちになったので書きます。

というわけで Osaka.vim #7 に行ってきました。3ヶ月前の勉強会の感想記事だよ!

当日朝

今回は @ryunix さんと二人旅。 新幹線でいざ大阪へ。

大阪で @koturn さん、@mozi_kke さんと合流し、4 人でランチを求めて大阪をさまよう。 一切事前に調べていなかったので、適当に大阪っぽいもの食べるか、という話になって適当なお好み焼き屋に入った。

で、その後会場へ。

↑これ適当に撮った割にはいい感じに撮れたっぽかったけど、建物は2棟あって、会場は反対の建物であった…。

本編

Osaka.vimもくもく会なので、一応作業はしていたけども、なかなか来れない大阪、ただ作業だけして帰るのはもったいなすぎますね。

というわけでスキを見ては別のテーブルに絡みに行ったりしました。

何話したかあまり覚えてないけど(早く書かないから…)、Unity つらい話とかをした気がする。Vim 一切関係ないw

作業の方は quickrun.vim が PR のマージばかりでバージョンがまったく切られていなかったので雑に 0.7.0 のバージョンを切ったりしてた。

懇親会

終了後に何人かで懇親会へ。思っていたより参加率は高くなかった記憶。

各々事情があるだろうし、懇親会に参加できない人がいるのは仕方のないことなのだけど、せっかくオフラインで会うのだから交流していかないともったいない。

これは今回の話というより今後勉強会などに参加する予定がある人みんなに向けて。

私はなんだかんだ言いつつ聞き手に回ることが多いのだけど、色んな人の色んな話を聞くだけでも楽しい。

翌日

翌日は @haya14busa さんと合流して、3人で USJ を満喫した。

Osaka.vim 関係ないので詳細は省くけど、デスノートのリアル脱出ゲームとフライングダイナソーが最高だった。

まとめ

次からはちゃんとすぐに感想記事を書くようにしたい。

第6回 集まっtail で LT してきた

programming vim event

Osaka.vim のレポート記事を書きそびれていい加減なんか書かんとなと言う気持ちの今日この頃です。今更感あるけどやっぱ後でレポート記事書こうかな…。

さて、最近は teratail と言うプログラマ向けの QA サイトをよく利用するんですが、そのオフィシャルのユーザーオフ会である第6回 集まっtailと言うイベントにスペシャルLT枠として招待されたので行ってきました。

どんなイベントかというと、ユーザー同士や中の人などが軽食を食べながらおしゃべりする、まあ本当に普通の交流イベントと言う感じ。中の人もいるので中の話なんかも色々聞けるのがよく、teratail と言うサービスを身近に感じれます。

で、私なんかがなぜか招待されたので、最初はどうしようか迷ったんですが、まあいい機会だと受けることにして、LT してきました。資料はこちら。

まー見るとわかるんですが、VimConf 2016 の宣伝と、発表者募集の宣伝ですね。こじつけ感がすごい。

まあでも、色々な方面の人がいるのが Vim のコミュニティの特徴だなと言うのは以前から感じていて、teratail もそこは共通しているなーと言うのは今回改めて思ったことでした。

発表資料について、私は普段発表するのはだいたい Vim 系のイベントなので、おこがましいのは承知の上で恥ずかしいのもあり自己紹介は端折っちゃうことが多いのだけど、今回はそうじゃないし一応ちゃんとやるかと思って、それならアイコン入れたいし画像使えるプレゼンツール使おうかと思ったんだけど準備にグダグダしていたら時間がなくなってしまっていつも通りの Markdown + showtime.vim になってしまったのはとても反省している。アイコンは自己紹介の場面でブラウザに切り替えるなどして雑に補完しました。

記事もグダグダしてきたのでまとめると、

  • VimConf 2016 発表者募集しているので応募してね!
  • テーマは「Vim もしくはテキスト編集に関わることならなんでも」だよ!Vim 以外の話でも大丈夫だよ!
  • 発表者になると参加費が無料になったり安くなったりするよ!

以上です。よろしくお願いします。

Vim の help を見せてくれる hubot スクリプトを作った

vim javascript hubot bot

先週は Vim で help が引ける npm パッケージを作ったのだけど、そもそもなぜ作りたかったかというと、bot で使いたかったから。 と言うわけで vimhelp パッケージを使って、hubot-vimhelp を作りました。

https://www.npmjs.com/package/hubot-vimhelp
https://github.com/thinca/hubot-vimhelp

README は面倒になってあまりちゃんと書いてない。

導入方法

hubot スクリプトなので、hubot の使い方や hubot スクリプトの導入自体は省略(README に簡単には書いてあるけど)。 このスクリプト自体の導入については、スクリプトのソースの先頭にコメントで簡単な設定用の変数について書いてあるのだけど、ひとまず使いたいのであれば、

  • bot が動いている環境に vim コマンドが必要
  • プラグインマネージャ機能が使いたい場合は、
    • bot が動いている環境に git コマンドが必要。Git 2.3 以降じゃないと存在しないプラグインをうっかり指定した際に面倒なことになる可能性が高い
    • プラグインを入れておくディレクトリを用意して、そのパスを HUBOT_VIMHELP_PLUGINS_DIR 環境変数で指定する
  • 日本語ヘルプを優先して出してほしい場合は HUBOT_VIMHELP_HELPLANG 環境変数ja,en などと設定しておくとよい

以上で動く。

使い方

help の引き方

bot が動いたら、:help word もしくは :h word などで help が見れる。カンタン。手抜きをしているので、:he とかだと動きません。注意。

markdown が使える前提で、``` で囲まれた状態で発言されるので、そうじゃない環境だとおかしくなるかも。要望があればオプションなりで制御できるようにします(使いたい人いるんかな)。

プラグインマネージャ

プラグインマネージャは、/vimhelp plugin {cmd} で使える。 プラグインをインストールすると、そのプラグインの help も引けるようになる。 プラグインの指定({plugin-name})は、GitHubvim-scripts ユーザーのリポジトリ名か、<user>/<repos> 形式か、もしくは Git リポジトリのフルパスを指定できる。

  • /vimhelp plugin add {plugin-name}
  • /vimhelp plugin remove {plugin-name}
  • /vimhelp plugin update {plugin-name}
  • /vimhelp plugin list
    • インストール済みのプラグイン一覧の表示
    • (なんか条件によってはうまく動いてないっぽい…)

以上

まだバグが多い気がしてますが(特にプラグインマネージャ付近)、使ってみたい物好きな方がいればどうぞお使いください。

Vim で help が引ける npm パッケージを作った

vim nodejs javascript

色々あって node.js から Vim の help を引く必要が出てきたので、npm パッケージにしてみた。人生初 npm パッケージです。

https://www.npmjs.com/package/vimhelp
https://github.com/thinca/node-vimhelp

特に必然性はなかったのだけど、せっかくなので勉強も兼ねて ES2015 で書いてみた。node.js にも依存しているので、node.js 6 以降が必須です。 このパッケージは外部プロセスとして Vim を起動して、help を引きます。なので環境に Vim が必要です。また、プラグインの help も引きたいというそれだけのために Git を使った簡易プラグインマネージャも付いてます。こちらを使う場合は Git が必要。 使い方とかは README を参照してください。

苦労した点

初めての npm

今回初めてだったので、npm の作法やら ES2015 の機能やら、ついでにテストやらカバレッジ計測やら色々調べながらやった結果、必要以上に時間がかかってしまった…。

非同期地獄

node.js の非同期 API は、呼び出しスタックの奥底に 1 つでも非同期が混じると根本から非同期の API にする必要が出てくるのがだいぶしんどく感じた。Promise のおかげでネスト深いは回避できているものの、やはりまだしんどい印象が拭えない。ES2016 で入るとの噂の await があるとここがかなりマシになりそうな予感がするので、はよ。

外部プロセスのテスト

外部プロセスを起動するようなプログラムのテストはどこまでモックにするべきかがかなり悩ましい。コマンド実行部分をモックにすると、想定したコマンドが実行されているかまではテストできるが、想定したコマンドが期待した結果を生むかまではテストできない。そこまですべきなのかどうなのか…。 今はモック化するのが難しかったという理由もあって、テストでも実際にコマンドが実行されている。なのでプラグインマネージャのテストが走る度に git clone が実行されるという感じに…。実行も遅くなるので正直しんどい。

機能実現のアプローチについて

今回 Vim の help を引くという機能を実現するにあたって、Vim を実際に実行するという手段を選んだわけだけど、helptags や help ファイルを直接読んでパースするという手段も考えられた。 実際のところ、直接読んだ方が速度や効率は良いと思う。ただ、tags ファイルをパースしたり、Vim がやっている :help の引数の独自解釈などを自分でやるのが面倒だったため、今回は直接起動する方法を取った。こちらの方法だと、今後 Vim が :help の動作を拡張などした場合にも対応できる。そういう機会はそうそうないとは思うけども。少なくとも私が必要としている用途においてはこれでも十分な速度で動いている。

さいごに

初 npm パッケージ、作ってみたのはいいけど自分以外には需要なさそう。まだ欲しい機能がいくつかあるので、のんびり更新していく予定。

はてなダイアリーからはてなブログへ移行する際の注意点

hatena

先日、はてなダイアリーからはてなブログへ移行した。

thinca.hatenablog.com

移行に際して問題があったので書き記しておく。

TL;DR

はてなダイアリー<hoge> って書いてたら、はてなブログに移行すると死ぬ。&lt;hoge&gt; と書きかえる必要がある。

あらすじ

私は今まではてなダイアリーでそれなりに記事を公開していた。中でも Vim の記事が多く、<Leader> のようなキーの記法をあちこちで多用していた。 はてなダイアリーでは html タグは一部のタグしか使えない仕様だったため、それ以外の <Leader> のようなタグっぽい文字列はそのまま表示されていたので、なんの問題もなかった。

はてなブログでは、はてなダイアリーで使えた「はてな記法」と Markdown の両方が選択できるようになっており、はてなダイアリーで書いた記事は「はてな記法」で書かれた記事として公開されるので、そのまま移行できるとの話だったので、はてなブログへの移行を行った。

ところが、はてなブログに移行後しばらくして気付いたのだが、この <Leader> のような文字列が、はてなブログの記事内では表示されなくなってしまっていた。

ゆるせなかったのでサポートにメールし、調査を行ってもらったのだけど、最終的に以下のような返事が返ってきた(本文のみ抜粋)。

いつもはてなをご利用いただきありがとうございます。

返信が遅くなりまして申し訳ございませんでした。

はてなダイアリーでは特定のタグしか書けない仕様となっているため、 「<」 や 「>」をそのまま表示させることができましたが、 はてなブログでは、任意のタグを書ける仕様となっているため、 実体参照表記でないと表示がされません。

インポート時に一括置換できないか検討いたしましたが、今回は見送ることになりました。 大変お手数をおかけ致しますが、記事の編集画面を開いていただき、 手作業で置換をしていただくようお願い致します。

【置換例】 <Leader> → &lt;Leader&gt;

どうぞよろしくお願いいたします。

どうやらはてなダイアリーでの「はてな記法」と、はてなブログでの「はてな記法」には厳密には互換性はないらしい。

改めて移行に関するヘルプページを確認すると、以下のような説明が足されていた。

  • HTMLタグの扱いの違いに注意してください。はてなブログでは、はてなダイアリーと違ってHTMLタグがすべて利用できるため、<と>で囲まれた任意の文字列をHTMLタグとして解釈します

※はてなブログで、<と>で囲まれた任意の文字列を表示するには、たとえば&lt;foo&gt;のように実体参照で表記してください。

先月の時点の同ページ にはこの記述はないため、恐らく私の問い合わせを契機に追記されたのだと思う。

返事に1ヶ月半ほどかかっているところを見ると、それなりに検討した結果だと思うので、残念だけども仕方ない。

というわけで、これから移行を考えている人は注意してください。 また、私の古い記事の中にはこれらの理由により一部文字が消えている可能性があるので、ご了承頂きたい。さすがに過去の記事全てをチェックするのはしんどすぎる。もし発見された方は報告してもらえれば可能な限り直そうと思います。

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

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 のカラースキームの自作に関する記事をちらほら見かける。

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

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

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

最重要項目なのだけど、できていないものが多い。個人的には全て設定されていてほしい。 大きく分けて 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 は文字が見えないやつ

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

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

以上

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

参考

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