読者です 読者をやめる 読者になる 読者になる

Igor Proから外部のエディタを呼び出して編集する

はじめに

Igor Proでプロシージャをよく書くようになると,使い慣れたテキストエディタでプログラムを書きたい,という欲求が高まってきます.

しかし,プロシージャファイルを外部で変更するためには,ファイルをIgor Proから切り離さなければなりません. これはMac版のIgorではとくに重要で,メインプロシージャウィンドウに#include文を書いて読み込んだファイルを,そのまま外部エディタで変更して再コンパイルするとIgorがフリーズします*1

つまり,#includeで読み込んだファイルを編集したい場合,その前に#include文を消してやる必要があります.

一応,#include文を消すという操作をプログラムから行う方法はあって

Execute/P "DELETEINCLUDE \"procname\""
Execute/P "COMPILEPROCEDURES "

で消せます*2

ただ,この方法にも問題はあって,#includeで読み込んだファイルで定義されている関数を他で使っていた場合にはコンパイルエラーになります.こうなってしまうと,コンパイルエラー中は(独立モジュール*3として書かれていない)すべてのユーザ定義関数が無効になるので,手動で#include文を書きなおして再コンパイルすることになり面倒です.

上記の問題を解決しつつ,外部のエディタで簡単に安全にプロシージャを編集する方法を模索した結果を,以下のサイトで公開しています.

github.com

消しても問題にならない#include文と,消すとコンパイルエラーになる#include文を区別するためにファイルをincludeする機構そのものを新たに用意しました.

使い方

まずinclude.ipfをダウンロードして,User Proceduresフォルダ以下に置きます. その後,Igor Proceduresフォルダ以下に適当な.ipfファイルをつくり,以下の書式*4で読み込みたいプロシージャを書いていきます.

#include "include"

// 使いたい外部エディタを指定しておく.
// Windowsでは,パスを通してあるのでなければフルパスを指定
override strconstant Include_WinEditor="C:¥Program Files¥vim74-kaoriya-win64¥gvim.exe"
// Macではアプリ名でOK
override strconstant Include_MacEditor="MacVim"


Function IncludeList() // 関数名はIncludeListにしておく必要がある.
  include#start()

  // 読み込みたいプロシージャを列挙する.これが#includeの代わりになる
  include("CommandPanel")
  include("relabel")
  include("resize")

  include#finish()
End

IgorProを再起動するとメニューバーにIncludeという項目ができているので,その中のIncludeという項目をクリックします.これで,プロシージャの読み込みが行われます.

この段階でメインプロシージャウィンドウを見ると以下のようになっています*5

#include "include_procedures",optional // <- プロシージャの管理をこの一文に凝縮

メインプロシージャウィンドウに関数を書いていき,includeした関数を使用する場合には,メインプロシージャウィンドウに#include文を書いていきます.

#include "include_procedures",optional

#include "sample" // <- 以下で使用する関数を含むものは,本来の#include文を書く.

Function do_something()
  sample#somefunction() // sample.ipfがないとコンパイルエラーになる.
End

メニューバーのIncludeメニューからEdit Externallyを選択すると,読み込んだプロシージャウィンドウを外部エディタで編集できます.ただし,どこか他所で使われているためにプロシージャをIgorから切り離せなかった場合は外部エディタでは編集できません(コンパイルエラーを出さず,単にエディタが開きません).

注意点

この方法は,include_procedures.ipfというファイルに(必ずしも関数が使用されるとは限らない)プロシージャを列挙することで問題を解決しています.そのため,

  • User Proceduresフォルダ直下にinclude_procedures.ipfというファイルが勝手に作成される.
  • include_procedures.ipfを外部エディタで編集すると問題が発生するおそれがある.

といった問題点があります. 現在も,もっとよい解決方法がないか模索中なので,よいアイデアがありましたらぜひご連絡ください.

*1:includeしたファイルがincludeしているファイル,は外部で変更して再コンパイルしてもその変更が反映されないだけで済むようです

*2:Execute/PはExecuteではできないことが色々できる操作関数で,複数のエクスペリメントファイルのマージをしたり,メインプロシージャウィンドウに任意の文字列を挿入する,といった芸当が可能です

*3:独立モジュールに含まれる関数は,他のプロシージャのコンパイルが失敗していても使うことができます.ファイルの頭に#pragma IndependentModule=procnameと書くことで独立モジュール化できます.しかし他のプロシージャに依存しない,という制約のため,includeの挙動が特殊,メニューの書き方が特殊,グローバルな定数を参照できない,というように扱いが難しいです.

*4:vim等でプラグインマネージャを使っている方にはお馴染みの書式.

*5:#include文の末尾のoptionalは,読み込もうとしたファイルが見つからなくてもエラーを出さない,という指定です.つまり,この状態で他の(プロシージャの入っていない)パソコンに.pxpファイルを持って行ってもコンパイルエラーを吐きません.