MacでTeXShop + VimのTeX環境を作ってみた
MacにおけるTeXおよびTeXShopについてはBeginning OS Xの該当部分にお任せさせて頂くことにする.TeXShopは「環境設定」の「書類」>「外部エディタでソースを編集」にチェックを入れることによって,TeXShopのエディタは開かずにコンパイル部分だけ使うことができるので,エディタにはVimを使ってVimからTeXShopのコマンドを呼ぶ方法を考えてみた.
Macと言えばAppleScriptによる自動化で,Vimと言えばRubyインタフェースということで,RubyOSAを使えばなんとかなるのではないかということでやってみた.RubyOSAはAppleScriptをRubyから呼び出すためのライブラリで,sudo gem install rubyosa とかすればインストールすることができる.
RubyOSAをインストールするとrdoc-osaというコマンドがついてきて,rdoc-osa --name TeXShopとかすると,カレンドディレクトリにOSA::TeXShopモジュールのドキュメントを生成してくれるので,それを頼りになんとかする.他にもAppleScriptインタフェースを備えたアプリケーションなら自動的にクラスを生成してくれるようなので,Vim > RubyOSA > AppleScriptと繋げることである程度色んなアプリケーションを操作できそう.
そして,試行錯誤の末に作ってみたのが以下のスクリプト.
function! TexShop_TypeSet()
if has('ruby') && has('mac')
ruby <<EOF
require 'rubygems'
require 'rbosa'
texshop = OSA.app("TeXShop")
texshop.documents.each {|d|
texshop.typesetinteractive(d)
}
EOF
endif
endfunction
function! TexShop_Activate()
if has('ruby') && has('mac')
ruby <<EOF
require 'rubygems'
require 'rbosa'
OSA.app("TeXShop").activate
OSA.app("iTerm").activate
EOF
endif
endfunction
command! TeXShopTypeset silent call TexShop_TypeSet()
command! TeXShopActivate silent call TexShop_Activate()
autocmd FileType tex noremap ,t :TeXShopTypeset<CR>
autocmd FileType tex noremap ,a :TeXShopActivate<CR>
以上を.vimrcとかに書いておくと,VimがTeXモードのときに,tでタイプセットを行う.TeXShopのPDF表示がTeXShopがアクティブじゃないと更新されなかったので,,aで一瞬TeXShopをアクティブにしてからiTermに戻ってくるようにしてみた.無理矢理感満載な感じやけど,とりあえず動いたのでこれで良いことにしておく.iTermじゃない人は,iTermのところをTerminalやMacVimに変えてもたぶん動くと思う.
ちなみに以前にRubyOSAでSafariをリロードする方法が紹介されていて,全面的にこの方法にヒントをもらって実装しました.ありがとうございました!
2008/06/07 03:17 | Mac | トラックバック(0) | コメント(3)
コメントの投稿
トラックバック
トラックバックURL
→http://relaxedcolumn.blog8.fc2.com/tb.php/119-57136c57
コメント
kana
> autocmd FileType tex noremap ,t :TeXShopTypeset<CR>
これだと,tがグローバルな感じで有効になってしまうので
autocmd FileType tex nnoremap <buffer> ,t :<C-u>TeXShopTypeset<CR>
のようにバッファローカルなものとして定義すべきです。
ついでに言えば:noremapではNormal modeだけでなくVisual modeとOperator-pending modeでも有効になるので、:nnoremapを使う方が良いのではないかと思います。
2008/06/23 13:19 | URL [ 編集 ]
kana
コマンドラインから使う気がないのであれば、:commandの定義は止めて直接
nnoremap <buffer> <silent> ,t :<C-u>call TexShop_Activate()<CR>
などとした方がすっきりするかも知れません。
2008/06/23 13:21 | URL [ 編集 ]
tsukkee
kanaさん,コメントありがとうございます!
なるほど,そのようにすると影響範囲を必要最低限に絞りつつ定義できるわけですね.今まであんまり深く考えずにkey mappingを定義していました.:h mapあたりをもう一度よく読んでみます.
2008/06/23 14:03 | URL [ 編集 ]