LibreOfficeCalc에 기능 후보 표시 기능을 붙일 때까지 제1회 목적의 설정과 준비

소개



LibreOffice Calc의 함수 보완 기능이 너무 약해서 힘들기 때문에 강하게 했다. 라는 이야기.

어때?



Google Spreadsheet이 이것.


Microsoft Excel이 이것.


그래서 LibreOffice Calc가 이것.


차이는 일목요연하다. 함수 후보가 없다. 함수 설명도 없다. 있는 것은 단지 제1 후보만. 차라리 멋지지만, 하지만 솔직히 불편할 정도는 아니다.

했던 일



그래서 이것을 이런.


기능 후보 기능을 추가. 함수 설명도 추가. Ctrl+Tab에서 다음 함수 후보로 이동. Enter로 결정.
정말 드롭리스트 형식으로 하고 싶었지만, 어려울 것 같고 귀찮기 때문에 도전하지 않았다.

빌드 환경 준비



환경



이번 개조 수술을 받은 것은 LibreOffice-4.4.5.2. 최신판의 LO5가 아니라, 안정판을 선택했다(최신판을 선택해, 만약 스스로 시행착오하고 있는 동안에 업데이트로 함수 후보 표시 기능이 붙어 버리면 매우 위장하기 때문에). OS는 우분투 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
$ cd bin
$ chmod +x unpack-sources
$ cd ../
$ make # めちゃくちゃ長い

라고 주면 친절해 준다.

emacs의 디버거에서 실행할 수 있을 때까지



그 후 기다리는 것 4시간 반, 겨우 make 가 끝나면, 다음은 지금 컴파일한 파일을 gdb로 실행할 수 있도록 한다. 나는 최근에 Emacs 신자가 되었기 때문에, 가능하면 Emacs상의 gdb로 실행할 수 있도록 하고 싶다…하지만, gdb로 실행해도 왠지 디버그 심볼이 없다고 말해져, gdb로 쫓을 수 없다.

gud-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}

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로 기동한다.

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회: 목적의 설정과 준비
  • 제2회:디버거로 메인 루프를 찾는다
  • 제3회:메인 루프와 전체 탐색
  • 제4회:폴더명으로 아타리를 붙인다
  • 제5회: 함수 후보의 집합을 돌려준다
  • 제6회:함수 후보·설명 표시 기능을 실장한다
  • 제7회:LibreOffice에 커밋해 보기
  • 좋은 웹페이지 즐겨찾기