VimとRubyでScrapboxの日記に追記する

前回書いたTipsに近い話ですが。

note103.hateblo.jp

もっと手軽にVimから投稿できないかなあ、と思って作った物をご紹介します。このとき、投稿対象はその日の日記ページとします。個別のScrapboxページを作成する場合には、前回の記事後半に示した「Vimから新規ページを作ってコピペする」を使います。

目次

VimコマンドラインモードからScrapboxに投稿する

まずはVimコマンドラインモードからサクッと投稿するやつ。

https://i.gyazo.com/455a334df1d3ee3a738cda41f74a6b2a.gif

.vimrcに設定した任意のマッピングを打つと、コマンドラインに以下が表示され、テキストの待機状態になります。

:!ruby ~/scrapbox/sb-post.rb note103 (ここにテキストを入れていく)

上記のデモでは、テキスト部分に「Vimから投稿テスト」と入れています。このとき、行頭に全角スペースを入れていますが、それは投稿時に1字下げするためです。この字下げを半角スペースでやると自動的に詰められてしまうので、全角にしています。

コードを見てみましょう。まず .vimrcの方ではこのように書いています。

nnoremap <Leader><Leader>i :<C-u>!ruby ~/scrapbox/sb-post.rb note103 

1行ですね。ここではリーダーキー(ぼくはスペースにしていますが)を2回叩いてから、iを1回打つとこの待機状態に入るようにしています。

後半の「note103」とある部分は、Scrapboxのプロジェクト名です。複数の投稿先候補がある場合には、一番使うプロジェクト名をここに書いておいて、それ以外のプロジェクトに投稿したい場合には、コマンドラインに出てきてからさらっと書き換えるようにしています。

コードが1行で済んでいるのは、大半の(というかすべての)処理をRubyスクリプト(sb-post.rb)に任せているからですね。

では、そのRubyのコードを見てみましょう・・とするつもりでしたが、じつはこのスクリプトは後述の機能も兼ねているので、そこまで紹介してからあらためて掲示します。

Vimで書いている任意の内容をそのまま投稿する

コマンドラインモードから投稿できるのはお手軽ですが、上記のとおり、半角スペースを含む投稿はできなかったり、けっこう制約があります。

そこで、バッファに書いている内容の一部をサクッと投稿(日記に追記)できないか、と考えて作ったのが以下です。

まずは使ってる様子を見てみましょう。

カーソルが乗っている行を投稿

https://i.gyazo.com/a426037e4f782604e22ec86bd70414a0.gif

選択範囲を投稿

https://i.gyazo.com/73ee490c9f98e2c6bbcc2b55cf3c3bcf.gif

前回の記事で紹介した、バッファの内容をScrapboxにコピペするものはバッファ全体を対象としていていましたが、今回は「カーソルが乗っている行」、または「選択した部分」だけを飛ばしてくれます。またこの際には、最初に書いたとおり、投稿先は当日の日記を対象にしています。

コード

では、それを実現しているコードを示します。まずは .vimrcに記載している関数&マッピングがこちら。
gist.github.com

その中から呼び出しているRubyのコードはこちら。
gist.github.com

どちらもエスケープの置換が泥縄な気がしますが・・とりあえずこれである程度は機能してくれます。

近況

最近はPerlの次に勉強する言語として、なるべくRubyを使ってみるようにしています。まだまだRuby本来のパワーとか独自性などの魅力には触れられていない自覚ですが、それでもいろいろ直感的に使える*1感じがして、面白いです。使い方がわからないときも、ちょっと検索すればたくさんの情報に出会うことができます。

余談ですが、Rubyの方の22行目にある & の置換について、他と同様にバックスラッシュでエスケープしようとしても効いてくれなくて、しばらくハマりました。検索を繰り返してもなかなか解決策に出会えず・・諦めかけましたが、以下でようやく解決しました。
stackoverflow.com

先日のbuilderscon 2018では最終日のスピーカーだったAmyさんが、その発表の中で「大抵の疑問はStack Overflowで解決する」と言っていましたが、まったくその通りだなと思いました。

さらにちなみに、そのQ&Aの中ではビシッと解答が示された後にも質問者が「これじゃ動かないよ」と言っていて、解答者がそれに対して「そりゃエスケープの問題じゃなくて君のコードの問題だよ」と言っているのを見て、ああ、いかにも初心者のハマり方・・わかります・・という感じでした。

初心者は2重、3重に少しずつ間違えているので、そのうち一つの問題を解消しても不具合は直らず、正しい修正の正しさがわからない、何をどう間違えているのかもわからない、そして混沌に至る・・というよくあるパターン。でもそれも、結局はひとつずつ地道に解消していくしかないんですね。それが一番の近道というか、舗装された安全な道。

そうした地道な一歩一歩をくり返す中で、徐々にスピードが上がったり、効率的な進み方を思いついたりするのかなあ、と思っています。

*1:構文をちゃんと覚えてなくても、「こんな感じかな?」とかカンでやってみるとそれで動いたり。