最終更新日: 2016-09-24 土 16:50
ホーム | 文書トップ | 目次

自作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

my_emacs01.png

ブランチへ切り替え

$ git checkout rzl24ozi_ime
Switched to branch 'rzl24ozi_ime'

my_emacs02.png

パッチをあてる

$ patch -p0 < emacs-24.5-w32-ime.diff

コミット

  • TortoiseGit で作業
  • なんと、TortoiseGit ではステージという概念がないようだ。

my_emacs03.png

ブランチ(wurly_ime)での作業

ブランチの作成

  • Tortoiseでやってみる
  • なるほど、コマンドでやってみた後に見てみるとよくわかる
    • 基点を選択できるのは便利かも

my_emacs04.png

ブランチを切り替える

  • わかってしまえば、作成、切り替えと同時にやってしまえばいいわけだが。

my_emacs05.png

rzl24ozi_ime のマージ

  • やりたいことは、rzl24ozi_ime の内容を、ワーク上に反映させ、必要な変更のみ、このブランチにコミットしたい
  • いろいろオプションがあるが、「コミットしない」のみチェックしてマージしてみる

my_emacs06.png

  • あれ?ワーク上で「変更をチェック」を行っても、差分は何もなく、リビジョングラフも rzl24ozi_ime と同じところを指している
  • svnの感覚だと訳がわからず面喰ってしまった。

my_emacs07.png  

  • Pro Git は読んでいたものの、しっかり理解できていなかった。これが fast-forward(早送り)というものなのだ。
    • このケースで言うと、変更内容が全て同じなので、マージは早送り(ポインタを移動して)のみになる
  • やりたいことと違っているので、作業を戻したい
    • ブランチを削除して新たにブランチを作成しても同じことだが、戻す方法を勉強する
  • まずは、ログを見てみる。
  • これまた、wurly_ime と rzl24ozi_ime は全く同じものとして扱われてしまう

my_emacs08.png

  • 調べてみると、log とは別に 作業の一時履歴である reflog というものがある。Tortoiseからは「Reflogを表示」で参照することができる。
  • ここまでの私の理解は、下記の通り。
    • svnは、構成の歴史と作業の歴史は同一であり、「基本的に歴史は変えられない。全ての歴史はlogに残る」
    • Gitでは、構成上の歴史と作業の歴史は別であり、「構成上の歴史は変えられる。構成上の歴史を変えるとlogも変わる。作業の歴史はreflogに残る」

my_emacs09.png

  • 下記のようにやるのかと思ったら・・・そうではないらしい。
    • これをやるとワークに逆マージがかかり、変更ありの状態になる。(やっぱりよくわからない)

my_emacs10.png

  • reglogから「ここへリセット」してみる。
  • リセットの種類は、Hardかと思ったが、デフォルトのMixedにしてみる

my_emacs11.png

  • やはりHardで合っていた。Mixedだと、ワークが変更有りの状態になる。この変更を元に戻せば、Hardと同等になる。
  • reflogを確認してみる。ブランチの基点を指すようになっている。

my_emacs12.png

  • やっと少しわかってきたような気がする
  • gitの「ブランチ」は、枝の分岐を指示し、今どこに着目しているかを指すもので、その状態で何かを行うと枝は勝手に伸びる。(枝自体はHashとして特定される)
  • 伸びた枝自体はそのままで、「ブランチ」はどこにでも移動可能。
  • 「ブランチ」を使って、特定の複数の枝に着目して「マージ」「リベース」という作業を行うことで、新たな枝が伸びる。
  • 指示の仕方にもよるが(Fast-Fowardとか)、場合によっては、新たな枝は伸びず、「ブランチ」の位置が移動する場合がある
  • やっと、本ブランチでやりたかったことに戻る

再度マージ

my_emacs13.png

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
  • リビジョングラフも若干イメージは違うのだが・・・

my_emacs14.png

  • ただ、ログメッセージはあまり違和感は無い

my_emacs15.png

ビルド

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 へ切り替え

リビジョングラフはこうなる

my_emacs16.png

wurly_ime2 ブランチ

またブランチ作成

  • wurly_ime2 を作成し、切り替え
  • ビルドによって変更されたファイル(lisp以下)を元に戻す

wurly_ime をマージ

  • ファストフォワードする、コミットする

wurly_ime3 ブランチ

またブランチ作成

  • wurly_ime3 を作成し、切り替え

wurly_ime をマージ

  • ファストフォワードしない、コミットする

リビジョングラフ

こうなる。

結局、wurly_ime と wurly_ime2は同義

wurly_ime3は意味合いが異なる

my_emacs17.png

ブランチの削除

wurly@server MINGW32 ~/git/my_emacs (wurly_ime3)
$ git branch -d wurly_ime
Deleted branch wurly_ime (was e4e03e8).

my_emacs18.png

wulry_ime4 ブランチ

masterを元にブランチを作成しする

wurly_ime3を 融合(squash)をチェックしてマージ

my_emacs20.png

融合の場合は、「コミットしない」をチェックせずとも、コミットはされないようだ。 これをコミットする。

my_emacs19.png

my_emacs21.png

このように、融合の場合は、マージ元と無関係の扱いとなる。

ホーム | 文書トップ | 目次
Created by Emacs 25.2.1 (Org mode 8.2.10)