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を利用するための設定

emacsclient を使うメモ

普通に考えたらemacsは起動したままにしておくのが、正しい使い方、あれこ れ悩む必要はない。心配ったスリープを挟んでの動作も問題なし。

MSYS2

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を 動かすだけの為に、この容量は果たして無駄かどうか? それは疑問だな。


This year's Index

Home