skk-dev / ddskk

Daredevil SKK (Simple Kana to Kanji conversion program)
GNU General Public License v3.0
195 stars 42 forks source link

マーカー(▼と▽)の変更 #162

Open tani opened 3 years ago

tani commented 3 years ago

TUIのEmacsでは度々問題になる東アジア文字幅問題について質問です。最近の端末アプリケーションでは、東アジア文字幅対応が進み設定値の変更等で十分に対応できるようになりましたので、マーカー(▼と▽)をTUI環境で使用しても、ほとんどトラブルに見舞われることがなくなりました。しかし、未だに他のElispとの組合せによっては、東アジア文字幅を全角幅に合わせることで、レイアウトが大幅に崩れてることがあります。これらのマーカーを設定し直すことをできるようにしたいです。

度々DDSKK向けにパッチを書こうとローカル環境で挑戦しているのですが、なかなかうまく行かないので知恵をお借りしたいです。具体的には

(setq skk-marker-henkan ?\#
         skk-marker-henkan-select ?\@)

と設定ファイルに記述すると、これらの文字でマーカーを代替するようにしたいです。よろしくお願いします。

conao3 commented 3 years ago

いろんなところにハードコードされてしまっているので、マーカーをカスタマイズできるようにするのは難しそうです...

tani commented 3 years ago

やはり、そうですよね。何度かGrepで検索したとき、これらがハードコートされている雰囲気は感じていて一斉置換を試したのですが、あまりうまく出来ず悪戦苦闘しまして。その末の質問でした。

では、アプローチを変えてDDSKKーEmacs間でマーカーを置換するのではなく、Emacs−NCurses間で表示文字を変えるAPI等に心当たりはありませんでしょうか?

入力文字の場合はキーマップを上書きすることで、たとえば¥を\に置き換えることが出来ますよね。同じように出力文字を変えることは可能でしょうか?

conao3 commented 3 years ago
(setq prettify-symbols-alist
      '(
        ("lambda" . 955) ; λ
        ("->" . 8594)    ; →
        ("=>" . 8658)    ; ⇒
        ("map" . 8614)    ; ↦
        ("▼" . 35)
        ("▽" . 64)))
;;=> (("->" . 8594) ("=>" . 8658) ("map" . 8614) ("▼" . 35) ("▽" . 64))

(vconcat "#@")
;;=> [35 64]

心あたりあるのはこれです。試していたのですが、シンボルと認識されないようでうまくいきませんでした。 http://ergoemacs.org/emacs/emacs_pretty_lambda.html

tani commented 3 years ago

探していたものはまさにこれですね.今手元で実験したところ,

ということでした.Emacsの文字コード事情は詳しくないのですが,DDSKKは全般的にEUC-JPでエンコーディングされていますよね.ご提示頂いた設定例やControl-yやCommand-vで貼り付けた文字はUTF-8で統一されていたので上手く動作し,SKKはEUC-JPで文字を出力したため動作しなかったということは考えられませんでしょうか?

追記:実験してみましたが,うまくいきませんね.なぜシンボルと認識されないのでしょうか...

$ cat prettiy-file-symbols-alist.el | nkf -e | sponge prettiy-file-symbols-alist.el
$ emacs # (load prettiy-file-symbols-alist.el) (prettify-symbols-mode)
conao3 commented 3 years ago

それはマークに続いて文字が入力されているので、単体の文字になっていないからだと思います。 今はこちらの方を調査していて、多分これで出来る気がします。 https://ayatakesi.github.io/lispref/26.2/elisp-ja.html#Character-Display

tani commented 3 years ago

素晴らしいです!私の方でも当該箇所を理解するよう努めさせていただきます.

conao3 commented 3 years ago

とりあえずこれで上手くいくことが確認できました。 ただ、現在のウィンドウだけなので、新しく開くウィンドウだと元に戻ってしまう。。

(let ((disptab (make-display-table)))
  (aset disptab ?\▼ (vector (make-glyph-code ?# 'escape-glyph)))
  (aset disptab ?\▽ (vector (make-glyph-code ?@ 'escape-glyph)))
  (set-window-display-table (selected-window) disptab))
tani commented 3 years ago

今手元で試してみたところ,macOSのTerminal.appでも上手く動作することが確認できました. ひとまず,skk-mode-hookにこれを設定することで,SKKを有効化するときにディスプレイテーブルを更新するようにしてみました.

(defun skk-set-display-table ()
  (let ((disptab (make-display-table)))
    (aset disptab ?\▼ (vector (make-glyph-code ?# 'escape-glyph)))
    (aset disptab ?\▽ (vector (make-glyph-code ?@ 'escape-glyph)))
    (set-window-display-table (selected-window) disptab)))
(add-hook 'skk-mode-hook #'skk-set-display-table)

しかし,そのような状況があるか分かりませんが,SKKモードを維持したままウィンドウを切り替える場合,hookが発火されない恐れがあるので,恒久的に有効化できる方法がほしいですね.

conao3 commented 3 years ago

window-configuration-change-hook に(walk-windows)を引っかければ抜けはなくなる気がします。対症療法ですが。

tani commented 3 years ago

ありがとうございます.こちらの設定で上手く動作しますね.

  (defun skk-set-display-table ()
    (walk-windows
      (lambda (w)
        (let ((disptab (make-display-table)))
          (aset disptab ?\▼ (vector (make-glyph-code ?# 'escape-glyph)))
          (aset disptab ?\▽ (vector (make-glyph-code ?@ 'escape-glyph)))
          (set-window-display-table w disptab)))))
  (add-hook 'window-configuration-change-hook #'skk-set-display-table)

もし,@conao3さんの方で正攻法が思いつきそうな場合は,しばらく,このIssueをOpenにしておきたいです. そうでない場合は,Closeして頂いても構いません.

この度は本当にありがとうございました.これでTUIでも快適なSKK生活を送ることが出来ます.

tkita commented 3 years ago

etc/dot.skk に記載しておきました。

tani commented 3 years ago

@tkita 更新ありがとうございます.ところで私の意味したところでは,私が上げた2つの設定例を記述すると上手くいくということなので,お時間があるときに次のように更新していただければと思います.

  (defun skk-set-display-table ()
    (walk-windows
      (lambda (w)
        (let ((disptab (make-display-table)))
          (aset disptab ?\▼ (vector (make-glyph-code ?# 'escape-glyph)))
          (aset disptab ?\▽ (vector (make-glyph-code ?@ 'escape-glyph)))
          (set-window-display-table w disptab)))))
  (add-hook 'window-configuration-change-hook #'skk-set-display-table)
  (add-hook 'after-init-hook #'skk-set-display-table)
tkita commented 3 years ago

更新しておきました。

tkita commented 3 years ago

手元で確認せずに投稿しますが(すみません)、skk-set-display-table() による設定は、▽|▼ を含む候補や文書を正しく表示するものでしょうか?(Sankaku SPC の際の候補「▽」表示にも影響をおよぼしませんか?)

さんかく /三角/参画/△/▽/▲/▼/∴/∵/贊畫;旧字/3角/

tani commented 3 years ago

実験してみました.ご指摘の通り影響を及ぼしますね.したがって,マーカーの変更というよりはマーカーで使用される文字の表示グリフの変更というのが正しいですね.背に腹は変えられないので,私としてはこの設定だけでも便利なのですが,本来ならば,ハードコートされている文字を逐一変数化して変更可能にすべき問題だと思います.

tkita commented 3 years ago

@tani さま、実験ありがとうございます。skk-set-display-table() はその影響を十分に理解した上で使う必要ありますね。 etc/dot.skk の記載も、もうちょっと影響を書き加えておこうと思います。 なお、パッチ書いたことがあるのを思い出しました。こんなんでも良ければ取り込みたいと思います。 https://gist.github.com/tkita/1e9f8baf2939a5dedfc22cac99924ff7

tani commented 3 years ago

お手数をおかけしますが、そのように更新のほどよろしくお願いします。 パッチについては取り込まれた際には積極的にフィードバックさせていただきますね。