emacs for Windows
Table of Contents
dict of skk
前回の続きでSKKのinfoを見ている。そしたら辞書の読み込みでemacsが肥大し ないようにする方法が出ていた。曰く、DBにしちゃうとな。その為にはツー ルを使用して、変換するらしい。
SKK 辞書のメンテナンスツールの中のskk2cdb.pyを使う事になる。
2to3
指示に従がって実行。
sakae@deb:/tmp/t$ ./skk2cdb.py SKK-JISYO.L.cdb SKK-JISYO.L File "/tmp/t/./skk2cdb.py", line 22 def cdbhash(s, n=0L): ^ SyntaxError: invalid syntax
エラーになるような奴が公開されてるはずはなかろう。旧式のやつだな。変換 器械が有るはずなんだけどはいっていない。Python3/Tools/scriptに有るそう なので、取り寄せ。
sakae@deb:/tmp/t$ cat 2to3 #!/usr/bin/env python import sys from lib2to3.main import main sys.exit(main("lib2to3.fixes"))
3用に書き換え。
sakae@deb:/tmp/t$ ./2to3 -w skk2cdb.py RefactoringTool: Skipping optional fixer: buffer RefactoringTool: Skipping optional fixer: idioms :
python3で実行するぞ。
sakae@deb:/tmp/t$ ./skk2cdb.py SKK-JISYO.L.cdb SKK-JISYO.L Traceback (most recent call last): File "/tmp/t/./skk2cdb.py", line 312, in <module> if __name__ == '__main__': sys.exit(main(sys.argv)) File "/tmp/t/./skk2cdb.py", line 299, in main maker = CDBMaker(outfile, outfile+'.tmp') File "/tmp/t/./skk2cdb.py", line 163, in __init__ self._fp = file(tmpname, 'wb') NameError: name 'file' is not defined
どうもfileってコマンドはopenっぽいな。3箇所あるやつを変更したよ。
utf need
次なるエラーは何だろう。楽しみだな。
sakae@deb:/tmp/t$ ./skk2cdb.py SKK-JISYO.L.cdb SKK-JISYO.L Traceback (most recent call last): File "/tmp/t/./skk2cdb.py", line 312, in <module> if __name__ == '__main__': sys.exit(main(sys.argv)) File "/tmp/t/./skk2cdb.py", line 300, in main for line in fileinput.input(args): File "/usr/lib/python3.9/fileinput.py", line 249, in __next__ line = self._readline() File "/usr/lib/python3.9/fileinput.py", line 369, in _readline return self._readline() File "/usr/lib/python3.9/codecs.py", line 322, in decode (result, consumed) = self._buffer_decode(data, self.errors, final) UnicodeDecodeError: 'utf-8' codec can't decode byte 0xa4 in position 1366: invalid start byte
文字コードを確認、そして変換してあげる。
sakae@deb:/tmp/t$ nkf -g SKK-JISYO.L EUC-JP sakae@deb:/tmp/t$ nkf -w SKK-JISYO.L >UTF sakae@deb:/tmp/t$ ./skk2cdb.py SKK-JISYO.L.cdb UTF Traceback (most recent call last): File "/tmp/t/./skk2cdb.py", line 312, in <module> if __name__ == '__main__': sys.exit(main(sys.argv)) File "/tmp/t/./skk2cdb.py", line 308, in main maker.add(k, v) File "/tmp/t/./skk2cdb.py", line 182, in add self._fp.write(k) TypeError: a bytes-like object is required, not 'str'
まだエラーだわさ。もう、素直にpython2を入れた方がよかったかな。
by python2.7
python2.7を素直に入れる事にした。
sakae@deb:/tmp/z$ time python2.7 skk2cdb.py SKK-JISYO.L.cdb SKK-JISYO.L real 0m5.521s user 0m5.019s sys 0m0.488s sakae@deb:/tmp/z$ ls -l total 12560 -rwxr-xr-x 1 sakae sakae 6895 Jan 21 08:07 skk2cdb.py* -rw-r--r-- 1 sakae sakae 4489796 Jan 21 08:06 SKK-JISYO.L -rw-r--r-- 1 sakae sakae 8356670 Jan 21 08:10 SKK-JISYO.L.cdb
encoding
python2に逃げるのは楽だけど、ちゃんと元のファイルを使うにはどうするか? 避けて通れない問題だ。下記の様にするみたい。
import codecs fin = codecs.open('euc.txt', 'r', 'euc_jp') for line in fin: print(line.strip())
とか
with open('euc.txt', encoding='euc-jp') as f: s = f.read() print(s.strip())
こんな風に扱うようだ。慣れないと苦痛だな。で、修正してみたけど、やはり エラーだわさ。もう深いりは止めよう。
sakae@deb:/tmp/t$ python3 skk2cdb.py SKK-JISYO.L.cdb SKK-JISYO.L Traceback (most recent call last): File "/tmp/t/skk2cdb.py", line 312, in <module> if __name__ == '__main__': sys.exit(main(sys.argv)) File "/tmp/t/skk2cdb.py", line 300, in main for line in fileinput.input(args): File "/usr/lib/python3.9/fileinput.py", line 249, in __next__ line = self._readline() File "/usr/lib/python3.9/fileinput.py", line 369, in _readline return self._readline() File "/usr/lib/python3.9/codecs.py", line 322, in decode (result, consumed) = self._buffer_decode(data, self.errors, final) UnicodeDecodeError: 'utf-8' codec can't decode byte 0xa4 in position 1366: invalid start byte
効果測定
苦労して作成したんで、その効果を調べてみる。
環境 起動時 通常版 cdb版 ------------------------------------------------------ Windows10+emacs28.2 46100 55500 49800 OpenBSD+emacs28.2 26700 34212 28176 FreeBSD+emacs28.2 36784 51080 40000 Debian+emacs30.0.50 62504 74944 68888
それぞれの数値はメモリーの消費量(RSS) Windows環境はタスクマネージャー の数値だ。大丈夫ってのを変換した直後の値を確認した。
確かにcdb版はメモリーの消費が少ない。但し、cdbな辞書は、バイナリーなのが辛い。
改めてemacsのメモリー消費を 見ると、色々で面白いな。慎しいのはOpenBSD で、更に慎しいのはmgだ。メモリー消費量はemacsの1/10以下の2116である。勿論mgでは漢字変換なんて出来ないけど。
emacsclient for windows
WindowsでEmacsclientwを利用するための設定
普通に考えたらemacsは起動したままにしておくのが、正しい使い方、あれこ れ悩む必要はない。心配ったスリープを挟んでの動作も問題なし。
MSYS2
MSYS2 のインストールと,MINGW64 環境で動く …
(追記:2022-09-23)Emacs 28.2でNative Compileする 最終的には、これをやりたいのさ。
add mingw64
早速libgccjitに的を絞ってインストールしてみる。
sakae@atom MINGW64 ~ $ pacman -Sy mingw-w64-x86_64-libgccjit Packages (16) mingw-w64-x86_64-binutils-2.39-2 mingw-w64-x86_64-crt-git-10.0.0.r202.g4359b3570-1 mingw-w64-x86_64-gcc-12.2.0-9 mingw-w64-x86_64-gcc-libs-12.2.0-9 mingw-w64-x86_64-gmp-6.2.1-4 mingw-w64-x86_64-headers-git-10.0.0.r202.g4359b3570-1 mingw-w64-x86_64-isl-0.25-1 mingw-w64-x86_64-libiconv-1.17-1 mingw-w64-x86_64-libwinpthread-git-10.0.0.r202.g4359b3570-1 mingw-w64-x86_64-mpc-1.3.1-1 mingw-w64-x86_64-mpfr-4.2.0-1 mingw-w64-x86_64-windows-default-manifest-6.4-4 mingw-w64-x86_64-winpthreads-git-10.0.0.r202.g4359b3570-1 mingw-w64-x86_64-zlib-1.2.13-2 mingw-w64-x86_64-zstd-1.5.2-2 mingw-w64-x86_64-libgccjit-12.2.0-9 Total Download Size: 57.62 MiB Total Installed Size: 451.16 MiB
関係者も引き連れてインストールされた。調子に乗ってgdbもなんてやると、 pythonもやってきちゃうので注意。
$ gcc --version gcc.exe (Rev9, Built by MSYS2 project) 12.2.0 Copyright (C) 2022 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. sakae@atom MINGW64 ~ $ ls -lh /mingw64/lib/libgccjit* -rw-r--r-- 1 sakae なし 21M Jan 17 03:29 /mingw64/lib/libgccjit.dll.a
emacs jit for windows
一番イージーな方法で、ネィティブコンパイル出来る様にしてみる。下記のよ うなバッチファイルを作成。unixでも、よくやる手だ。
set PATH=c:/msys64/mingw64/bin;%PATH% c:/app/emacs-28.2/bin/runemacs.exe
これをタスクバーに登録したい。が、そんな事は可能か? 迷わずにググレ。
ついでにアイコンもemacsにしといた。起動時に一瞬ターミナル画面が表示さ れるけど、それは愛嬌って事で許せ。
ちゃんとネイティブになってるか、確認しとく。
sakae@atom:/mnt/c/Users/sakae/AppData/Roaming/.emacs.d$ ls -ltr eln-cache/* | tail -5 -rwxrwxrwx 1 sakae sakae 401346 Jan 25 15:05 skk-annotation-1fc2a2a8-4571f229.eln* -rwxrwxrwx 1 sakae sakae 552244 Jan 25 15:05 compile-91e1c2a0-b7ea4aad.eln* -rwxrwxrwx 1 sakae sakae 329960 Jan 25 15:06 nsm-c2159ddd-49e179ae.eln* -rwxrwxrwx 1 sakae sakae 244828 Jan 25 15:06 network-stream-6de4812d-80d0c0de.eln* -rwxrwxrwx 1 sakae sakae 209104 Jan 25 15:14 userlock-60e3749c-6fd257fe.eln*
どうやら大丈夫みたい。これにて一件落着。
msys2一族
目もくれない速さでインストールしちゃったけど、msys2系はどうなってるか、 少し調べておく。
sakae@atom MINGW64 ~ $ ls -F / InstallationLog.txt clangarm64.exe* mingw32.ini tmp/ autorebase.bat clangarm64.ico mingw64/ ucrt64/ bin/ clangarm64.ini mingw64.exe* ucrt64.exe* clang32/ components.xml mingw64.ico ucrt64.ico clang32.exe* dev/ mingw64.ini ucrt64.ini clang32.ico etc/ msys2.exe* uninstall.dat clang32.ini home/ msys2.ico uninstall.exe* clang64/ installer.dat msys2.ini uninstall.ini clang64.exe* installerResources/ msys2_shell.cmd usr/ clang64.ico mingw32/ network.xml var/ clang64.ini mingw32.exe* opt/ clangarm64/ mingw32.ico proc/
開発系として、clang{32,64},mingw{32,64},ucrt64それにmsys2なる大本が混 在してる。必要な系を起動するんだな。今はMINGW64を選んでいる。
sakae@atom MINGW64 ~ $ echo $PATH | tr ':' '\n' /mingw64/bin /usr/local/bin /usr/bin /bin /c/Windows/System32 /c/Windows /c/Windows/System32/Wbem /c/Windows/System32/WindowsPowerShell/v1.0/ /usr/bin/site_perl /usr/bin/vendor_perl /usr/bin/core_perl
PATHの冒頭にあるやつに、それぞれ性格の違うコンパイラー系が入っているん だな。
sakae@atom UCRT64 ~ $ echo $PATH | tr ':' '\n' /ucrt64/bin /usr/local/bin /usr/bin : sakae@atom UCRT64 ~ $ gcc --verson -bash: gcc: command not found
こんどは、違う系を選んでみた。この系にはgccを入れていないので、勿論エ ラーだ。トップディレクトリーのmsys64のサイズは890Mだった。emacsのjitを 動かすだけの為に、この容量は果たして無駄かどうか? それは疑問だな。