Quantcast
Channel: Vimタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 5608

vim-dispatchでTeXファイルを非同期コンパイル

$
0
0

はじめに

vim-dispatchというプラグインがあります.

vimで非同期実行ができるプラグインです.

裏でコンパイルと実行を行いながら, ファイルの編集ができます.

ちょうど修士論文をtexで書いているので, 使ってみます.

VimからTeXコンパイル

私は, VimでTeXファイルの編集をしています.

しかしTeXファイルのコンパイルは, やたら時間がかかります.

特に, bibtexを使っていると, platexしてbibtexしてplatexしてplatexする必要があります.

コンパイル用に, こんなシェルスクリプトを使っています.

#!/bin/bash## autobibtex file=$1["$file"=""]&&{echo"input file name!";exit 0;}

nkf -w8 --overwrite $filefilename=$(basename $file .tex)

platex -shell-escape $filename".tex"
bibtex $filename".aux"
platex $filename".tex"
platex $filename".tex"
dvipdfmx $filename".dvi"

find . | grep -E "$filename.(bbl|log|toc|dvi|blg|aux)"| xargs rm

platexからbibtexからplatexからplatex. アホです.

時間がかかって作業が止まります. 辛いです.

Vimから出ずに, ファイルを編集しながら裏でコンパイルできたら嬉しいです.

latexmkomakeで変更を監視して自動コンパイルする方法もあると思います.

しかし, 自動コンパイルはちょっと鬱陶しいです. 自分のタイミングでコンパイルしたいです.

そこで, 非同期実行を可能にするプラグイン: vim-dispatchを使います.

やってみたこと

texコンパイル用のスクリプトを書いておいて, それをvim-dispatchで呼び出します.

コンパイル用のスクリプトをautobibtexとします. 先ほどの, platexしてからbibtexしてplatexするシェルスクリプトです.

次に, vim-dispatchをインストールします.

NeoBundleを使っていれば, .vimrcに1行書くだけですね.

NeoBundle 'tpope/vim-dispatch'

そして, vimを起動して, $VIMRUNTIME/ftplugin/tex.vimを編集します.

こう打てばtex.vimの編集ができるはずです.

:e $VIMRUNTIME/ftplugin/tex.vim

tex.vimの中に, 2行だけ書き加えました.

nnoremap ,r :w<cr> :Dispatch! autobibtex % <cr>
nnoremap ,,r :w<cr> :Dispatch autobibtex % <cr>

:Dispatch! コマンドで, 非同期実行できます.

コンパイルメッセージも出てきません. 裏でコンパイルしてくれます.

vim-dispatchのおかげで, コンパイル中もファイルの編集ができます.

エラーがあって上手くいってなさそうな場合は, !マークを外したバージョンで実行してエラーメッセージを確認すればいいかなと思います.

感想

だいぶ快適です.

設定を3行書き加えただけで, コンパイルの時間が気にならなくなりました.

今回はコンパイル用のシェルスクリプトを呼んでいますが, makeファイルを書くほうが標準的ですよね. make+vim-dispatchの方がカッコ良さそうです.

ところで, 非同期ができても, PDF閲覧ソフトが自動更新してくれないと意味がないです.

Linuxならevince, MacならSkim.appなどが, PDFの変更を検知して自動更新してくれます.

Windowsは分かりません. TeXstudioとか使えばいいのでは.

以上です.


Viewing all articles
Browse latest Browse all 5608

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>