LibreOfficeCalcに関数候補表示機能を付けるまで 第1回 目的の設定と準備

#はじめに
LibreOffice Calcの関数補完機能が弱すぎてつらいので、強くした。というお話。

##どうよわいのか
Google Spreadsheetがこれ。
![google_spr.png](https://qiita-image-store.s3.amazonaws.com/0/100640/b58f510e-a2cd-dcb1-8586-6bd1da4cc8ab.png)

Microsoft Excelがこれ。
![excel.png](https://qiita-image-store.s3.amazonaws.com/0/100640/df7dc389-0f69-d138-c06f-c89dc45542cd.png)

で、LibreOffice Calcがこれ。
![Screenshot from 2015-11-24 17:27:48.png](https://qiita-image-store.s3.amazonaws.com/0/100640/71680256-d399-23a1-60d9-b6b08ea8a503.png)


差は一目瞭然である。関数候補がない。関数の説明もない。あるのはただ第一候補のみ。いっそすがすがしいけれど、でも正直不便極まりない。
##やったこと
なので、これをこうした。
![Screenshot from 2015-11-24 17:32:54.png](https://qiita-image-store.s3.amazonaws.com/0/100640/f186a5df-20f6-5863-0086-c29da1c90820.png)



関数候補機能を追加。関数の説明も追加。Ctrl+Tabで次の関数候補に移動。Enterで決定。
ほんとはドロップリスト形式にしたかったけど、難しそうだし面倒だから挑戦しなかった。

#ビルド環境の準備
##環境
今回改造手術を受けたのは、LibreOffice-4.4.5.2。最新版のLO5ではなく、安定版を選んだ（最新版を選んで、もし自分で試行錯誤してるうちにアップデートで関数候補表示機能がついてしまったら非常に萎えるので）。OSはUbuntu 14.04。

##ダウンロード～コンパイルまで
まずは、[ソースコードをダウンロードする](https://ja.libreoffice.org/download/libreoffice-stable/)。libreoffice-4.4.5.2.tar.xzをダウンロードして、展開。

```sh:shell
$ 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がわめき出すので、

```sh:shell
$ cd bin
$ chmod +x unpack-sources
$ cd ../
$ make # めちゃくちゃ長い
```
としてあげるとおとなしくなってくれる。

##emacs上のデバッガで動かせるようになるまで
その後待つこと4時間半、やっと`make`が終わったら、次はいまコンパイルしたファイルをgdbで実行できるようにする。私は最近Emacs信者になったので、できればEmacs上のgdbで実行できるようにしたい…が、gdbで実行してもなぜかデバッグシンボルがないと言われてしまい、gdbで追うことが出来ない。

```sh:gud-gdb
(gdb) b main
No symbol table is loaded.  Use the "file" command.
Breakpoint 1 (main) pending.
```
ところが、こうするとshell上でgdbが起動し、デバッグできる。

```sh:shell
$ make debugrun
```
そこで、この`make`に-nを付けて、結局中でどんな命令を読んでるのかを調べてみる。

```sh:shell
~/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を取り除いて実行してみることに。

```sh:shell
$ 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}
```

```sh:mytmpfile.tmp
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で起動する。

```sh:minibuffer
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に関数候補表示機能を付けるまで

- [第1回：目的の設定と準備](http://qiita.com/KRiver1/items/2188d71d316a28ad23ac)
- [第2回：デバッガでメインループを探す](http://qiita.com/KRiver1/items/1f93efcf47d2146c78b8)
- [第3回：メインループと全探索](http://qiita.com/KRiver1/items/d7ab9614d5bbd409c541)
- [第4回：フォルダ名でアタリを付ける](http://qiita.com/KRiver1/items/3531679de3c262332de7)
- [第5回：関数候補の集合を返す](http://qiita.com/KRiver1/items/08ef4586866833048805)
- [第6回：関数候補・説明表示機能を実装する](http://qiita.com/KRiver1/items/c33d62f4bcc73e76b359)
- [第7回：LibreOfficeにコミットしてみる](http://qiita.com/KRiver1/items/7aba2a32cc42672c105d)