#はじめに
LibreOffice Calcの関数補完機能が弱すぎてつらいので、強くした。というお話。
##どうよわいのか
Google Spreadsheetがこれ。
差は一目瞭然である。関数候補がない。関数の説明もない。あるのはただ第一候補のみ。いっそすがすがしいけれど、でも正直不便極まりない。
##やったこと
なので、これをこうした。
関数候補機能を追加。関数の説明も追加。Ctrl+Tabで次の関数候補に移動。Enterで決定。
ほんとはドロップリスト形式にしたかったけど、難しそうだし面倒だから挑戦しなかった。
#ビルド環境の準備
##環境
今回改造手術を受けたのは、LibreOffice-4.4.5.2。最新版のLO5ではなく、安定版を選んだ(最新版を選んで、もし自分で試行錯誤してるうちにアップデートで関数候補表示機能がついてしまったら非常に萎えるので)。OSはUbuntu 14.04。
##ダウンロード~コンパイルまで
まずは、ソースコードをダウンロードする。libreoffice-4.4.5.2.tar.xzをダウンロードして、展開。
$ cd Downloads
$ tar xvf libreoffice-4.4.5.2.tar.xz # 解凍
$ cd libreoffice-4.4.5.2
$ sudo apt-get build-dep libreoffice
$ ./autogen.sh --with-lang="ja" --enable-dbgutil
$ make # めちゃくちゃ長い上に途中でエラーが出る
--enable-dbgutil
をつけると、いい感じに全部デバッグシンボルを付けてコンパイルしてくれるらしい。自分でCFLAGS="-O0 -g"
とかやるより安全。というか1回それで痛い目を見た(CXXFLAGS="-O0 -g"
を付け忘れてmakeをやり直す羽目になった)。
make
を実行すると、しばらくしてから「実行権限がない」などとMakeがわめき出すので、
$ cd bin
$ chmod +x unpack-sources
$ cd ../
$ make # めちゃくちゃ長い
としてあげるとおとなしくなってくれる。
##emacs上のデバッガで動かせるようになるまで
その後待つこと4時間半、やっとmake
が終わったら、次はいまコンパイルしたファイルをgdbで実行できるようにする。私は最近Emacs信者になったので、できればEmacs上のgdbで実行できるようにしたい…が、gdbで実行してもなぜかデバッグシンボルがないと言われてしまい、gdbで追うことが出来ない。
(gdb) b main
No symbol table is loaded. Use the "file" command.
Breakpoint 1 (main) pending.
ところが、こうするとshell上でgdbが起動し、デバッグできる。
$ make debugrun
そこで、このmake
に-nを付けて、結局中でどんな命令を読んでるのかを調べてみる。
~/libreoffice-4.4.5.2$ make debugrun -n
mkdir -p libreoffice-4.4.5.2/instdir
libreoffice-4.4.5.2/solenv/bin/install-gdb-printers -a libreoffice-4.4.5.2/instdir -c
make -j 8 -rs -f libreoffice-4.4.5.2/Makefile.gbuild debugrun
OFFICESCRIPT=`mktemp` && printf 'if [ -e libreoffice-4.4.5.2/instdir/program/ooenv ]; then . libreoffice-4.4.5.2/instdir/program/ooenv; fi\n' > ${OFFICESCRIPT} && printf "gdb libreoffice-4.4.5.2/instdir/program/soffice.bin" >> ${OFFICESCRIPT} && printf " -ex \"set args --norestore --nologo '--accept=pipe,name=username;urp;' \"" >> ${OFFICESCRIPT} && /bin/sh ${OFFICESCRIPT} && rm ${OFFICESCRIPT}
変数OFFICESCRIPTに一時ファイルパスを入れて、そこにいろいろ書き込んでそのファイルを最後に削除してる。ので、最後のrmを取り除いて実行してみることに。
$ OFFICESCRIPT=`mytmpfile.tmp` && printf 'if [ -e libreoffice-4.4.5.2/instdir/program/ooenv ]; then . libreoffice-4.4.5.2/instdir/program/ooenv; fi\n' > ${OFFICESCRIPT} && printf "gdb libreoffice-4.4.5.2/instdir/program/soffice.bin" >> ${OFFICESCRIPT} && printf " -ex \"set args --norestore --nologo '--accept=pipe,name=username;urp;' \"" >> ${OFFICESCRIPT} && /bin/sh ${OFFICESCRIPT}
if [ -e libreoffice-4.4.5.2/instdir/program/ooenv ]; then . libreoffice-4.4.5.2/instdir/program/ooenv; fi
gdb libreoffice-4.4.5.2/instdir/program/soffice.bin -ex "set args --norestore --nologo '--accept=pipe,name=username;urp;' "
前半は関係なさそうなので、後半の部分をgud-gdbで起動する。
Run gud-gdb (like this): gdb --fullname libreoffice-4.4.5.2/instdir/program/soffice.bin -ex "set args --norestore --nologo '--accept=pipe,name=username;urp;' "
これでうまくデバッグできるようになった。
#次回予告
やっとgdbが使えるようになった。ので、次回からLibreOfficeのプログラムがどう動いてるのかを見ていくことにする。
#リンク
##LibreOfficeCalcに関数候補表示機能を付けるまで