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

        2018-06-03

        Setting for SSH-Key of GitHub from macOS Sierra

        これまでの状況


        1. macOS Sierra 10.12.6
        2. GitHub 初心者
        3. SSHも「Snow Leopard」で使ったものの...時代遅れ。

        事前に勉強した資料


        gitコマンドだけでなく、GitHubを利用する必要が出てきた。そこでQiitaの記事群を勉強した。中でも製作日が新しい「unsoluble_sugarさんの資料」に従って準備しました;

        GitHubのオンライン・ヘルプに到達する苦労!


        自分のGitHubのサイト、https://github.com/UserName/からオンライン・ヘルプへ到達するのに苦労。トライ&エラーの結果、手順がわかりました(図1);
        Fig 1. My GitHub web site and selection to online help.

         

        オンライン・ヘルプと要点


          実際の操作

           

          「1. Generating a new SSH key #2」について


          次のコマンドを実行

          ssh-keygen -t rsa -b 4096 -C "yourMailAddress"

          「2. Adding your SSH key to the ssh-agent #2」について


          Sierra10.12.2以降のユーザについて、~/.ssh/conigの設定に注意がありました。当方は「Sierra 10.12.6」なので従う。
          Host *
           AddKeysToAgent yes
           UseKeychain yes
           IdentityFile ~/.ssh/id_rsa   <=== 

          操作結果


          上記2点に留意して鍵を作ったのち、「GitHubへアクセスしSSH Keysを登録」に戻ると図2となりました;
          Fig 2. Registered SSH Key.
            
          程なくして、GitHubから確認メールが到着した(図3);
          Fig 3. Verification mail from GitHub.

          設定した~/.ssh/config

           Terminal出力;
          % cat ~/.ssh/config                               
          # global setting for macOS Sierra
          Host *
            AddKeysToAgent yes
            UseKeychain yes
            IdentityFile ~/.ssh/id_rsa
          %      

          念願の宿題

          • Karabiner-ElementsにKrabinerで作ったものを取り込む。
          • Bloggerのテーマとして、WordPressのテーマからbloggerように派生したテーマの入手
          • Cicaフォントの入手


          この記事の履歴
          1. 開始 2018-08-02-2344

          2018-04-01

          iTunesでCalmRadioの設定 その2

          データ・ドライブ中のiTunesライブラリをYosemiteとSierraから読み出せるように工夫
          している。そこでCalmRadioの以前の記事;
           に従って、最近のチャンネルを追加しようとしたが駄目だった。


          慌てて調べてみると、次の説明があった;https://calmradio.com/en/itunes
          • Using Calm Radio with iTunes or WMP 
            • チャンネルの視聴はうまくかなかったがiTunesの"Internet Songs"への"stream"へはうまく移行した。
            • "stream"がハイライトされている時に、⌘Iをおすとチャンネルの名前がつく。それをPlaylistのCalmRadioにドラッグ&ドロップすれば終わり。
              • "iTunes 12.7.3.46"でも、チャンネル毎にアイコンを表示できないのはかなしい!

          それにしても、iTunesは他社のストリーミングにもう少しでも寛容になっても良いのではなかろうか?


          この記事の履歴
          1. 開始 2018-04-01-1909


          2017-11-04

          MozillaZine.jpをダークな色で表示する

          体調が悪かった時に、明るい色調のテキストを見ると「目が眩しくて疲れました」。その時に、Firefoxの機能拡張;「Dark Background and Light Text」を利用すると、目が楽になりました。

          そこで、Firefoxの機能拡張;「Stylish」を用いて、MozillaZine.jpの閲覧を「ダークな色で表示」しました。これは検索・閲覧をする時には威力を発揮しています。


          最近、久々にMozillaZine.jpを覗いてみると、Firefox ver.56系→57系にすると、上の機能拡張が「旧式」となって動かなくなるようです。そこで現状を纏めておきます。



          MozillaZine.jpのフォーラム・リスト


          Figure 1.1 Forum list with normal color








          Figure 1.2 Forum list with dark color


          Firefoxフォーラムのトップ・トピック

          Figure 2.1 Top topic at Firefox forum  with normal color

          Figure 2.2 Top topic at Firefox forum  with dark color






          Figure 2.3 Style, myMozzila for dark colo






          Stylish: myMozilla


          @namespace url(http://www.w3.org/1999/xhtml);

          @-moz-document domain("mozillazine.jp") {
          body {
          color: #ccc !important;
          background-color: #454 !important;
          }


          /* not yet visited: cold colors */
          a:link{
          color: #5de !important;
          background-color: #047 !important;

          /* visited: warm color:s */
          a:visited{
          color: #eae !important;
          background-color: #606 !important;
          }
          /* hover */
          a:hover{
          color: #111 !important;
          background-color: #2A3 !important;
          }

          /* 表のセル: td.row1,row 2 */
          td.row1 {
          background-color: #444 !important;
          }
          td.row2 {
          background-color: #666 !important;
          }


          }

          @-moz-document domain("forums.mozillazine.jp") { 

          tr.row1 td b.postauthor{
          color: #ddd!important;
          background-color: #324 !important;           
          }
          tr.row1 {
          color: #ddd;
          background-color: #213 !important;           
          }

          tr.row2 td b.postauthor{
          color: #ddd!important;
          background-color: #324 !important;           
          }
          tr.row2 {
          color: #fff!important;
          background-color: #324 !important;           
          }


          td.profile {
          color: #ddd;
          background-color: #213 !important;     
          }

          div.postbody a.postlink {
          padding-left: 2%;
          padding-right: 2%;
          }

          div.quotecontent {
          color: yellow;
          background-color: #558 !important;
          font-size: 90%;
          line-height: 180% !important;
          padding-left: 1%;
          padding-right: 1%;
          }

          div.postbody {
          color: #ddd;
          background-color: #213 !important;
          font-size: 190%;
          line-height: 200% !important;
          padding-left: 1%;
          padding-right: 1%;
          }

          /* このトピックをウォッチする */
          td.cat table tbody {
          height: 28px;
          margin: 0;
          padding: 0;
          border: 0;
          background-color: #677 !important;
          text-indent: 4px;
          }

          /* 期間内表示 */
          table.tablebg tr td.cat form {
          height: 26px;
          background-color: #677 !important;`←
          padding-top: 4px;
          padding-bottom: 0px;
          }

          /* オンラインデータ */
          table.tablebg tbody tr td.cat h4{
          height: 22px;
          background-color: #677 !important;
          padding-top: 8px;
          }


          }




          ____

          この記事の履歴

          1.  開始 2017-11-04 00:08





          2017-06-04

          zsh: ~/Libraryの非可視/可視を設定するトグル型スクリプト

          •jp• zsh: ~/Libraryの非可視/可視を設定するトグル型スクリプト
          •us• zsh: Toggle type script to set invisible/visible of ~/Library

          昨年、Yosemiteから次期OSに移行するときに、~/Libraryの非可視/可視を決めるスクリプトの名前を忘れてしまったので、トグル型のスクリプト(toggleLibrary)に書き換えました。

          KarabinerはSierraでは動作しないので、まだYosemiteです。次期バージョンへの移行のに備えて、トグル型スクリプト(toggleLibrary)に改造しました。
            • これなら「1つの名前だけを覚えるだけ」なので記憶力低下対策に有効です。
              Terminal.appで「toggleLibrary↩︎」するときに、Finderで~/のしたを同時に見ていると、~/Libraryが非可視/可視がすぐに変更されるのが確認できます。
              • Terminal作業は慌てると大きなミスに繋がるので、Finderでの同時確認は大切だと思います。


              トグル型スクリプト(toggleLibrary)のソース
                #!/bin/zsh 
                
                # toggleLibrary: toggle file flag ("hidden/shown") for targetFile.
                
                
                # Usage: toggleLibrary↩
                
                cd $HOME
                
                # default file
                targetFile="Library"
                
                llO=$(ls -lO)
                hideT=$(echo $llO | grep "$targetFile" | grep hidden)
                
                if [ "$hideT" = "" ]
                then
                 #echo " show -> hide"
                 chflags hidden "$targetFile"
                 echo "• "$targetFile" hidden from GUI(Finder)"
                else 
                 #echo " hide -> show"
                 chflags nohidden "$targetFile"
                 echo "• "$targetFile" shown in GUI(Finder)"
                fi
                

                • 「ls -lO」は、「man chflags」を参考にしました。
                • AppleのFinderは、ますます非可視攻勢を拡大するのだろうか?


                この記事の履歴
                1. 開始 2017-06-04-1509
                2. 修正 2017-06-14-2113 httpsにするとSyntaxHighliterが動作不良のチェック時に中に発見。


                2017-04-14

                Numbers: X軸に対する多重Y軸の散布プロットを描く



                *jp title* Numbers: X軸に対する多重Y軸の散布プロットを描く
                •en title• Numbers: Draw a scatter plot of multiple Y axes with respect to X axis



                前回の記事を書いたあとで、見易い散布チャート(プロット)が欲しくなった。


                そういえば、昔に書いた記事があったのを思い出した;
                       
                       
                この記事に従ってプロットしようとしたが、動作しない。 現在利用中の「Numbera help」を見ると、ヘッダ行を含むテーブル全体を選択したてから、チャート(プロット)の種類から、「2D Scatter Plot」を選択するらしいことが分かりました。

                あとはトライ&エラーでなんとかできました。図1がその最終成果です。

                Figure 1













                問題点は上記の操作が複雑なステップ数(6)に渡って複雑です。記憶力や思考力の劣化が激しい自分自身の為に、ステップごとにスクリーン・ショットにすることにしました。

                STEP 1

                STEP 1

                STEP 2

                STEP 2

                STEP 3

                STEP 3

                STEP 4

                STEP 4


                STEP 5

                STEP 5


                STEP 6

                STEP 6


                TIPS 1

                TIPS 1

                TIPS 2

                TIPS 2
                •  「 STEP 6」の完成チャートを選択して、サイド・バー中の「Chart Style」の追加ボタン(+ボタン)をクリックすると、一見すると「カラー」の散布プロットのスタイルができる。
                • 新たに「Table 2」 を作り、上記のスタイルを適用しても、完全に一致しない。
                • でも初めから設定し直すよりは楽だ。


                   感想

                  1. 元気だった頃は、工作する前にノートを元にCADで作図をして準備した。
                  2. 最近はノートを元にテーブルやチャートを作るだけで、チェックが巧くできる。
                  3. 「Numbers Help」で説明不足と感じたのは、
                    1. 「STEP 2]での『Edit Data References』は「Call for  Y -Series Selector」ではないか?
                    2. 「STEP 3」での黒い部分(  Y Z U V )は「Series Button」といった名前が欲しい。



                    この記事の履歴

                    1. 開始2017-04-14-09:51



                    注目の投稿

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

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