2020年3月1日日曜日

32: LibreOffice Basic IDEの代わりに任意のテキストエディターを使う

<このシリーズの前の記事 | このシリーズの目次 | このシリーズの次の記事>

LibreOfficeまたはApache OpenOfficeのBasic IDEがそれほど扱いづらくないことないのは気のせいではありません。それを使う必要はありません。

話題


About: UNO (Universal Network Objects)
About: LibreOffice
About: Apache OpenOffice
About: LibreOffice Basic
About: Apache OpenOffice Basic

この記事の目次

記法

  • 'Office'は、LibreOfficeまたはApache OpenOfficeを意味する。

開始コンテキスト



ターゲットコンテキスト



  • 読者は、Office Basic IDEの代わりにテキストエディターを使用する方法を知る。
ト書き
Hypothesizer 7、Objector 32A、Objector 32Bがコンピューターの前にいる。


オリエンテーション


Hypothesizer 7
本記事では、とても扱い難くないとは言えないLibreOfficeまたはApache OpenOfficeのBasic IDEの代わりにテキストエディターを使用する方法を知ります。

Objector 32A
「とても扱い難くないとは言えない」?なぜそんな回りくどい言い方をする?はっきり言え!

Hypothesizer 7
何を言えと仰るのですか、サー?

Objector 32A
扱い難いと言え。

Hypothesizer 7
えーと、それが適切な表現かどうか...

Objector 32A
もしくは、いらいらすると言え!

Hypothesizer 7
えーと、...

Objector 32A
もしくは、'最低'が適切な表現かな?

Hypothesizer 7
...印象には個人差がございますので。

Objector 32A
あのIDEで一番最低なのはどこだ、あんたにとって?

Hypothesizer 7
...あのIDEで私にとって最もとても扱い難くないとは言えないことは、ソースコードエリアが長い行を折り返さないことです。

Objector 32A
ああ、あれは最低だな。一度に行全体が見渡せない。あのなあ、プログラミングというのは、'文字群をシーケンシャルに一度、始めから終わりまで書いていく'ことじゃないんだ。行ったり来たりして、頻繁に、ある行またはブロックについて考え込む、そこに何の問題があるか見極めるために。行やブロックの全体が見渡せないというのは致命的だ。

Hypothesizer 7
...あのIDEで私にとってとても扱い難くないとは言えない別のことは、ダブルクリックすると、単語の'_'で分割された部分が選択されることです、それは実に...

Objector 32A
いらいらするよな?

Hypothesizer 7
...不便だと言いたかったのです。私は原則として全ての変数名に'_'を使うので、変数名を容易に選択することができません。

Objector 32A
最低だよな?

Hypothesizer 7
...他には、あのIDEは、複数のモジュールを同時に見させてくれません、それはとても不便です。

Objector 32A
ああ、それを言ったか。ソースファイルを他のソースファイルを参照しながら編集するというのは常套手段なのに、それがサポートされていないんだからな!あのIDEはプログラミングエディターとしての最低必要レベルに達していない!

Hypothesizer 7
...他には、左側にある、ライブラリーモジュールのツリービューは...

Objector 32A
最低だ。

Hypothesizer 7
...不親切だと言いたかったのです。普通、そういうツリービューは、ライブラリやモジュールを作成したり、ライブラリやモジュールの名前を変更したり、ライブラリやモジュールを削除したりさせてくれるものですが、あのツリービューは、それらのどれもさせてくれません...

Objector 32A
怒りがあふれてきたか?

Hypothesizer 7
...私は自分の感情を制御しております、サー。

とにかく、簡潔に申し上げて、あのIDEは...

Objector 32A
最低だ。

Hypothesizer 7
...とても扱い難くないとは言えません。そこで、私は、あのIDEに暇をやって、代わりに自分の好みのテキストエディターを使用します、それが本記事のテーマです。

Objector 32B
あのIDEが最低、またはとても扱い難くないとは言えないことに賛成だけど、マクロをデバッグする際は、あのIDEを使わざるをえなでしょう?                  

Hypothesizer 7
マダム、実は、それが重要な論点でして、それを後のセクションで論じます。


本体


1: ソースファイル群のベースディレクトリを特定する


Hypothesizer 7
まず、Basicソースファイル群のベースディレクトリを特定しましょう。

それは勿論、環境に依存しますが、私のLinuxのLibreOffice 6.0.7では、'~/.config/libreoffice/4/user/basic'で、私のWindowsのLibreOffice 6.3.3では、'C:\Users\%the user name%\AppData\Roaming\LibreOffice\4\user\basic'です。...あなたの環境についてはご自分でご推測できるでしょう。

Objector 32B
アプリケーションに格納されているライブラリについてのみ話してません?ドキュメントに格納されているライブラリについてじゃなく?

Hypothesizer 7
ああ、仰るとおりです。Basicコードをドキュメントに入れる習慣が私には全然ないので、それについては全然考えていませんでした...

えーと、もしも、あるBasicライブラリをドキュメントに入れなければならないのでしたら、私だったら、まず、それをアプリケーションに格納されたライブラリとして開発して、次に、それをドキュメントに入れるでしょう(そのライブラリをエクスポート・インポートする)。ドキュメントに格納されたライブラリを外部テキストエディターで直接に開発できるとは私は推測しません。


2: ライブラリを作成する


Hypothesizer 7
準備として、Officeインスタンスが既に立ち上がっているのであれば、それをシャットダウンします。

Objector 32B
そうしないといけないの?

Hypothesizer 7
全てのケースで必要というわけではありませんが、そうするのが安全です。

Objector 32B
そうしないとどれだけ危険なの?爆発する?

Hypothesizer 7
それほど危険ではありません、しかし、Officeインスタンスはその新たなライブラリを、再起動されるまで認識しないかもしれませんし、私たちが行なった設定を、多分シャットダウン時に、消してしまうかもしれません。

Objector 32B
ああ。

Hypothesizer 7
ライブラリを作成するには、Basicベースディレクトリにそのライブラリ名のディレクトリを作成し、Basicベースディレクトリにある'script.xlc'ファイルを編集して、'library:libraries'要素内に'library:library'要素を追加します、以下のように。

@XML ソースコード
 <library:library library:name="theBiasPlanet_coreUtilities" xlink:href="$(USER)/basic/theBiasPlanet_coreUtilities/script.xlb/" xlink:type="simple" library:link="false"/>

Objector 32B
うん?ふーん、'theBiasPlanet_coreUtilities'がライブラリ名ね?

Hypothesizer 7
はい。次に、そのライブラリディレクトリに'script.xlb'ファイルを作成します、以下のコンテンツで。

@XML ソースコード
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE library:library PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "library.dtd">
<library:library xmlns:library="http://openoffice.org/2000/library" library:name="theBiasPlanet_coreUtilities" library:readonly="false" library:passwordprotected="false">
</library:library>

Objector 32B
ふーん、ライブラリ名1つを変えればいいのね?

Hypothesizer 7
はい。


3: モジュールを作成する


Hypothesizer 7
ライブラリを作成する場合と同じように、準備として、Officeインスタンスが既に立ち上がっていれば、それをシャットダウンします。

モジュールを作成するには、当該ライブラリディレクトリにモジュール名 + '.xba'のファイルを作成し、そのモジュールを'script.xlb'ファイルに、'library:library'要素内の'library:element'要素として登録します、以下のように。

@XML ソースコード
 <library:element library:name="collectionsHandling"/>

Objector 32B
'collectionsHandling'がモジュール名ね?

Hypothesizer 7
はい、モジュールファイルに以下のみを書きます、今のところ。

@XML ソースコード
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd">
<script:module xmlns:script="http://openoffice.org/2000/script" script:name="collectionsHandling" script:language="StarBasic" script:moduleType="normal">Option Explicit

</script:module>

Objector 32B
モジュール名1つを変えればよいと。...でも、これって本当に、IDEを使うより面倒が少ないかしら...

Hypothesizer 7
まあ、ライブラリおよびモジュールの作成部分をIDEを使って行なって、その後に、テキストエディターを使うように切り替えることもできますが、IDE無しで作業することに慣れた後では、上記の方法のほうを好むようになるかもしれません。実のところ、上記方法は、今思われるかもしれないほど面倒ではありません、コピーをして数カ所を変更するだけですから。

Objector 32B
そうかもね。


4: モジュールをコーディングする


Hypothesizer 7
ご注意として、ライブラリもモジュールも追加、削除、名前変更しないならば、Officeインスタンス(もしも、あったとして)をシャットダウンする必要はありません。

Objector 32B
それはよかった。

Hypothesizer 7
今や、モジュールファイルの'script:module'内にコーディングできます、心行くまで。

Objector 32B
好みのエディターを使ってね...

Hypothesizer 7
はい。私はコーディングに常に'vim'を使用しますが、そのほうがずっとスムーズで快適です、あの...IDEを使用するより。

Objector 32A
あの最低なIDEと言いたかったんだろ。

Hypothesizer 7
...1つ注意すべきことは、コードはXMLタグ内に入るので、'<'、'>'、'&'をそれぞれ'&lt;'、'&gt;'、'&amp;'とエスケープしなければなりません。

Objector 32A
ああ、それは、行折返しをサポートせず複数ソースファイルを同時には表示しないIDEを使うよりましだな。

Hypothesizer 7
IDEは'''および'"'もそれぞれ'&apos'および'&quot;'としてエスケープしますが、それは必要ではありません、それらは任意のXMLタグテキスト内で許されますから。


5: コードをデバッグする


Hypothesizer 7
任意のサブルーチンを呼び出す前に、モジュール群をコンパイルしたいと思うでしょう。

Objector 32A
思うかい?サブルーチンは、コンパイルする面倒をとらなくても呼び出せるんじゃないか?

Hypothesizer 7
できますが、Basicは不思議なエラーを表示しがちです、もしも、シンタックスエラーがコード全体のどこかに隠れていたら。

Objector 32A
不思議なエラーをどんな条件でも表示しがちだがな、俺の経験では...

Hypothesizer 7
エラーはずっともっと不思議になりがちになるでしょう。

Objector 32A
どれくらいもっとだ?

Hypothesizer 7
例えば、エラーがある行で発生しますが、その行には全然責任がなく、別のモジュールのシンタックスエラーに責任があります。

Objector 32A
そいつは不思議すぎる...

Hypothesizer 7
したがって、全てのモジュールが正常にコンパイルされることを確かめたくなるでしょう。

Objector 32A
あの最低なIDEを使わずにどうやってモジュールをコンパイルできるんだ?

Hypothesizer 7
私が知る限り、BasicモジュールはIDEを使用してコンパイルしなければなりません。

Objector 32A
はあ?それがおちか?最悪なIDEに触らなくっちゃいかんのか、結局のところ?

Hypothesizer 7
あの最...とても扱い難くないとは言えないIDEに触ることを避けることが私たちのここでの主要目標なので、コンパイルを自動化する外部プログラムを作成いたしました。したがって、私たちはIDEを使用しますが、それに触れないか、少なくとも、できるだけ少なく触ります。

Objector 32A
「自動化する」?

Hypothesizer 7
そのコンパイル実行プログラムを実行すると、IDEが自動的に起動して、指定されたモジュール、または指定されたライブラリ、または全ライブラリを自動的にコンパイルします。

Objector 32A
...IDEがコンパイルエラーを報告したらどうなる?

Hypothesizer 7
IDEは、エラーを通常どおりメッセージボックスで報告します。したがって、メッセージボックスに触れて閉じる必要があるでしょう、それがお嫌でなければ。

Objector 32A
そんなメッセージボックスに触れるのも嫌だとは言わないさ。...IDEが病原体だとは言わなかったぞ。

Hypothesizer 7
実は、私はJava版およびPython版を作成しました。

Objector 32A
なぜBasicで作らなかった?

Hypothesizer 7
なぜなら、Basicは、モジュールをコンパイルすることもプログラムを実行することもできますが、同時に両方はできないためです。どんなBasicプログラムもコンパイルを起動することはできません、なぜなら、それは実行中だからです。

Objector 32A
ああ...、それで、そのプログラムはどこにある?

Hypothesizer 7
それらは、このZIPファイルに含まれており、ビルドする方法は、ここでで説明されています。

Objector 32A
...開発環境を構築してソースファイルからビルドしないといけないのか?

Hypothesizer 7
Python版は必ずしもビルドしなければならないわけではありません、しかし、3.6以降のPythonとpyperclipを前提としてはいます。

Objector 32A
新しいPythonをインストールすればいいだけだろ?

Hypothesizer 7
そうとも言えません、実のところ。UNOプログラムなので、ご使用になっているOfficeプロダクトがPythonバージョンを決定します(Linux用Windows用の説明)。

Objector 32A
おう。...それじゃあ、俺のOfficeプロダクトが古いバージョン指定だったら、Java版を使わないといけないと...

Hypothesizer 7
それが、Java版もご紹介している理由です。...または、Python版をあなたの古いPythonに合うようにご自分で変更していただくこともできます。

Objector 32A
どうやって?

Hypothesizer 7
実のところ、Python版が3.6以降Python用である唯一の理由は、変数タイプアノテーション機能を使用していることであり、変数タイプアノテーションを取り除けば、Python 3.5でも問題なく動作するでしょう。

Objector 32A
なんでお前が自分で取り除かない?

Hypothesizer 7
なぜなら、私は「ダックタイピング」と言われているもののファンではなく、変数タイプアノテーション無しでPythonコードを書く意図は全くないためです。

Objector 32A
...お前、最低だな。

Hypothesizer 7
OfficeインスタンスがUNOサーバーとして起動された後、Java版は、ターミナルで以下のいずれか(Gradleを介してまたは直接に)で実行することができます(カレントディレクトリをプロジェクトディレクトリにして、「${HOME}/myApplications/libraries/javaFx/lib」、「/usr/lib/libreoffice」、「${HOME}/.config/libreoffice/4/user/basic」、「Standard」、「Module1」は、それぞれ、JavaFXパス、Officeパス、Basicソースベースパス、ライブラリ名、モジュール名)(Windows用にはコマンドを調整してください)。

@bash ソースコード
gradle i_executeJarTask -Pc_mainClassName="theBiasPlanet.basicCompiler.programs.BasicCompilerConsoleProgram" -Pc_commandLineArguments="socket,host=localhost,port=2002,tcpNoDelay=1;urp;StarOffice.ComponentContext ${HOME}/.config/libreoffice/4/user/basic Standard Module1"

@bash ソースコード
bash -c "export URE_BOOTSTRAP=\"file:////usr/lib/libreoffice/program/fundamentalrc\"; java --module-path ${HOME}/myApplications/libraries/javaFx/lib --add-modules=javafx.controls,javafx.fxml -Dprism.order=sw -classpath target/theBiasPlanet.basicCompiler.jar:../unoUtilitiesToBeDisclosed/target/theBiasPlanet.unoUtilities.jar:../coreUtilitiesToBeDisclosed/target/theBiasPlanet.coreUtilities.jar:/usr/lib/libreoffice/program/classes/unoil.jar:/usr/lib/libreoffice/program/classes/jurt.jar:/usr/lib/libreoffice/program/classes/ridl.jar:/usr/lib/libreoffice/program/classes/juh.jar theBiasPlanet.basicCompiler.programs.BasicCompilerConsoleProgram \"socket,host=localhost,port=2002,tcpNoDelay=1;urp;StarOffice.ComponentContext\" \"${HOME}/.config/libreoffice/4/user/basic\" \"Standard\" \"Module1\""

Python版は、ターミナルで以下のいずれか(Gradleを介してまたは直接に)で実行することができます(カレントディレクトリをプロジェクトディレクトリにして、「/usr/lib/libreoffice」、「${HOME}/.config/libreoffice/4/user/basic」、「Standard」、「Module1」は、それぞれ、Officeパス、Basicソースベースパス、ライブラリ名、モジュール名)(Windows用にはコマンドを調整してください)。

@bash ソースコード
gradle i_executePythonExecutableFileTask -Pc_mainModuleName="theBiasPlanet.basicCompiler.programs.BasicCompilerConsoleProgram" -Pc_commandLineArguments="socket,host=localhost,port=2002,tcpNoDelay=1;urp;StarOffice.ComponentContext ${HOME}/.config/libreoffice/4/user/basic Standard Module1"

@bash ソースコード
bash -c "export PYTHONPATH=\"${PYTHONPATH}:source/python:/usr/lib/libreoffice/program:../unoUtilitiesToBeDisclosed/source/python:../coreUtilitiesToBeDisclosed/source/python\"; export URE_BOOTSTRAP=\"vnd.sun.star.pathname:/usr/lib/libreoffice/program/fundamentalrc\"; python3 -m theBiasPlanet.basicCompiler.programs.BasicCompilerConsoleProgram \"socket,host=localhost,port=2002,tcpNoDelay=1;urp;StarOffice.ComponentContext\" \"${HOME}/.config/libreoffice/4/user/basic\" \"Standard\" \"Module1\""

もしも、pyperclipがあなたのシステムのコピー/ペーストメカニズムを発見できないというエラーが発生したら、これをご参照ください(私は'xsel'をインストールしました)。

Objector 32A
あるライブラリ全体をコンパイルしたいんだが、実は。

Hypothesizer 7
モジュール名を省略してください、そうすれば、ライブラリ全体をコンパイルします。

Objector 32A
実は、全ライブラリをコンパイルしたいこともあるのだが。

Hypothesizer 7
ライブラリ名も省略してください、そうすれば、全ライブラリをコンパイルします。

Objector 32A
おう。

Hypothesizer 7
プログラム実行前のクリップボードデータが失われるかもしれないことにご注意ください。

Objector 32A
「かもしれない」?

Hypothesizer 7
Python版は、クリップボードデータを、それがテキストデータである場合のみ復旧するはずですが、その理由は、pyperclipはテキストデータのみをコピー・ペーストできるからです。Java版は、クリップボードを復旧しようと試みるのですが、私のLinux環境ではうまくいきません: Javaプログラムによってセットされたクリップボードデータは、プログラム終了後にクリアされてしまいます、理由は私は知りません。

Objector 32A
なぜ、お前のプログラムはクリップボードにちょっかいを出してるんだ、そもそも?

Hypothesizer 7
なぜなら、IDEは変更されたソースファイルをリロードしようとしないからです。したがって、プログラムが変更されたコンテンツをIDEにコピー・ペーストしなければなりません。

Objector 32A
...何かトリッキーなことをやってるんだな?

Hypothesizer 7
実は、そうです。したがって、プログラムがIDEを操作してIDEがちらつく際には、IDEには触らないでください、メッセージボックスがあなたのアクションを要求する時以外は。

Objector 32A
なるほど。

Hypothesizer 7
サブルーチンを呼び出すためには、IDEは必要ありません。

例えば、サブルーチンをオペレーティングシステムコマンドで呼び出すことができます、以下のようにして(「Standard」、「Module1」、「Main」は、それぞれ、ライブラリ名、モジュール名、サブルーチン名)。

@bash or cmd ソースコード
soffice "vnd.sun.star.script:Standard.Module1.Main?language=Basic&location=application"

Objector 32A
ふーむ。

Hypothesizer 7
もしも、ランタイムエラーが発生していわゆるキャッチが行なわれなかったら、IDEが自動的に起動してエラーを表示します。


6: Officeインスタンスが一部ソースファイルを上書きするのをどのように防ぐか


Hypothesizer 7
実のところ、Officeインスタンスは一部のソースファイルを勝手に上書きしようとします、それらのファイルを保存するように私たちが全然依頼しなくても。

Objector 32A
ああ。Basic IDEがなぜ最低かの理由を1つ言い忘れてたよ。

Hypothesizer 7
...えーと、それは致命的な問題ではありませんが、1つ煩わしいのは、Basic IDEが不必要に'''および '"'をエスケープすることであり、それは私には嬉しくありません。

Objector 32A
頼まれもしないのにIDEがファイルを強制的に保存するなんて狂ってる。

Hypothesizer 7
私がLinuxで取る回避策は、ソースファイル群の所有者を別のユーザーに変更し、書き込み権限をOfficeインスタンスユーザーから剥奪し、ソースファイルはその別のユーザーで編集するようにすることです。

Objector 32A
ああ、それをしなけりゃならんか...

Hypothesizer 7
それは、特に難しくはありません、'chown'、'chmod'、'su'を使うだけですから。

Officeインスタンスは、シャットダウンする際にIOエラーをいくつか出しますが、それらを私はただ無視します。

Objector 32B
Windowsはどうなるんだ?

Hypothesizer 7
正直なところ、まだ試していません。課題は、エディターをどのように別ユーザーで実行するかでしょう。


7: 結びとその先


Hypothesizer 7
Basic IDEはとても扱い難くないとは言えません。代わりに好みのテキストエディターを使用するほうが良いかもしれません。

モジュールをコンパイルするにはIDEを使用する必要がありますが、コンパイルを自動化するいくつかのプログラムを私が作成いたしました。それらのプログラムは変更されたモジュールをリロードするのにも役立ちます。

サブルーチンはOfficeインスタンスの外から容易に呼び出すことができます、しかし、引数を持ったファンクションを呼び出すにはいくらかのプログラミングが必要になり、それは、以後の記事で論じられます。


参考資料


<このシリーズの前の記事 | このシリーズの目次 | このシリーズの次の記事>