vimでreStructuredTextを使うまでの準備


GUIで文字入力をしたい。もっと言えば、入力したMarkdown表記を即時プレビューしてくれるソフトウェアが欲しかった。
しかし、Markdownではなく、reStructuredTextを使いたいことに気づいた。
そして、Markdownならまだしも、reStructuredText用のGUIソフトが存在しない(私は見つけられなかった)。

あなたがこの記事を読んでいると言うことは、私はすでにVimmerとして名声を得られる1歩を踏み込んだことを褒めてくれていることでしょう。
私は、Vim使いとしての浅はかさをさらけ出しただけでなく、世にあふれるVimmerの一人に数えられることになったことも実感しており、それは事実だ。
それほどまでに、Vimmerは心が広い人たちばかりだと気づかされる。

先日もmattnさんにTwitterで質問したとき、返事をしてくれたからな。

(MacとWindowsを混在させた書き方をしているため、見にくいかもしれない。Vimmer達が許してくれたとしてもいずれ分けよう)
と言うことで、Vimの環境構築をすることにした。
訳の分からないところで躓いたため、Markdownを使いながらここに記録を残す。
もちろん、今回はvimを使って執筆している(まだまだ.vimrcの改良余地は大幅に残されているが)。

ちなみに、Github独自のMarkdown記法が存在する。

vimrc

今回、設定ファイルは必要最小限で実行する。
以下、起動直後の画面。

以下の内容で今回実行する。

.vimrc
" 以下、パッケージ管理
packadd minpac
call minpac#init()

" minpacでminpacを更新する場合は以下を有効にする。
call minpac#add('k-takata/minpac', {'type': 'opt'})

"call minpac#add('previm/previm', {'type': 'opt'})
call minpac#add('previm/previm')    " プレビュー用
call minpac#add('tyru/open-browser.vim')    " ブラウザを起動し、上記のprevimを実行させる。

" すべてのプラグインを起動時に読み込むのであれば、以下を実行。
packloadall

"let g:previm_open_cmd = 'open -a Safari'   " open-browser.vim
let g:previm_open_cmd = 'open -a Firefox'   " Safariが動かなかったため。

ディレクトリ準備

事前に、以下のディレクトリ構造を作成しておく必要がある。

ディレクトリ構造
[chesscommands@Qiita minpac] $ pwd
/Users/chesscommands/.vim/pack/develop/opt/minpac
[chesscommands@Qiita minpac] $ ls -R1 ../../../..
../../../../dict:
../../../../pack:   ←自分で作成
../../../../pack/develop:   ←自分で作成
../../../../pack/develop/opt:   ←自分で作成
../../../../pack/develop/opt/minpac:    ←自分で作成(配下のは違う)
../../../../pack/develop/opt/minpac/autoload:
../../../../pack/develop/opt/minpac/autoload/minpac:
../../../../pack/develop/opt/minpac/doc:
../../../../pack/develop/opt/minpac/plugin:
../../../../pack/develop/opt/minpac/test:
../../../../pack/develop/opt/minpac/tools:
../../../../pack/develop/start: ←自分で作成
../../../../writing:    ←自分で作成
../../../../writing/opt:    ←自分で作成
../../../../writing/start:  ←自分で作成

※自分で作成していないディレクトリは、コマンド実行によって作られたディレクトリになる。

ディレクトリ作成後、ターミナル上で、git clone https://github.com/k-takata/minpac ~/.vim/pack/develop/opt/minpacを実行する(Mac用)。

(当然だがMacの専用Pathになる。Windowsでは~やピリオド始まりのディレクトリ名が使えないはずなので)
そして、Windowsは、以下のコマンドでgitコマンドを実行する。

git clone https://github.com/k-takata/minpac "C:\Users\chesscommands\vimfiles\pack\develop\opt\minpac"

OSに限るのか否か知らないが、Path固定でしか操作方法を知らないので、このままで続ける。
実行後は、minpacディレクトリ配下に、上記のように、autoloadやdocディレクトリなどが(自動で)作られる。
正確には、cloneしている。

下準備ができたため、exコマンド上で、call minpac#update()を実行する。
(当たり前だが、事前にディレクトリを作成しておかなければ、Vim本体の起動時にエラーが発生する。Windowsに限るが)

(Windowsでエラーを出せるならば、Macでも出せると思うのだが・・・なぜ出さなくていいと思ったのだろう)
あとはminpac(から自動)でprevimopen-browser.vimがcloneされる。
そうすれば、exコマンド上でPrevimOpenするだけでブラウザが開き、執筆中の記事がブラウザに表示される(Macのみ)。

Windowsの場合は、絶対Pathを指定しなければブラウザが起動してくれなかった。
以下の設定をする。

_vimrc
let g:previm_open_cmd = 'C:\/\/Program\ Files\/Mozilla\ Firefox\/firefox.exe'   " open-browser.vim
"let g:previm_open_cmd = '' " open-browser.vim

私の環境では、何の設定もしていないため、/記号やスペース記号を\記号で打ち消しておく必要がある。
また、Path指定が面倒ならば、空でも問題ない。その場合は、既定のブラウザが起動する。
そもそもMacのように、ブラウザ名だけで起動して欲しい(Helpを見てもよく分からなかった)。

しかも、Macのように、open関数(?)の引数にブラウザ名を指定した場合、その関数でエラーになるという現象に遭遇した。
それも解決方法が分からないままだった(だからフルPathを使った)。

OS独自の関数を外部から引っ張って用いているのかと思ったが、そうではないようだし・・・。
よく分からない。

環境用意放棄

ディレクトリなどを用意せず、アップデートコマンドだけを打ったとしてもエラーになるのは当たり前のこと。

Path固定と知らず、好きな場所で作業して悩まされたエラーだった。
ぬぅ。

その他

ちなみに、vimで執筆する場合は、モード切替を頻繁に行うはず。
そのため、ESCでインサートモードを抜けたときにIMEが確実にオフになってくれたらうれしい。
Ctrl+[の組み合わせもオフにする)

.gvimrc
inoremap <ESC> <ESC>:set iminsert=0<CR>
inoremap <CR>[ <CR>[:set iminsert=0<CR>

ノーマルモードで間違えて日本語入力にしてしまい、Escキーを押してもオフにならないのは何とかならないものか・・・。

set imdisableを使う方法もあるようだが、限定された場所でしか使えないらしく、今回見送り。
また、行内での検索もIMEがOffになってくれたらうれしい。
それが以下の設定になる。

.gvimrc
nnoremap <silent> f :set iminsert=0<CR>f
nnoremap <silent> F :set iminsert=0<CR>F

上記のEscキーなどでOffにする場合、この設定は不要に思うが、念のため設定した。
(後日:確実に不要だった。その理由は、Ctrl+oの組み合わせをするときに、これが有効だった場合、Escキーが押されたような挙動をしてしまい、想定外の挙動に繋がるため、使用を中止した)

完成

この設定をするだけなのに、数週間かかってしまった。それとも数ヶ月?

他の人ならば数時間もかけずにできるだろうから私は本当に技術者に向いていないのかもしれないが、満足できた結果になったので問題なしとしよう。

困っている

今回のこととは全く無関係なのだが、Ctrl+hの組み合わせでバックスペース機能になるはずが、全く動かなくなる。
そのときの事象は、インサートモードで、command+vで貼り付けたあとに上記の組み合わせを用いたときに発生する。
コマンド上でのpを使って貼り付けた文字でも削除できない現象に見舞われた。
貼り付けた文字ではなく、普通に打ち込んだ文字を消すときには普通に機能する。
また、Enterキーの挙動が遅く反応するようになってしまった(俗に言うもっさり感が出てきた)。
あぁ解決できない。

ある程度の削除は解決した

set backspaceが有効化されていなかった。
設定ファイルに存在しないため、設定していないだけだったようだが、今回まで気づかなかったのはなぜだろう。
今まで普通に削除できたような気が・・・。

冒頭の躓き発言

今回執筆した経緯は、環境を整えても動いてくれなかったためだ。
その原因は、上記のminpac#addprevimをcloneするときの引数に余計な記述をしていたためだった。
そのため、全く動かず、かなり困惑した。
そもそも、なぜこの引数を付けたのか謎だ(多分・・・コピペが原因だろう)。
見直しても気づかなかったのだから記録に残したいと思うだろう?

おまけ

また、reStructuredTextとは関係ないが、previmはマークダウン形式の執筆にも対応しているため、ファイルの拡張子の対応範囲を拡大しておく必要がある。

.vimrc
autocmd BufNewFile,BufRead *.{md,markdown,mkd,mkdn} set filetype=markdown

そして、勝手に折りたたみが行われるため、それを抑止しなければならない。
もちろん自動的に折りたたまれる挙動が好きな人は何もしなくて構わない。

.vimrc
let g:vim_markdown_folding_disabled=1

次に、ショートカットキーを設定する。
執筆記事をプレビューさせるのに、Exコマンド上でコマンドを打つのがめんどくさいため、以下の設定を行い、Ctrl+pにて、代替させる。

.vimrc
nnoremap <silent> <C-p> :PrevimOpen<CR>

これで、ある程度は使いやすくなったはず。
何より、執筆環境が整った。
以上。