Vim - previmとrst2htmlでreStructuredTextをリアルタイムプレビューしながら編集する

f:id:kanno_kanno:20140802212512p:plain

previmでreStructuredTextをサポートしました。
ただし外部コマンド必須です。

previmとは

Vim - 依存ツールなしにMarkdownプレビューできるprevimプラグインを作った

reStructuredTextの環境要件

rst2html.pyというコマンドが必要です。
pip等でdocutilsを入れると使えるようになります。

% pip install docutils
% rst2html.py --version
rst2html.py (Docutils 0.12 [release], Python 2.7.5, on darwin)

もちろんMarkdownやtextileの場合はこれまで通り不要です。

使い方

Markdownと基本的に同じですので、上述の記事かREADMEかヘルプを参照してください。

filetyperstの場合に実行出来ます。

補足

rst2html.pyへのパスを設定で変更出来たりはしません。
previmの基本方針は「依存ツールなし」なので、reStructuredTextについてもJSパーサーが登場すればそちらに移行します。
設定値を設けているとその際に混乱を招く恐れがある、というのが理由です。

あとWIndows機を持っていないので、Windowsでの動作確認は出来ていません。(Macのみ)

Vim - Yokohama.vim #5 に行ってきた

個人の日記。
先週の土曜日、Yokohama.vim#5に参加してきました。

http://d.hatena.ne.jp/guyon/20140406/1396806492

Vim 捗る Ruby 開発 @ srockstyle

@srockstyleさんの発表でした。
私は遅刻して到着したため、こちらの発表を聞くことは出来ませんでした。残念。
帰りの方向が同じだったためご一緒させてもらった時に、「はてブ10人」とか話していたのがもう100人近く。
おめでとうございます!

ライブコーディング

chefのディレクトリから簡単にファイルを開くためのuniteプラグインを、その場でライブコーディングして作ろうという話。

このセッションの途中に私は会場に到着しました。
遅れてきた私のために主催者のguyonさんが現状を説明してくださいました。ありがとうございます。

他の人のVim操作を見ているのは面白いです。
「あれが欲しい」と思ったら自分で作れるのはVimの魅力の一つですよね。

Vim養成講座

内容については上記のguyonさんの記事から引用します。

最後のセッションは「初心者大歓迎」というふれこみで応募された方もいたと思い、劇的ビフォーアフター風に匠が初心者をコーディネートしてみようというものです。3つグループの分けてそれぞれグループで自由な感じで1時間を過ごし最後に発表です。

分け方としてVimレベルで1列に並び3等分(4人ずつ)するというもの。この時に簡単な自己紹介もして頂いたのでだいたいはいい感じで分割されました。

Vimmerはシャイと良く言われていますが、どのグループも割と会話が盛り上がっていたように思います。
個人的な反省としては、もう少し色々教えられたことがあったかなあというところ。
1時間くらいだったようですが、時間が過ぎるのはあっという間でした。

懇親会

私はあまり勉強会の懇親会には参加しないのですが、今回は意を決して参加しました。
参加したからにはなるべく会話をしようと心掛けました。
結果として色々な人とお話出来て、とても楽しかったです。
他のことならぬVimのことだったので話しやすかったのが大きいかもしれません。

感想: 有名な方々のお顔を拝見

普段ネットで見ていた方々を実際に拝見しました。
ネット上のすごい人たちは幻想ではなくて実在していました。

感想: sedawkを覚えたい欲

懇親会でお話しを聞いたことの一つで、「sedawkがあれば大抵なんでも出来る」的なことがありました。
もともと覚えたいなーとは思っていたのですが、更に欲求が高まりました。
「高まりました」とか言ってないでやれよという話ではあります。

感想: AIZU ONLINE JUDGEを知る

プログラミングコンテストの一つであるaizuを知りました。
Project Eulerとかは数学要素が強くて私には難しいのですが、こちらは割と取っ付きやすそうです。
アカウントを作らなくても問題や答えが見えるのも良いと思いました。
すぐに社内の新人に共有しておきました。
最初の問題とかこの通りとても簡単なので練習になりそうです。

感想: アットウェアさんの会場すごい

そもそも大きいビルで綺麗だったり、壁がホワイトボードだったり卓球台があったり、プロジェクタは天井から吊るされていたり。

感想: アットウェアさんのコミュニティ活動への理解力がすごい

お話を聞いた感じ、社員が勉強会へ参加したりすることへの理解力がとても良いっぽい。
そういうのは魅力的な会社の要素の一つです。

感想: 自分のプラグインを使ってくれている方とご対面

私はprevimというプラグインを作ったことがあるのですが、「使ってるよ」という方が何人かいらっしゃって舞い上がりました。
ありがとうございます。

感想: 勉強会へ参加するとやはり刺激になる

勉強会へ参加すると周りの人がみんな凄そうに見えて、良い感じに危機感を覚えます。

さいごに

主催者のguyonさん、宣伝部長のthincaさん、参加者のみなさん、素敵な場をありがとうございました。
とても有意義で楽しかったです。

Vim - previmを更新してtextileプレビューに対応しました

previmを更新しました。
今回の変更でtextileも同様にプレビュー出来るようになっています。

サンプル

以下のサンプルコードがあるとして。
(ちなみにコードの中身はhttp://borgar.github.io/textile-js/から引用しています)

h1. Using this tool

This page lets you create HTML by entering text in a simple format that's easy to read and write.

* Type Textile text in the left window
* See the HTML in the right

Textile is a lightweight markup language billed as a "humane web text editor". It originated in the blogging software Textpattern. 

"It is described as":http://textile.thresholdstate.com/:

bq. Textile takes plain text with *simple* markup and produces valid XHTML. It's used in web applications, content management systems, blogging software and online forums. Try it for yourself with the Textile quick reference and preview.

This document is written in Textile; you can see the plain-text version on the left.  To get a feel for Textile's syntax, type some text into the left window and watch the results in the right.  You can see a Textile syntax guide by switching the right-hand window from _Preview_ to _Syntax Guide_.

Textile-js is a JavaScript port of Textile.  You can get the full source code from its "GitHub repository":https://github.com/borgar/js-textile.

**Start with a "(clear)blank page (clear text)":# or edit this document in the left window.**

適当なファイル名で保存します。
仮に拡張子.textileとしても、標準のVimではファイルタイプは無いままだと思います。
ですので:set filetype=textileとして明示的にファイルタイプを変更してください。

あとはMarkdownの時と同じです。
:PrevimOpenが使えるようになりますので、実行してブラウザを起動します。
保存する度にブラウザの表示が反映されます。

f:id:kanno_kanno:20140329125006p:plain

他のフォーマットについて

今回の修正で、構造的には色々なフォーマットに対応しやすくしました。
やりたかったことのメインはこっち。
JavaScriptの変換ライブラリさえあればすぐに対応出来るようになりました。
reStructuredTextとかも対応したかったんですが、まだJavaScriptの変換ライブラリはなさそう。

おわりに

よろしければお使いください。

Vim:カーソル位置を移動せずにファイル全体を整形する

正確に言うと「ファイル全体を整形した後にもとの位置に戻る」、です。

Vimでファイル全体を整形する場合、例えば次のような操作をします。

gg=G

この場合の不満は最初のggによりカーソルがファイル先頭に移動してしまうことです。
これを解消するには次のような操作にします。

gg=G'' (シングルクオート二つ。ダブルクオート一つではない)

''の意味をヘルプから引用します。
:help ''

                            *''* *``*
''  ``      カーソルがジャンプする直前にいた、もしくは最後の "m'"
            か "m`" コマンドが行われた位置に移動します。
            |:keepjumps| コマンドモディファイヤが使われた場合には
            セットされません。
            |restore-position| も参照。

これでカーソル行は動かずに整形を行えます。
列はその行の先頭に移動します。

列も移動しない場合はC-oを使うといいかもしれません。

gg=G<C-o>(gg=GしてからCtrl + o)

:help CTRL-O

                            *CTRL-O*
CTRL-O      ジャンプリストの中の [count] だけ古いカーソル位置に移
            動します(移動コマンドではありません)。
            {Vi にはありません}
            {|+jumplist| 機能なしのときは使用できない}

「ぼくはVim script」という人は数行で実現できます。

" vimrcに記述
function! s:format_file()
  let view = winsaveview()
  normal gg=G
  silent call winrestview(view)
endfunction
nnoremap <Space>f :call <SID>format_file()<CR>

(この例ではSpace + fマッピングしています)

Vim - agやackの検索結果を表示するctrlsfプラグイン

この記事はVim Advent Calendar 2013の89日目です。
前日はmanga_osyoさんの誤った goto 文で到達しないコード箇所を直ちに検知する方法でした。

今日はctrlsf.vimというプラグインの紹介です。

f:id:kanno_kanno:20140228055222p:plain

Intro

動きは上記リンクのGIFを見て頂ければお分かり頂けると思います。

  1. キーワード検索をして
  2. 結果を新規に開いた左Windowに表示して
  3. 選択したファイルの該当行へジャンプします

Sublime Text 2のCtrl + Shift + Fみたいなやつ、ってことらしいです。

必要なもの

ag(the_silver_searcher)ackが必要です。
私はagを使っています。

参考:ackを捨てて、より高速なag(The Silver Searcher)に切り替えた

なおctrlsfはag -> ackの順でコマンドを探しますので、両方入っている場合はagが使われるはずです。

似たようなこと

以下の方法でも似たようなことは可能だと思います。

上記と比較した時の利点

マッチした行の前後も表示してくれたりして見やすい。

こちらはag.vimで検索した結果です。
一覧でスッキリしていて、これはこれで見やすいです。

f:id:kanno_kanno:20140228054448p:plain

一方こちらはctrlsf.vimで検索した結果です。
なにで検索したか、どこにマッチしたかがより分かりやすいのではないかと思います。

f:id:kanno_kanno:20140228054418p:plain

使い方

READMEに細かく書いてありますので、詳細はそちらやHelpをご覧ください。

コマンドの簡単な説明です。

  • 基本は:CtrlSF {pattern}で検索します。:CtrlSF fooなどのように。
  • オプションを指定することも出来ます。 :CtrlSF -i -C 2 {pattern}
    • オプションはagやackのオプションに準拠しているようです
  • 特定のディレクトリを指定することも可能です。:CtrlSF {pattern} /path/to/dir
    • 指定しなければ現在のディレクトリ(:pwdで表示されるディレクトリ)を対象に動きます
  • :CtrlSFOpenで結果Windowを開き直します。再検索しているわけではなくWindowを開き直しているだけのようです

検索結果Windowでのキーマップについて。

<o>, <Enter> ファイルを開く

<p>          プレビューとして開く

<q>          結果Windowを閉じる。プレビューも開いていればそっちも閉じる

<C-J>        結果Window内で、次の一致行へ移動

<C-K>        結果Window内で、前の一致行へ移動

.vimrcに書く設定値の一部について簡単な説明です。

  • g:ctrlsf_auto_close
    • 1だと検索結果からジャンプした時に検索結果を閉じる(デフォルト)
    • 0だと検索結果からジャンプした時に検索結果を閉じない
    • 例: let g:ctrlsf_auto_close = 0
  • g:ctrlsf_context
    • マッチした行の前後をどれだけ表示するか。grepでいう-B -A。agでいう-C
    • デフォルトは-C 3
    • 例: let g:ctrlsf_context = '-C 5'
  • g:ctrlsf_selected_line_hl
    • プレビューやジャンプした際に、対象行をハイライトするかどうか
    • oはジャンプしたあとにハイライトする、pはプレビューのとき
    • デフォルトはlet g:ctrlsf_selected_line_hl = 'p'
    • 例えば両方ハイライトさせるならlet g:ctrlsf_selected_line_hl = 'op'

ハイライトはこんな感じです。右Windowのs:exists_openbrowserの行がハイライトされています。

f:id:kanno_kanno:20140228054320p:plain

物足りない点

  • 今のところジャンプする時にタブで開くとか、細かい開き方の指定ができない
    • 追記: コメント参照。タブで開くのを実装して頂けました
  • CtrlSFという名前というかコマンド名がctrlp.vimのCtrlPとかぶりすぎていて、コマンド打つのがちょっとダルい
    • 'CtrlS' まで打たないと補完の結果がCtrlPとかぶるので
    • マッピングもしくは独自に別コマンドとして定義すればいいんですけど
    • そしてCtrlSFって何か打ちにくい(自分だけ?)
  • 良くも悪くも(今のところ)ag/ack依存。他の検索コマンドで使うことはできない

とはいえ、良さそうな気はするのでちょっと使ってみようかなと思います。