自作IMEパッチ(24.5)
Table of Contents
概要
IMEパッチを元に、最低限の内容のみEmacs 24.5に適用する作業をしてみようとしたが、結局できていない。
要件
- (Must)モードラインにIME状態表示をする
- (Better)IME有効時にコマンド入力の挙動(できないようにする or 自動無効化)
作業
clone
サーバーにベアリポジトリが作成してある
$ git clone ssh://wurly@server/var/git/my_emacs.git
ソースの追加
24.5 のソース (emacs-24.5.tar.gz) を展開したものを addし、commit
ブランチ(rzl24ozi_ime)での作業
ブランチの作成
$ git branch rzl24ozi_ime
ブランチへ切り替え
$ git checkout rzl24ozi_ime Switched to branch 'rzl24ozi_ime'
パッチをあてる
$ patch -p0 < emacs-24.5-w32-ime.diff
コミット
- TortoiseGit で作業
- なんと、TortoiseGit ではステージという概念がないようだ。
ブランチ(wurly_ime)での作業
ブランチの作成
- Tortoiseでやってみる
- なるほど、コマンドでやってみた後に見てみるとよくわかる
- 基点を選択できるのは便利かも
ブランチを切り替える
- わかってしまえば、作成、切り替えと同時にやってしまえばいいわけだが。
rzl24ozi_ime のマージ
- やりたいことは、rzl24ozi_ime の内容を、ワーク上に反映させ、必要な変更のみ、このブランチにコミットしたい
- いろいろオプションがあるが、「コミットしない」のみチェックしてマージしてみる
- あれ?ワーク上で「変更をチェック」を行っても、差分は何もなく、リビジョングラフも rzl24ozi_ime と同じところを指している
- svnの感覚だと訳がわからず面喰ってしまった。
- Pro Git は読んでいたものの、しっかり理解できていなかった。これが fast-forward(早送り)というものなのだ。
- このケースで言うと、変更内容が全て同じなので、マージは早送り(ポインタを移動して)のみになる
- やりたいことと違っているので、作業を戻したい
- ブランチを削除して新たにブランチを作成しても同じことだが、戻す方法を勉強する
- まずは、ログを見てみる。
- これまた、wurly_ime と rzl24ozi_ime は全く同じものとして扱われてしまう
- 調べてみると、log とは別に 作業の一時履歴である reflog というものがある。Tortoiseからは「Reflogを表示」で参照することができる。
- ここまでの私の理解は、下記の通り。
- svnは、構成の歴史と作業の歴史は同一であり、「基本的に歴史は変えられない。全ての歴史はlogに残る」
- Gitでは、構成上の歴史と作業の歴史は別であり、「構成上の歴史は変えられる。構成上の歴史を変えるとlogも変わる。作業の歴史はreflogに残る」
- 下記のようにやるのかと思ったら・・・そうではないらしい。
- これをやるとワークに逆マージがかかり、変更ありの状態になる。(やっぱりよくわからない)
- reglogから「ここへリセット」してみる。
- リセットの種類は、Hardかと思ったが、デフォルトのMixedにしてみる
- やはりHardで合っていた。Mixedだと、ワークが変更有りの状態になる。この変更を元に戻せば、Hardと同等になる。
- reflogを確認してみる。ブランチの基点を指すようになっている。
- やっと少しわかってきたような気がする
- gitの「ブランチ」は、枝の分岐を指示し、今どこに着目しているかを指すもので、その状態で何かを行うと枝は勝手に伸びる。(枝自体はHashとして特定される)
- 伸びた枝自体はそのままで、「ブランチ」はどこにでも移動可能。
- 「ブランチ」を使って、特定の複数の枝に着目して「マージ」「リベース」という作業を行うことで、新たな枝が伸びる。
- 指示の仕方にもよるが(Fast-Fowardとか)、場合によっては、新たな枝は伸びず、「ブランチ」の位置が移動する場合がある
- やっと、本ブランチでやりたかったことに戻る
再度マージ
git.exe merge --no-ff --no-commit rzl24ozi_ime
- emacs-24.5\configure.ac
- w32-ime,reconversion,documentfeed, USE_W32_IME,RECONVERSION,DOCUMENTFEED の定義関連なので一旦不要
- emacs-24.5\lisp\international\w32-ime.el
- 必要
- emacs-24.5\lisp\language\japan-util.el
- setup-japanese-environment-internal() で cygwin のケアをしている
- 無くてよさそう(あっても影響は無さそうだが)
- emacs-24.5\lisp\loadup.el
- international/w32-ime を読み込む指定をしているので、必要
- emacs-24.5\lisp\startup.el
- (set-language-environment "japanese") をやっている。入れておく
- emacs-24.5\src\frame.c
- ifdef USE_W32_IME切り分けにて、frame_parm_table frame_parms[] に "ime-font" を追加している。不要
- emacs-24.5\src\frame.h
- ifdef USE_W32_IME切り分けにて、Qime_font を追加している。不要
- emacs-24.5\src\keyboard.c
- 主に read_key_sequence() 内で条件によって Fime_force_off やら Fime_force_on をやっている。必要な気もするが一旦不要
- emacs-24.5\src\lisp.mk
- lisp\international\w32-ime.el を追加しているので必要
- emacs-24.5\src\w32fns.c
- たぶん、ここがキモの部分。後回し
- emacs-24.5\src\w32font.c
- ifdef USE_W32_IME切り分けにて、fill_in_logfont() をグローバル関数化している(static宣言を削除)。不要。
- emacs-24.5\src\w32font.h
- .cと同じ
- emacs-24.5\src\w32term.c
- なんか必要そう。後回し
- emacs-24.5\src\w32term.h
- なんか必要そう。後回し
- emacs-24.5\src\window.c
- わからないが不要なのではないか。
- emacs-24.5\src\xdisp.c
- prepare_menu_bars() の処理の置き換えをやっている。不要なのではないか
- 一旦残ったもの
- emacs-24.5\lisp\international\w32-ime.el
- emacs-24.5\lisp\loadup.el
- emacs-24.5\lisp\startup.el
- emacs-24.5\src\lisp.mk
- emacs-24.5\src\w32fns.c
- emacs-24.5\src\w32term.c
- emacs-24.5\src\w32term.h
別作業
- 試しに、IMEパッチ無しemacsで、w32-ime.el を読み込んでみる
(when (locate-library "w32-ime") (progn (require 'w32-ime) (w32-ime-initialize) (setq default-input-method "W32-IME") (setq-default w32-ime-mode-line-state-indicator "[--]") (setq w32-ime-mode-line-state-indicator-list '("[--]" "[あ]" "[--]")) ))
- この場合にemacs起動時に表示されるメッセージがこれ
Symbol's function definition is void: ime-get-mode
- この定義は w32fns.c にもある
- IMEパッチでは、w32-ime.el から使用される関数を Cソースに埋め込んでいるようだ。
- とりあえず、w32-ime.el と w32fns.c の両方に含まれる関数らしきものをピックアップしてみる
- 基準は w32-ime- がprefixに付くもの
ime-get-mode w32-ime-buffer-switch-p w32-set-ime-mode w32-ime-register-word-dialog
別のアプローチ
- w32fns.c の #ifdef USE_W32_IME 切り分けされている部分で DEFUN() されているもの
- "ime-force-on"
- "ime-force-off"
- "ime-get-mode"
- "w32-set-ime-mode"
- "w32-ime-register-word-dialog"
- "ime-get-property"
- "w32-ime-perform-reconversion"
- これは一旦置いておいて
- ifdefの切り分けがわかりにくいので変更。パッチをデフォルトで有効になるようにする
パターンを置き換える
#ifdef USE_W32_IME #endif /* USE_W32_IME */ #ifndef DISABLE_W32_IME #endif /* !DISABLE_W32_IME */
#ifndef USE_W32_IME #endif /* !USE_W32_IME */ #ifdef DISABLE_W32_IME #endif /* DISABLE_W32_IME */
- これでコミット
- デフォルトのコミットメッセージは、あくまで、rzl24ozi_ime を wurly_ime にマージしたものとして出る。
Merge branch 'rzl24ozi_ime' into wurly_ime
- リビジョングラフも若干イメージは違うのだが・・・
- ただ、ログメッセージはあまり違和感は無い
ビルド
MSYS2 シェルから実行する
$ export MSYSTEM=MINGW32 $ export PKG_CONFIG_PATH=/mingw32/lib/pkgconfig
$ ./configure CFLAGS="-O2 -shared-libgcc" --without-dbus
$ make [ -r "src/config.in" ] || ( cd . && autoheader ) cd nt && make all \ CC='gcc -std=gnu99' CFLAGS='-O2 -shared-libgcc' CPPFLAGS='-mtune=pentium4 -DUSE_CRT_DLL=1 -I /d/home/wurly/git/my_emacs/emacs-24.5/nt/inc' \ LDFLAGS='' MAKE='make' make[1]: ディレクトリ '/d/home/wurly/git/my_emacs/emacs-24.5/nt' に入ります make[1]: 'all' に対して行うべき事はありません. make[1]: ディレクトリ '/d/home/wurly/git/my_emacs/emacs-24.5/nt' から出ます cd lib && make all \ CC='gcc -std=gnu99' CFLAGS='-O2 -shared-libgcc' CPPFLAGS='-mtune=pentium4 -DUSE_CRT_DLL=1 -I /d/home/wurly/git/my_emacs/emacs-24.5/nt/inc' \ LDFLAGS='' MAKE='make' make[1]: ディレクトリ '/d/home/wurly/git/my_emacs/emacs-24.5/lib' に入ります make all-am make[2]: ディレクトリ '/d/home/wurly/git/my_emacs/emacs-24.5/lib' に入ります make[2]: 'all-am' に対して行うべき事はありません. make[2]: ディレクトリ '/d/home/wurly/git/my_emacs/emacs-24.5/lib' から出ます make[1]: ディレクトリ '/d/home/wurly/git/my_emacs/emacs-24.5/lib' から出ます cd lib-src && make all \ CC='gcc -std=gnu99' CFLAGS='-O2 -shared-libgcc' CPPFLAGS='-mtune=pentium4 -DUSE_CRT_DLL=1 -I /d/home/wurly/git/my_emacs/emacs-24.5/nt/inc' \ LDFLAGS='' MAKE='make' make[1]: ディレクトリ '/d/home/wurly/git/my_emacs/emacs-24.5/lib-src' に入ります make[1]: 'all' に対して行うべき事はありません. make[1]: ディレクトリ '/d/home/wurly/git/my_emacs/emacs-24.5/lib-src' から出ます dirstate='.git/logs/HEAD'; \ vcswitness='$(srcdir)/../'$dirstate; \ [ -r "./$dirstate" ] || vcswitness=''; \ cd src || exit; \ boot=bootstrap-emacs.exe; \ [ ! -x "$boot" ] || boot=''; \ make all \ CC='gcc -std=gnu99' CFLAGS='-O2 -shared-libgcc' CPPFLAGS='-mtune=pentium4 -DUSE_CRT_DLL=1 -I /d/home/wurly/git/my_emacs/emacs-24.5/nt/inc' \ LDFLAGS='' MAKE='make' BOOTSTRAPEMACS="$boot" \ VCSWITNESS="$vcswitness" make[1]: ディレクトリ '/d/home/wurly/git/my_emacs/emacs-24.5/src' に入ります gcc -std=gnu99 -Demacs -I. -I. -I../lib -I./../lib -mtune=pentium4 -pthread -mms-bitfields -I/mingw32/include/librsvg-2.0 -I/mingw32/include/gdk-pixbuf-2.0 -I/mingw32/include/libpng16 -I/mingw32/include/cairo -I/mingw32/include/glib-2.0 -I/mingw32/lib/glib-2.0/include -I/mingw32/include/pixman-1 -I/mingw32/include -I/mingw32/include/freetype2 -I/mingw32/include -I/mingw32/include/libpng16 -I/mingw32/include/harfbuzz -I/mingw32/include -I/mingw32/include/freetype2 -I/mingw32/include -I/mingw32/include/harfbuzz -I/mingw32/include/libpng16 -I/mingw32/include/libxml2 -MMD -MF deps/.d -MP -I/mingw32/include -I/mingw32/include/p11-kit-1 -I/mingw32/include -O2 -shared-libgcc -Wl,-stack,0x00800000 -Wl,-heap,0x00100000 -Wl,-image-base,0x01000000 -Wl,-entry,__start -Wl,-Map,./temacs.map \ -o temacs firstfile.o vm-limit.o dispnew.o frame.o scroll.o xdisp.o menu.o window.o charset.o coding.o category.o ccl.o character.o chartab.o bidi.o term.o terminal.o xfaces.o emacs.o keyboard.o macros.o keymap.o sysdep.o buffer.o filelock.o insdel.o marker.o minibuf.o fileio.o dired.o cmds.o casetab.o casefiddle.o indent.o search.o regex.o undo.o alloc.o data.o doc.o editfns.o callint.o eval.o floatfns.o fns.o font.o print.o lread.o syntax.o unexw32.o bytecode.o process.o gnutls.o callproc.o region-cache.o sound.o atimer.o doprnt.o intervals.o textprop.o composite.o xml.o w32notify.o profiler.o decompress.o w32fns.o w32menu.o w32reg.o w32font.o w32term.o w32xfns.o w32select.o w32uniscribe.o w32.o w32console.o w32heap.o w32inevt.o w32proc.o fontset.o fringe.o image.o tparam.o gmalloc.o ralloc.o lastfile.o ../lib/libgnu.a emacs.res -lwinmm -lgdi32 -lcomdlg32 -lmpr -lwinspool -lole32 -lcomctl32 -lusp10 w32fns.o:w32fns.c:(.text+0x5739): undefined reference to `fill_in_logfont' collect2.exe: error: ld returned 1 exit status Makefile:665: ターゲット 'temacs.exe' のレシピで失敗しました make[1]: *** [temacs.exe] エラー 1 make[1]: ディレクトリ '/d/home/wurly/git/my_emacs/emacs-24.5/src' から出ます Makefile:387: ターゲット 'src' のレシピで失敗しました make: *** [src] エラー 2
- w32font.c,w32font.h にて、fill_in_logfont() をグローバル関数化
リモート
git remote -v
wurly@client MINGW32 ~/git/my_emacs/emacs-24.5 (wurly_ime) $ git remote -v origin ssh://wurly@server/var/git/my_emacs.git (fetch) origin ssh://wurly@server/var/git/my_emacs.git (push)
git remote show
- HEAD branch は unknown となっている
#+BEGIN_EXAMPLE wurly@client MINGW32 ~/git/my_emacs/emacs-24.5 (wurly_ime) $ git remote show origin wurly@server's password:
remote origin
Fetch URL: ssh://wurly@server/var/git/my_emacs.git Push URL: ssh://wurly@server/var/git/my_emacs.git HEAD branch: (unknown) Local branch configured for 'git pull': master merges with remote master #+END_EXAMPLE
git push
wurly@client MINGW32 ~/git/my_emacs/emacs-24.5 (wurly_ime) $ git push origin master wurly@server's password: Counting objects: 5053, done. Delta compression using up to 2 threads. Compressing objects: 100% (5024/5024), done. Writing objects: 100% (5053/5053), 57.96 MiB | 2.13 MiB/s, done. Total 5053 (delta 289), reused 0 (delta 0) To ssh://wurly@server/var/git/my_emacs.git * [new branch] master -> master
git remote show
- HEAD branch は master となっている
#+BEGIN_EXAMPLE wurly@client MINGW32 ~/git/my_emacs/emacs-24.5 (wurly_ime) $ git remote show origin wurly@server's password:
remote origin
Fetch URL: ssh://wurly@server/var/git/my_emacs.git Push URL: ssh://wurly@server/var/git/my_emacs.git HEAD branch: master Remote branch: master tracked Local branch configured for 'git pull': master merges with remote master Local ref configured for 'git push': master pushes to master (up to date) #+END_EXAMPLE
一旦masterに切り替え
- Totoiseの「切り替え」から master へ切り替え
リビジョングラフはこうなる
wurly_ime2 ブランチ
またブランチ作成
- wurly_ime2 を作成し、切り替え
- ビルドによって変更されたファイル(lisp以下)を元に戻す
wurly_ime をマージ
- ファストフォワードする、コミットする
wurly_ime3 ブランチ
またブランチ作成
- wurly_ime3 を作成し、切り替え
wurly_ime をマージ
- ファストフォワードしない、コミットする
リビジョングラフ
こうなる。
結局、wurly_ime と wurly_ime2は同義
wurly_ime3は意味合いが異なる
ブランチの削除
wurly@server MINGW32 ~/git/my_emacs (wurly_ime3) $ git branch -d wurly_ime Deleted branch wurly_ime (was e4e03e8).
wulry_ime4 ブランチ
masterを元にブランチを作成しする
wurly_ime3を 融合(squash)をチェックしてマージ
融合の場合は、「コミットしない」をチェックせずとも、コミットはされないようだ。 これをコミットする。
このように、融合の場合は、マージ元と無関係の扱いとなる。