2019-12-14

Terminalでの、なんちゃってViモドキ

近頃、ようやくKarabiner-Elementsに慣れてきたので、 Terminalで動作する「擬似Vi-Mode」を作って見たので、ご紹介します。

『概要』

「擬似Vi-Mode」の所以は、方向キー「←↓↑→」を通常の「hjkl」ではなくて「jkil」としました。これは私の小指が短めで、中指が長めのために選択してみました。恐らく、Vim系列では、このようなキー設定の変更は事実上不可能と推測しています。

当初は、zshの.zshrcで使い慣れている「bindkey -e」をベースに、下記の設定から始めました;
  • "^J" backward-char
  • "^K" down-line-or-history
  • "^I" up-line-or-history
  • "^L" forward-char
  • "^A" beginning-of-line
  • "^B" backward-delete-char
  • "^D" delete-char-or-list
  • "^E" end-of-line
  • "^G" expand-or-complete
  • "^M" accept-line
  • "^U" undo
この変則的なキーマッピングは文字(chr)単位だけの操作だけでしたが、予想以上に快適だったので、「Esc」を使って、語(word)や列(line)の操作をしようとしましたが、小指が短めの私には、「Esc」は遠すぎです。

実は、Karabiner-Elementsにより、下記のキー操作が実現されています;
  • スペース・キーを長押ししていると「lコントロール・キー (^)」
  • スペース・キーの左右には「コマンド・キー(⌘)」
  • また、キャップスロック・キーには(FN)
そこで、Karabiner-ElementsでTerminalについての.jsonを検索すると、"Navigation in Terminal Apps"があったので、これを参考に語(word)や列(line)の操作ができました’
  • "tViModoki.2g.json"
  • 以降、ViModokiがニックネームとなりました。
  • 起動キーは「左コマンド(スペース・キーを長押し)」で、
  • 修飾キーは「コマンド・キー(⌘)」

ここまで来ると、「範囲指定: ^oで開始点を設定、終点まで移動」をして、「コピー: ^w」、「削除:^x」、「ペースト:^v」が欲しくなりました。「^w」と「^x」は、下記の2つのサイトを参考に関数で対応しました;
zshで範囲選択・削除・コピー・切り取りするhttps://qiita.com/takc923/items/35d9fe81f61436c867a8
Macがzshになるなら、ZLEを習得するっきゃない!https://dev.classmethod.jp/tool/zsh-zle-introduction/

    『.zshrcでのbindkey設定』

    ## basic bindkey setting
    bindkey -d
    bindkey -e
    ## # cursor movement by char/word/line
       bindkey  '^[j' backward-word          #   ⎋j: ←.w
       bindkey   '^j' backward-char          #   ^j: ←.c
       bindkey   '^k' down-line-or-history   #   ^k: ↓.l
       bindkey   '^i' up-line-or-history     #   ^i: ↑.l
       bindkey   '^l' forward-char           #   ^l: →.c
       bindkey  '^[l' forward-word           #   ⎋f: w.→
    ## # resion & killing
       bindkey   '^o' set-mark-command       # 範囲の開始位置をマーク
       bindkey   '^x' kill-region
                         #マークから現在位置までの範囲を削除し、それをキルリングに蓄積.
       bindkey   '^v' yank
                         #キルリングの最新の内容を貼り付ける
       bindkey  '^[v' yank-pop
                         #キルリングを遡る(Ctrl-yの後にのみ有効)
    ## bindkey  '^[w' copy-region-as-kill    # カーソルの左側の語をコピー
    ## # cursor movement by line
       bindkey  '^[a' kill-line                        #   ⎋a: ⌦.eol
       bindkey   '^a' beginning-of-line          #   ^a: bol.l
       bindkey  '^[e' backward-kill-line         #   ⎋e: bol.⌫
       bindkey   '^e' end-of-line                   #    ^e: l.eol
     # bindkey   '^y' center-of-line              # function center-of-line()
     # forward delete for word & char
       bindkey  '^[d' kill-word                      #   ⎋d: w⌦
       bindkey   '^d' delete-char-or-list        #   ^d: c⌦
     # backward delete for word & char
       bindkey  '^[b' backward-kill-word       #   ⎋b: ⌫w
       bindkey   '^b' backward-delete-char   #   ^b: ⌫c
     # operation
       bindkey   '^_' undo                            #   ^_: ⎌
       bindkey   '^m'  accept-line                 #   ^m: ↩︎

    tViModoki.2g.json

    {
      "title": "tViModoki.2g.json,
      "rules": [
        {
          "description": "tViModoki.2g.json  T=^;⌘a➤⎋a,⌘b➤⎋b,⌘c➤⌘c,⌘d➤⎋d,⌘e➤⎋e,h➤⎋h,⌘j➤⎋j,l➤⎋l,p➤⎋q,q➤',u➤^_,⌘v➤⎋v,⌘x➤⌘x,⌘z➤⌘z.",
          "_note0": "^q:quote ^p:push-line ^h:run-help",
          "_note1": "rev 2f: 2019-11-11-1820  <-- rev 2e.1: 1370220828.json",
          "_note2": "rev 2g: 2019-12-12-2205  alphabetical order",
           "manipulators": [
            {
              "type": "basic",
              "from": {
                "key_code": "a",
                "modifiers": {
                  "mandatory": [
                    "control",
                    "command"
                  ]
                }
              },
              "to": [
                {
                  "key_code": "escape"
                },
                {
                  "key_code": "a"
                }
              ],
              "conditions": [
                {
                  "type": "frontmost_application_if",
                  "bundle_identifiers": [
                    "^com\\.apple\\.Terminal$",
                    "^com\\.googlecode\\.iterm2$",
                    "^co\\.zeit\\.hyperterm$",
                    "^co\\.zeit\\.hyper$",
                    "^io\\.alacritty$",
                    "^net\\.kovidgoyal\\.kitty$"
                  ]
                }
              ]
            },
            {
              "type": "basic",
              "from": {
                "key_code": "b",
                "modifiers": {
                  "mandatory": [
                    "command",
                    "control"
                  ]
                }
              },
              "to": [
                {
                  "key_code": "escape"
                },
                {
                  "key_code": "b"
                }
              ],
              "conditions": [
                {
                  "type": "frontmost_application_if",
                  "bundle_identifiers": [
                    "^com\\.apple\\.Terminal$",
                    "^com\\.googlecode\\.iterm2$",
                    "^co\\.zeit\\.hyperterm$",
                    "^co\\.zeit\\.hyper$",
                    "^io\\.alacritty$",
                    "^net\\.kovidgoyal\\.kitty$"
                  ]
                }
              ]
            },
            {
              "type": "basic",
              "from": {
                "key_code": "c",
                "modifiers": {
                  "mandatory": [
                    "control",
                    "command"
                  ],
                  "optional": [
                    "caps_lock"
                  ]
                }
              },
              "to": [
                {
                  "key_code": "c",
                  "modifiers": [
                    "left_command"
                  ]
                }
              ],
              "conditions": [
                {
                  "type": "frontmost_application_if",
                  "bundle_identifiers": [
                    "^com\\.apple\\.Terminal$",
                    "^com\\.googlecode\\.iterm2$",
                    "^co\\.zeit\\.hyperterm$",
                    "^co\\.zeit\\.hyper$",
                    "^io\\.alacritty$",
                    "^net\\.kovidgoyal\\.kitty$"
                  ]
                }
              ]
            },
            {
              "type": "basic",
              "from": {
                "key_code": "d",
                "modifiers": {
                  "mandatory": [
                    "command",
                    "control"
                  ]
                }
              },
              "to": [
                {
                  "key_code": "escape"
                },
                {
                  "key_code": "d"
                }
              ],
              "conditions": [
                {
                  "type": "frontmost_application_if",
                  "bundle_identifiers": [
                    "^com\\.apple\\.Terminal$",
                    "^com\\.googlecode\\.iterm2$",
                    "^co\\.zeit\\.hyperterm$",
                    "^co\\.zeit\\.hyper$",
                    "^io\\.alacritty$",
                    "^net\\.kovidgoyal\\.kitty$"
                  ]
                }
              ]
            },
         
            {
              "type": "basic",
              "from": {
                "key_code": "e",
                "modifiers": {
                  "mandatory": [
                    "control",
                    "command"
                  ]
                }
              },
              "to": [
                {
                  "key_code": "escape"
                },
                {
                  "key_code": "e"
                }
              ],
              "conditions": [
                {
                  "type": "frontmost_application_if",
                  "bundle_identifiers": [
                    "^com\\.apple\\.Terminal$",
                    "^com\\.googlecode\\.iterm2$",
                    "^co\\.zeit\\.hyperterm$",
                    "^co\\.zeit\\.hyper$",
                    "^io\\.alacritty$",
                    "^net\\.kovidgoyal\\.kitty$"
                  ]
                }
              ]
            },
            {
              "type": "basic",
              "from": {
                "key_code": "h",
                "modifiers": {
                  "mandatory": [
                    "control"
                  ]
                }
              },
              "to": [
                {
                  "key_code": "escape"
                },
                {
                  "key_code": "h"
                }
              ],
              "conditions": [
                {
                  "type": "frontmost_application_if",
                  "bundle_identifiers": [
                    "^com\\.apple\\.Terminal$",
                    "^com\\.apple\\.finder$",
                    "^com\\.googlecode\\.iterm2$",
                    "^co\\.zeit\\.hyperterm$",
                    "^co\\.zeit\\.hyper$",
                    "^io\\.alacritty$",
                    "^net\\.kovidgoyal\\.kitty$"
                  ]
                }
              ]
            },
            {
              "type": "basic",
              "from": {
                "key_code": "j",
                "modifiers": {
                  "mandatory": [
                    "command",
                    "control"
                  ]
                }
              },
              "to": [
                {
                  "key_code": "escape"
                },
                {
                  "key_code": "j"
                }
              ],
              "conditions": [
                {
                  "type": "frontmost_application_if",
                  "bundle_identifiers": [
                    "^com\\.apple\\.Terminal$",
                    "^com\\.apple\\.finder$",
                    "^com\\.googlecode\\.iterm2$",
                    "^co\\.zeit\\.hyperterm$",
                    "^co\\.zeit\\.hyper$",
                    "^io\\.alacritty$",
                    "^net\\.kovidgoyal\\.kitty$"
                  ]
                }
              ]
            },
            {
              "type": "basic",
              "from": {
                "key_code": "l",
                "modifiers": {
                  "mandatory": [
                    "command",
                    "control"
                  ]
                }
              },
              "to": [
                {
                  "key_code": "escape"
                },
                {
                  "key_code": "l"
                }
              ],
              "conditions": [
                {
                  "type": "frontmost_application_if",
                  "bundle_identifiers": [
                    "^com\\.apple\\.Terminal$",
                    "^com\\.googlecode\\.iterm2$",
                    "^co\\.zeit\\.hyperterm$",
                    "^co\\.zeit\\.hyper$",
                    "^io\\.alacritty$",
                    "^net\\.kovidgoyal\\.kitty$"
                  ]
                }
              ]
            },
            {
              "type": "basic",
              "from": {
                "key_code": "p",
                "modifiers": {
                  "mandatory": [
                    "control"
                  ]
                }
              },
              "to": [
                {
                  "key_code": "escape"
                },
                {
                  "key_code": "q"
                }
              ],
              "conditions": [
                {
                  "type": "frontmost_application_if",
                  "bundle_identifiers": [
                    "^com\\.apple\\.Terminal$",
                    "^com\\.apple\\.finder$",
                    "^com\\.googlecode\\.iterm2$",
                    "^co\\.zeit\\.hyperterm$",
                    "^co\\.zeit\\.hyper$",
                    "^io\\.alacritty$",
                    "^net\\.kovidgoyal\\.kitty$"
                  ]
                }
              ]
            },
            {
              "type": "basic",
              "from": {
                "key_code": "q",
                "modifiers": {
                  "mandatory": [
                    "control"
                  ]
                }
              },
              "to": [
                {
                  "key_code": "escape"
                },
                {
                  "key_code": "quote"
                }
              ],
              "conditions": [
                {
                  "type": "frontmost_application_if",
                  "bundle_identifiers": [
                    "^com\\.apple\\.Terminal$",
                    "^com\\.apple\\.finder$",
                    "^com\\.googlecode\\.iterm2$",
                    "^co\\.zeit\\.hyperterm$",
                    "^co\\.zeit\\.hyper$",
                    "^io\\.alacritty$",
                    "^net\\.kovidgoyal\\.kitty$"
                  ]
                }
              ]
            },
            {
              "type": "basic",
              "from": {
                "key_code": "s",
                "modifiers": {
                  "mandatory": [
                    "control",
                    "command"
                  ],
                  "optional": [
                    "caps_lock"
                  ]
                }
              },
              "to": [
                {
                  "key_code": "s",
                  "modifiers": [
                    "left_command"
                  ]
                }
              ],
              "conditions": [
                {
                  "type": "frontmost_application_if",
                  "bundle_identifiers": [
                    "^com\\.apple\\.Terminal$",
                    "^com\\.googlecode\\.iterm2$",
                    "^co\\.zeit\\.hyperterm$",
                    "^co\\.zeit\\.hyper$",
                    "^io\\.alacritty$",
                    "^net\\.kovidgoyal\\.kitty$"
                  ]
                }
              ]
            },
            {
              "type": "basic",
              "from": {
                "key_code": "u",
                "modifiers": {
                  "mandatory": [
                    "control"
                  ]
                }
              },
              "to": [
                {
                  "key_code": "hyphen",
                  "modifiers": [
                    "left_shift",
                    "left_control"
                  ]
                }
              ],
              "conditions": [
                {
                  "type": "frontmost_application_if",
                  "bundle_identifiers": [
                    "^com\\.apple\\.Terminal$",
                    "^com\\.googlecode\\.iterm2$",
                    "^co\\.zeit\\.hyperterm$",
                    "^co\\.zeit\\.hyper$",
                    "^io\\.alacritty$",
                    "^net\\.kovidgoyal\\.kitty$"
                  ]
                }
              ]
            },

            {
              "type": "basic",
              "from": {
                "key_code": "v",
                "modifiers": {
                  "mandatory": [
                    "control",
                    "command"
                  ],
                  "optional": [
                    "caps_lock"
                  ]
                }
              },
              "to": [
                {
                  "key_code": "v",
                  "modifiers": [
                    "left_command"
                  ]
                }
              ],
              "conditions": [
                {
                  "type": "frontmost_application_if",
                  "bundle_identifiers": [
                    "^com\\.apple\\.Terminal$",
                    "^com\\.googlecode\\.iterm2$",
                    "^co\\.zeit\\.hyperterm$",
                    "^co\\.zeit\\.hyper$",
                    "^io\\.alacritty$",
                    "^net\\.kovidgoyal\\.kitty$"
                  ]
                }
              ]
            },
            {
              "type": "basic",
              "from": {
                "key_code": "x",
                "modifiers": {
                  "mandatory": [
                    "control",
                    "command"
                  ],
                  "optional": [
                    "caps_lock"
                  ]
                }
              },
              "to": [
                {
                  "key_code": "escape"
                },
                {
                  "key_code": "v"
                }
              ],
              "conditions": [
                {
                  "type": "frontmost_application_if",
                  "bundle_identifiers": [
                    "^com\\.apple\\.Terminal$",
                    "^com\\.googlecode\\.iterm2$",
                    "^co\\.zeit\\.hyperterm$",
                    "^co\\.zeit\\.hyper$",
                    "^io\\.alacritty$",
                    "^net\\.kovidgoyal\\.kitty$"
                  ]
                }
              ]
            },
            {
              "type": "basic",
              "from": {
                "key_code": "z",
                "modifiers": {
                  "mandatory": [
                    "control",
                    "command"
                  ],
                  "optional": [
                    "caps_lock"
                  ]
                }
              },
              "to": [
                {
                  "key_code": "z",
                  "modifiers": [
                    "left_command"
                  ]
                }
              ],
              "conditions": [
                {
                  "type": "frontmost_application_if",
                  "bundle_identifiers": [
                    "^com\\.apple\\.Terminal$",
                    "^com\\.googlecode\\.iterm2$",
                    "^co\\.zeit\\.hyperterm$",
                    "^co\\.zeit\\.hyper$",
                    "^io\\.alacritty$",
                    "^net\\.kovidgoyal\\.kitty$"
                  ]
                }
              ]
            }
          ]
        }
      ]
    }


    『.zshrcでのzle関数』

    ### functions for bindkey ######################################################
    #                                                                              #
    # https://qiita.com/takc923/items/35d9fe81f61436c867a8
    # zshで範囲選択・削除・コピー・切り取りする
    # 導入: 2019-12-12-052531
    function copy-region() {
        zle copy-region-as-kill
        REGION_ACTIVE=0
    }
    zle -N copy-region
    bindkey "^w" copy-region
    function remove-region() {
    #    if [[ "$(($REGION_ACTIVE))" -eq 0 ]]; then
    #        zle backward-kill-word
    #    else
    #        zle kill-region
    # fi
    zle kill-region
    }
    zle -N remove-region
    bindkey "^x" remove-region

    # https://dev.classmethod.jp/tool/zsh-zle-introduction/
    # Macがzshになるなら、ZLEを習得するっきゃない!
    # 2019-12-12-191339 「if [[ 」は駄目だった。
    function tab-hokan() {
        [[ "${RBUFFER:0:1}" != " " ]] && BUFFER="${LBUFFER} ${RBUFFER}"
        zle expand-or-complete
        zle redisplay
    }
    zle -N tab-hokan
    bindkey "^g" tab-hokan


      『キー操作のリスト』

       •••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
       • vm: "tiny Vi-Modoki based on Navigation in Terminal Apps"     •
       ••        for Terminal.apps with zsh using bindkey -e          ••
          ##### ====== move cursor by a char/line/word =========== #####
               # ^j: ←c                   # ⌘^j: ⤆w      ☑︎
               # ^k: ↓l                   #
               # ^i: ↑l                    #
               # ^l: c→                   # ⌘^l: w⤇      ☑︎
          ##### === go to (bol|col|eol), long delete (eol|bol) === #####
               #  ^a: bol⤟               #  ^e: ⤠eol
               #  ^y: col                  # center-of-line()
               # ⌘^a: l⌦eol  ☑︎        # ⌘^e: bol⌫l   ☑︎
          ##### ======== delete by a word/char =================== #####
               # ⌘^d: w⌦     ☑︎        # ⌘^b: ⌫w      ☑︎
               #  ^d: c⌦                  #  ^b: ⌫c
          ##### ======== reginal operation ======================= #####
               #  ^o: set-mark-command
               #  ^v: yank                  #  ^v:
               # ^[v: yank-pop           # ^⌘v:        (☑︎)
               #  ^w: copy-region       # copy-region()
               #  ^x: remove-region    # remove-region()
          ##### ======== etc =========== t.ViM :   ☑︎=============== #####
               #  ^h: run_Help            #  ^h: ⎋h      ☑︎
               #  ^m: accept-line         #  ^m: ↩︎
               #  ⎋q: Push-line           #  ^p: ⎋q     ☑︎
               #  ⎋': Quote-line          #  ^q: ⎋'      ☑︎
               #  ^_: undo                  #  ^u: ^_        ☑︎
          ##### ============================================== #####




        『環境』


        • OS: Mojave Ver. 10.14.4
        • Terminal: Version 2.9.4 (421.1.1)
        • zsh 5.7.1 (x86_64-apple-darwin18.2.0)


        『感想』

        1. 初めて「bindkey」にトライできて楽しかった。まるで小学生のころ、「ナイフで鉛筆削り」をした時のことを思い出しました...。お陰で、タッチ・タイピングが戻ってきた。
        2. Viのvicmdモードに惹かれるが、いっそのこと別途に「⎋」,「^」,「Fn」などを「CapsLock」のようなトグル型にして従来のキーボードと併用するとよいかも。もう少し体力が回復したら工作したいなぁ!
        3. 今回Karabiner-Elementsを気楽に操作できたのは、「App Store」で購入した「JSON Editor.app」を、通常のエディタの隣に小さく表示するごとに、エラー部分を表示してくれるのだ。お陰で「,」のエラーは簡単に検知は容易!次に多かったのは単なるタッチ・ミスの検出にも大活躍。
        4. でも、.jsonは長くて読みづらい。孫悟空のような名前のプリプロセッサーのようなシステムがあるらしいので、調べてみたい。

        [この記事の履歴]

        1. 開始 2019-12-14

        2019-06-26

        Intel製「Power Gadget 」について

        メイン・マシンは次のように変遷しました;
        • 「Mac mini(Mid 2011), macOS Sierra」から
        • 「Mac mini(2018) i5, macOS Mojave 10.14.4」


        この両者を比較して一番驚いたのが、後者では;
        1. 表面温度がより低くなった事。
        2. 排気音がより小さくなった事。

        1.については、
        • 「TG Pro.app」で視ることができて、確かに低いです。
        • またファンの回転数も気温が33°Cぐらいまでなら1700rpm前後です。

        2.については、
        • そして設定「Fans」: System --> Max」にするとファンが豪快に回り始めました。
        • その後は「Fans」: Auto Max」で安定しています。

        で、興味は「Mac mini(2018) i5」のマルチ・コアの動作を可視化することに移りました。で検索の結果、「Intel(R) Power Gadget.app 」があったので、入手しました。

        ちょっと前に「App Store」からいくつかのアプリケーションの更新があったので「Pages.app」のupdate時の振る舞いをキャプチュアしました、下図;

        Fig. Intel(R) Power Gadget.app for Updating of Pages.app from App Store.



        これまでの観察で、「アプリケーションの動作」の体感に近いのは「Frequency」です。無負荷ではコア数は「1.4強」ほどで、負荷の向上と共に「4.0弱」まで上昇しました。

        検索した時は、「i5」マシンのコア数は「2.0~4.1」と見た気がしましたが、自分のマシンのコア数は低めです。むしろお陰で、安定性が増しているのではないかと推定しています。

        この記事の履歴
        1. 開始: 2019-06-26-21:00



        2019-06-21

        ダークな地の色でブラウザを運行する時の問題点 --緊急メモ--

        私は、「macOS Mojave 10.14.4」で「Appearance: Dark」の設定を用いています。そして組み込みのSafariで「Dark Reader for Safari.app」を組み合わせることで、ウェブ・ブラウジングがとても快適になりました。
        • 以下、ダークな地の色を使うのを「ダークな設定」、ライトな地の色を使うのを「ライトな設定」と略します。


        そうなるとメイン・ブラウザである「Firefox 67.0」でも同じようにしたくなり、あるフォーラムで論議です。

        その論議の中で;
        1. 「ダークな設定」の時に「地の色が赤で、文字色が白」としても問題なく見えるが
        2. 「ライトな設定」の時に「地の色が赤で、文字色が黒」となり、可読性が濁度にていかする。
        3. 「ライトな設定」の時に「地の色が赤で、文字色が黒」でも一部をドラッグすると、「地の色が赤で、文字色が白」。となり読める。


        この現象とは裏腹な現象が、それもFiredoxのアピール・サイトに見られたので示します。
        新しいfitrfox この速さ、どこまでも。
        https://www.mozilla.org/ja/firefox/new/


        図1 緑青の下地に、白の文字では、コントラストが低すぎて、可読性が悪い!


        図2 でも文字部分を大雑把にドラッグするだけで、「文字列の背景色が青で、その文字色が白」となり、可読性が向上!




        ついでに「MozillaZine」のエディタの操作部分は多くの場合、アイコンのクリックで操作しますが、こちらでは図3のような「ボタン形式」です。

        図3 アイコンだけでなく、ボタンにも注意




        この記事を作成中に。「作成」モードの文字色が見えづらくなった。以前、他のブログに移動しようとした時にも、類似の状態になったような。引っ越ししたいが、体力に自信がないなぁ....。



        この記事の履歴
        開始: 2019-06-21-19:12

        2019-06-12

        MojaveでのSafariのCSS設定

        従来から、常用ブラウザはFirefoxで、検索して参考になるサイトを.weblocで保存しておく。それを見たくなったらSafariで立ち上げるようにしていた。

        しかし、次の設定のために、考えが変わった。
        • Mojaveでの;「Appearance: Dark」と
        • Safariでの機能拡張;「Dark Reader」[App Store]から購入

         その上、Google検索は、ブラウザで直接するのは止めてて、ターミナルからスクリプト(現在テスト中)を使っての検索になっています。

        この影響で、 FirefoxもSafariも対等に利用するようになりました。そこで取り合えず、Safariに簡単なCSSを作ったので紹介します。

        2つの図だけをお示しします。おまけ(図3)を追加しました。

         図1:  Safariの設定(Fig. 1a)とsafari.css(Fig. 1b)

        図1:  Safariの設定(Fig. 1a)とsafari.css(Fig. 1b)


        図2: 偶に行くサイトでは、既読表示(orange)が嬉しい。
        図2: 偶に行くサイトでは既読表示(orange)が助かる。

        おまけ(図3)


        FirefoxのCSS設定と同じに変更しました。
        • 多くのサイトで見られるリンクの下線(1px)を消し、
        • ホバーするときに、リンクの下線(2px)を設定。リンクの色に同期するので状態が見やすい。
        Fig. 3: Changed css as same as Firefox's css setting.





        この記事の履歴
        1. 開始 2019-06-12-21:00
        2. 追加 2019-06-15-09:22



        2019-06-07

        macで自動ログインを中止した! -- 備忘録 --

        現在使用中のOSは、「Mojave 10.14.4(18E226)」ですが、結構頻繁にバージョン・アップされています。が、段々と熟成されるというよりも、その場しのぎのパッチが続いている印象が強い。従って現時点では、App.Storeから連日に渡って「Mojave 10.14.5」への移行を促されているが、様子見をしている。

        そんな中、長年使ってきた「自動ログイン: automatic login」を中止した。私の推定ではOSの信頼性向上の為に、ログイン時にマウス操作が必須になるように移するだろう、と思うからです。
        どうせなら、iPhoneのユーザ認証を使って、Macに自動ログインして欲しいが...。

        そこで、面倒でも今から「マウスを使ったログイン」に移行し、事前に問題出しをしようと思いました。で判明したのは、
        • ログイン時のマウス・カーソルは小さすぎて、見つけ難い!
        でした。

        何度かやっていると、画面の左側面のどこかに居るらしいのですが、カーソルを見つけるのにストレスが高まります。この話をアップルのテクニカル・アドバイザの方に愚痴ったら、2日後に教えていただきました。すぐに忘れそうなので備忘録として置きます。

        要点は、昔からの「ルート・ユーザ: root user」としてログインして、
        • 「システム設定: System Preferences」--> 「アクセシビリティ: Accessibilitty」--> 「ディスプレイ: Display」と選択し、
        • 右ペインの「カーソル・サイズ: Cursor size」のスクロール・バーで見やすいサイズに変更する、下図参照。




        これだけの設定で、その後の「マウスを使ったログイン」では、ログイン前でも日常使っているマウス・カーソルで表示されます。ストレス・フリーのログインができるようになりました。

        で、判ったのは、ログイン画面に入った時点では、カーソルは「画面左上」、すなわち通常のメニュー・バー(menu bar)の「アップル・ロゴ・マーク: apple logo mark::  」の近くに待機するようです。


        結論:

        • iPhoneの指紋認証能力を用いたMacの自動ログインが欲しい!
        • Hope utomatic login by using fingerprint biometric technology of iPhone


        参考資料: ルート・ユーザ設定(日本語/英語)



        この記事の履歴
        1. 開始2019-06-07-02:38


        2019-02-27

        Mail.app(12.2)にiTscomのメールアカウントを登録した:備忘録

        【状況】
        長いこと相棒だった「Mac mini(Mid 2011), macOS Sierra」のファイル・システムが不調となった。予備機の「iMac(21.5-inch,ate 2009), macOS Sierra」で凌いでいた。でもウェブ・ブラウザですらレインボー・マークが頻繁になり、仕方なく「Mac mini(2018), macOS Mojave」を購入した。

        加齢とともに明るい光が眩しくなったので、Mojaveのダーク・モードは有難い。「Finder, Terminal」さらにMailもダーク・モードに対応していたのに感激した。これまで常用のメイラーは唯一Thunderbirdだけだったのですが、初めて「Mail ver.12.2」にiTscom.netの複数アカウントを登録してみました。

        iTscomのサイトにあるヘルプ情報は古すぎるようなので、電話サポートで「Mail ver.12.2」の設定方法をお聞きした。以後の備忘録として報告します。

        【準備】
        メールアカウント情報はiTscomのマイページから調べられて、アカウント毎に3つの値が決められています。説明の為に下記のサンプル値を用います;
        • e-mail address: sample@z99.itscom.net 
        • POP account: m9876543
        • POP account password: ZzXxYy9988
         
        上記に加えて、「POP server」、「SMTP server」 の値は登録時のままでないので、接続が変な場合はサポートに確認するのをお勧めします。

        【設定】
        LaunchpadからMailをオープンし、キーボードから「command + camma」を打つと、Mailの設定(Preferences)が開かれる。其の後は、下図1,2に示す手順に従って設定します;

        --------------- Figure 1 -----------------------------------------------------------------------------------
        • (0) select Accounts tab. 
        • (1) click on "+" in left pain. enter or select;
          • Email Address
          • POP Account in User Name
          • POP Account Passwoed in Password 
          • POP in Account Type 
          • pos01.itscom.net in Incoming Mail Server  
          • sos01.itscom.net in Outgoing Mail Server
        • (2) clic on "Sin In". ---> Figure 2
        --------------- Figure 2 -----------------------------------------------------------------------------------
        •   (3) uncheck "Automatically manage connection settings" in POP and SMTP  
          • confirm Port 995 in POP,  check "Use TLS/SSL" 
          • confirm Port 465 in SMTP, check "Use TLS/SSL"
        •  (4) click on to carry out this account setting.


        Figures 1 and 2,

        【感想】
         前回iTscomで、メイルの登録したには4年前でした。当時に比べると、受信(POP)/送信(SMTP)が同時に設定できた(Fig. 2)のは判りやすかった。「TLS/SSL」の設定が漸く入った。

        ついでにiPhoneとMacとのMail.appとで、設定の共有をして欲しいな。




        この記事の履歴
        1. 開始 2019-02-27-1540

        2018-09-16

        zsh: Utility for Karabiner-Elements

        遅ればせながらKarabiner-Elementsに手を出し始めました。従来のKarabinerではprivate.xmlで全て書き下していたので、戸惑うところが多数あります。

        特に「記憶力の低下が激しい老人」にとって、「ComplexModifications」の設定は困難です。

        そこで、ダウンロードした「ComplexModifications」の置かれているディレクトリについて簡易リストをするスクリプトを作ったので紹介します。
         ~/.config/karabiner/assets/complex_modifications

        実行例(listComplexModifiers)

        Figure 1. Example of listComplexodifiers
        出力は下記になります;
        1. 通常のls(file name order) 
        2. ファイル毎の「description 」の抽出リスト

        スクリプト

        #!/bin/zsh 
        
        # listComplexModifiers
        
        cd ~/.config/karabiner/assets/complex_modifications
        thisDir=$(pwd | sed "s%$HOME%~%")
        echo "•$0:t for '$thisDir'"
        
        echo "(1) Json files"
        ls -1 | sort -f | nl -w3 -s'  '
        
        echo "(2) Json-file & its Descriptions"
        j=$[0]
        for file in *
        do 
         j=$[j+1]
         printf "%3d  %s\n" $j "$file"
         cat "$file" | grep description | sed 's%"description":%• %g'
        done
        


        感想


        先代Karabinerがスポーツ車だとすれば、 Karabiner-Elementsは優雅なセダンと感じます。細かな配慮が欠落しています。例えば、
        •  Karabiner「Mouse Keys v2」の「Warp cursor position」は亡くなり、
        •  Karabiner「Launcher Mode v2」の「Dictionary: O+Q,Q(press Q twice」も亡なりなりました。
        でも、日本語のサイト(Karabiner-ja)では回答がされていないので質問ができず、自前の「ComplexModifications」で違う方法を模索するしかありません。

        Dictionaryについて言えば、スクリプトによる利用法の改善に努めています。



        この記事の履歴
        1. 開始 2018-09-16-1350

        注目の投稿

        Terminalでの、なんちゃってViモドキ

        近頃、ようやくKarabiner-Elementsに慣れてきたので、 Terminalで動作する「擬似Vi-Mode」を作って見たので、ご紹介します。 『概要』 「擬似Vi-Mode」の所以は、方向キー「←↓↑→」を通常の「hjkl」ではなくて「jkil」としました。これ...