Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
tani opened this issue Jul 18, 2020 · 17 comments
Open

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

tani opened this issue Jul 18, 2020 · 17 comments

Comments

@tani
Copy link

tani commented Jul 18, 2020

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

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

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

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

@conao3
Copy link
Member

conao3 commented Jul 18, 2020

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

@tani
Copy link
Author

tani commented Jul 18, 2020

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

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

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

@conao3
Copy link
Member

conao3 commented Jul 18, 2020

(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
Copy link
Author

tani commented Jul 18, 2020

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

  • Control-yCommand-vで文字を貼り付けたときは,#や@に置換される
  • DDSKKで変換を指示したときは,置換されない

ということでした.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
Copy link
Member

conao3 commented Jul 18, 2020

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

@tani
Copy link
Author

tani commented Jul 18, 2020

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

@conao3
Copy link
Member

conao3 commented Jul 18, 2020

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

(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
Copy link
Author

tani commented Jul 18, 2020

今手元で試してみたところ,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
Copy link
Member

conao3 commented Jul 18, 2020

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

@tani
Copy link
Author

tani commented Jul 18, 2020

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

  (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
Copy link
Member

tkita commented Jul 18, 2020

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

@tani
Copy link
Author

tani commented Jul 18, 2020

@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
Copy link
Member

tkita commented Jul 18, 2020

更新しておきました。

@tkita
Copy link
Member

tkita commented Jul 19, 2020

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

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

@tani
Copy link
Author

tani commented Jul 19, 2020

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

@tkita
Copy link
Member

tkita commented Jul 19, 2020

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

@tani
Copy link
Author

tani commented Jul 19, 2020

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants