fc2ブログ

ぼちぼち散歩

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)

ページの先頭へ

コメント

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 [ 編集 ]

コメントの投稿


トラックバック

トラックバックURL
http://relaxedcolumn.blog8.fc2.com/tb.php/119-57136c57

トップページへ