2013-06-30

my own "Character Picker" with Keyboard-en.plist on os x Lion 10.7.5

以前に作成したアスキー・アートを手直ししようと、 TextEditで作業を始めた所、「a」を押し続けてもポップアップ・メニュが出るので、連続入力「aa…a」 が簡単には作れない。ところが、このポップアップは一寸した「アクセント付きの文字」の入力には重宝しているので、一時的にポップアップ・メニュの機能を停止する方法を調べたのですが、判りませんでした。
そこで、「Appleサポート・コミュニティのLionフォーラム」で質問致しました;
この結果、このポップアップ・メニュは「Terminal, Editer系」では作動せず、むしろ TextEditで例外的に作動するようだ。そこで、初期の目的、「アスキー・アートの手直し」は常用エディタ、TextWranglerでいとも簡単に達成出来ました。

余裕ができたので、先の論議でHALさんの解説を元に検索すると、問題のポップアップ・メニュは;
  • 「Character Picker」
  • ApplePressAndHold
といった項目と関係が在るようでした。これらの検索から、次のディレクトリ;
  • /System/Library/Input Methods/PressAndHold.app/Contents/Resources/
にある言語ごとのplistによって規定される様です。英数入力時の「Character Picker」に修正を書けたければ、
  • Keyboard-en.plist
を変更する事に成ります。しかし、いくら検索しても、「Lionでのplistの設定法」の資料はありませんでした。でも、不思議な事に「iOS上でのplistの作成情報」は結構有る様でした。例えば;


そこで、Keyboard-en.plistのバックアップをとって、トライ&エラーで;
  • 制御文字: ⌃ ⌥ ⌘ ⇧ ⇥ ⇤ ⌫ ⌦ ↩ ⎋ 
  • ギリシャ文字
などを組み込んで見たので、以下に報告します。
Keyboard-en.plistの一番先頭に「A」の項が有るので引用します;

<key>Roman-Accent-A</key>
<dict>
<key>Direction</key>
<string>right</string>
<key>Keycaps</key>
<string>A À Á Â Ä Æ Ã Å Ā</string>
<key>Strings</key>
<string>A À Á Â Ä Æ Ã Å Ā</string>
</dict>


此れに対して、新たに定義した「g」の項は;


<key>Roman-Accent-g</key>
<dict>
<key>Strings</key>
<string>g \gamma γ \Gamma Γ</string>
</dict>

です。どうやら、Keyboard-en.plistの「Direction」タブや「Keycaps」タブはiOS由来であるものの、Lionでは盲腸のような存在らしい。今回は、新たに追加した設定については、この簡易設定で書いた。取り敢えず、Keyboard-en.plistKeyboard-en.plistをの全部分を示します;

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Roman-Accent-A</key>
    <dict>
        <key>Direction</key>
        <string>right</string>
        <key>Keycaps</key>
        <string>A À Á Â Ä Æ Ã Å Ā </string>
        <key>Strings</key>
        <string>A À Á Â Ä Æ Ã Å Ā </string>
    </dict>
    <key>Roman-Accent-C</key>
    <dict>
        <key>Direction</key>
        <string>left</string>
        <key>Keycaps</key>
        <string>C Ç Ć Č</string>
        <key>Strings</key>
        <string>C Ç Ć Č</string>
    </dict>
    <key>Roman-Accent-E</key>
    <dict>
        <key>Direction</key>
        <string>right</string>
        <key>Keycaps</key>
        <string>E È É Ê Ë Ē Ė Ę</string>
        <key>Strings</key>
        <string>E È É Ê Ë Ē Ė Ę</string>
    </dict>
    <key>Roman-Accent-I</key>
    <dict>
        <key>Direction</key>
        <string>left</string>
        <key>Keycaps</key>
        <string>I Î Ï Í Ī Į Ì</string>
        <key>Strings</key>
        <string>I Î Ï Í Ī Į Ì</string>
    </dict>
    <key>Roman-Accent-K</key>
    <dict>
        <key>Strings</key>
        <string>K  KeyRemap4MacBook</string>
    </dict>
    <key>Roman-Accent-L</key>
    <dict>
        <key>Direction</key>
        <string>left</string>
        <key>Keycaps</key>
        <string>L Ł</string>
        <key>Strings</key>
        <string>L Ł</string>
    </dict>
    <key>Roman-Accent-N</key>
    <dict>
        <key>Direction</key>
        <string>left</string>
        <key>Keycaps</key>
        <string>N Ñ Ń</string>
        <key>Strings</key>
        <string>N Ñ Ń</string>
    </dict>
    <key>Roman-Accent-O</key>
    <dict>
        <key>Direction</key>
        <string>left</string>
        <key>Keycaps</key>
        <string>O Ô Ö Ò Ó Œ Ø Ō Õ</string>
        <key>Strings</key>
        <string>O Ô Ö Ò Ó Œ Ø Ō Õ</string>
    </dict>
    <key>Roman-Accent-Q</key>
    <dict>
        <key>Strings</key>
        <string>Q ● ○ ◀ ▶ ▲ ▼ ◼ ◻</string>
    </dict>
    <key>Roman-Accent-S</key>
    <dict>
        <key>Direction</key>
        <string>left</string>
        <key>Keycaps</key>
        <string>S Ś Š</string>
        <key>Strings</key>
        <string>S Ś Š</string>
    </dict>
    <key>Roman-Accent-U</key>
    <dict>
        <key>Direction</key>
        <string>left</string>
        <key>Keycaps</key>
        <string>U Û Ü Ù Ú Ū</string>
        <key>Strings</key>
        <string>U Û Ü Ù Ú Ū</string>
    </dict>
    <key>Roman-Accent-W</key>
    <dict>
        <key>Strings</key>
        <string>W × ÷ ± ∓ ¬ ∩ ∪ ∝ ∞ ℵ ∀ ∃</string>
    </dict>
    <key>Roman-Accent-Y</key>
    <dict>
        <key>Direction</key>
        <string>left</string>
        <key>Keycaps</key>
        <string>Y Ÿ</string>
        <key>Strings</key>
        <string>Y Ÿ</string>
    </dict>
    <key>Roman-Accent-Z</key>
    <dict>
        <key>Direction</key>
        <string>right</string>
        <key>Keycaps</key>
        <string>Z Ž Ź Ż</string>
        <key>Strings</key>
        <string>Z Ž Ź Ż</string>
    </dict>
    <key>Roman-Accent-a</key>
    <dict>
        <key>Direction</key>
        <string>right</string>
        <key>Keycaps</key>
        <string>a à á â ä æ ã å ā \alpha α \Alpha A</string>
        <key>Strings</key>
        <string>a à á â ä æ ã å ā \alpha α \Alpha A</string>
    </dict>
    <key>Roman-Accent-b</key>
    <dict>
        <key>Direction</key>
        <string>left</string>
        <key>Keycaps</key>
        <string>b \beta β \Beta B</string>
        <key>Strings</key>
        <string>b \beta β \Beta B</string>
    </dict>
    <key>Roman-Accent-c</key>
    <dict>
        <key>Direction</key>
        <string>left</string>
        <key>Keycaps</key>
        <string>c ç ć č \psi ψ \Psi Ψ</string>
        <key>Strings</key>
        <string>c ç ć č \psi ψ \Psi Ψ</string>
    </dict>
    <key>Roman-Accent-d</key>
    <dict>
        <key>Strings</key>
        <string>d \delta δ \Delta Δ</string>
    </dict>
    <key>Roman-Accent-e</key>
    <dict>
        <key>Direction</key>
        <string>right</string>
        <key>Keycaps</key>
        <string>e è é ê ë ē ė ę \epsilon ε \Εpsilon Ε</string>
        <key>Strings</key>
        <string>e è é ê ë ē ė ę \epsilon ε \Εpsilon Ε</string>
    </dict>
    <key>Roman-Accent-f</key>
    <dict>
        <key>Direction</key>
        <string>left</string>
        <key>Keycaps</key>
        <string>f \phi φ \Phi Φ</string>
        <key>Strings</key>
        <string>f \phi φ \Phi Φ</string>
    </dict>
    <key>Roman-Accent-g</key>
    <dict>
        <key>Strings</key>
        <string>g \gamma γ \Gamma Γ</string>
    </dict>
    <key>Roman-Accent-h</key>
    <dict>
        <key>Direction</key>
        <string>left</string>
        <key>Keycaps</key>
        <string>h \eta η \Eta H</string>
        <key>Strings</key>
        <string>h \eta η \Eta H</string>
    </dict>   
    <key>Roman-Accent-i</key>
    <dict>
        <key>Direction</key>
        <string>left</string>
        <key>Keycaps</key>
        <string>i î ï í ī į ì \iota ι \Iota I</string>
        <key>Strings</key>
        <string>i î ï í ī į ì \iota ι \Iota I</string>
    </dict>
    <key>Roman-Accent-j</key>
    <dict>
        <key>Direction</key>
        <string>left</string>
        <key>Strings</key>
        <string>j \xi ξ \Xi Ξ</string>
    </dict>
    <key>Roman-Accent-k</key>
    <dict>
        <key>Direction</key>
        <string>left</string>
        <key>Strings</key>
        <string>k \kappa κ \Kappa K</string>
    </dict>
    <key>Roman-Accent-l</key>
    <dict>
        <key>Direction</key>
        <string>left</string>
        <key>Strings</key>
        <string>l ł \lambda λ \Lambda Λ</string>
    </dict>
    <key>Roman-Accent-m</key>
    <dict>
        <key>Direction</key>
        <string>left</string>
        <key>Keycaps</key>
        <string>m \mu μ \Mu M</string>
        <key>Strings</key>
        <string>m \mu μ \Mu M</string>
    </dict>
    <key>Roman-Accent-n</key>
    <dict>
        <key>Direction</key>
        <string>left</string>
        <key>Keycaps</key>
        <string>n ñ ń \nu ν \Nu N</string>
        <key>Strings</key>
        <string>n ñ ń \nu ν \Nu N</string>
    </dict>
    <key>Roman-Accent-o</key>
    <dict>
        <key>Direction</key>
        <string>left</string>
        <key>Keycaps</key>
        <string>o ô ö ò ó œ ø ō õ \omicron \Omicron</string>
        <key>Strings</key>
        <string>o ô ö ò ó œ ø ō õ \omicron \Omicron</string>
    </dict>
    <key>Roman-Accent-p</key>
    <dict>
        <key>Direction</key>
        <string>left</string>
        <key>Keycaps</key>
        <string>p \pi π \Pi Π</string>
        <key>Strings</key>
        <string>p \pi π \Pi Π</string>
    </dict>
    <key>Roman-Accent-q</key>
    <dict>
        <key>Strings</key>
        <string>q ⌃ ⌥ ⌘ ⇧ ⇥ ⇤ ⌫ ⌦ ↩ ⎋ </string>
    </dict>
    <key>Roman-Accent-r</key>
    <dict>
        <key>Direction</key>
        <string>right</string>
        <key>Keycaps</key>
        <string>r \rho ρ \Rho Ρ 📻 </string>
        <key>Strings</key>
        <string>r \rho ρ \Rho Ρ 📻</string>
    </dict>
    <key>Roman-Accent-s</key>
    <dict>
        <key>Direction</key>
        <string>right</string>
        <key>Keycaps</key>
        <string>s ß ś š \sigma σ \Sigma Σ</string>
        <key>Strings</key>
        <string>s ß ś š \sigma σ \Sigma Σ</string>
    </dict>
    <key>Roman-Accent-t</key>
    <dict>
        <key>Strings</key>
        <string>t \tau τ \Tau T</string>
    </dict>   
    <key>Roman-Accent-u</key>
    <dict>
        <key>Strings</key>
        <string>u û ü ù ú ū \theta θ \Theta Θ</string>
    </dict>
    <key>Roman-Accent-v</key>
    <dict>
        <key>Strings</key>
        <string>v \omega ω \Omega Ω</string>
    </dict>
    <key>Roman-Accent-w</key>
    <dict>
        <key>Strings</key>
        <string>w ↔ ← → ↖ ↘ ↕ ↑ ↓ ⇞ ⇟</string>
    </dict>
    <key>Roman-Accent-x</key>
    <dict>
        <key>Direction</key>
        <string>left</string>
        <key>Keycaps</key>
        <string>x \chi χ \Chi X</string>
        <key>Strings</key>
        <string>x \chi χ \Chi X</string>
    </dict>
    <key>Roman-Accent-y</key>
    <dict>
        <key>Strings</key>
        <string>y ÿ \upsilon υ \Upsilon Υ</string>
    </dict>
    <key>Roman-Accent-z</key>
    <dict>
        <key>Strings</key>
        <string>z ž ź ż \zeta ζ \Zeta Ζ</string>
    </dict>
    <key>UI-ABC</key>
    <string>ABC</string>
    <key>UI-Cancel</key>
    <string>Cancel</string>
    <key>UI-Confirm</key>
    <string>confirm</string>
    <key>UI-Dismiss</key>
    <string>dismiss</string>
    <key>UI-Done</key>
    <string>Done</string>
    <key>UI-EmergencyCall</key>
    <string>Emergency
Call</string>
    <key>UI-Go</key>
    <string>Go</string>
    <key>UI-HWR</key>
    <string>Handwriting</string>
    <key>UI-Join</key>
    <string>Join</string>
    <key>UI-Kana</key>
    <string>Kana</string>
    <key>UI-LanguageIndicator</key>
    <string>English</string>
    <key>UI-Next</key>
    <string>Next</string>
    <key>UI-NextCandidate</key>
    <string>next</string>
    <key>UI-Numbers</key>
    <string>123</string>
    <key>UI-NumbersSymbols</key>
    <string>.?123</string>
    <key>UI-Pause</key>
    <string>pause</string>
    <key>UI-Wait</key>
    <string>wait</string>
    <key>UI-Pinyin</key>
    <string>Pinyin</string>
    <key>UI-Redo</key>
    <string>redo</string>
    <key>UI-Return</key>
    <string>return</string>
    <key>UI-Romaji</key>
    <string>QWERTY</string>
    <key>UI-Route</key>
    <string>Route</string>
    <key>UI-Search</key>
    <string>Search</string>
    <key>UI-Send</key>
    <string>Send</string>
    <key>UI-Simplified</key>
    <string>Simplified</string>
    <key>UI-Space</key>
    <string>space</string>
    <key>UI-Standard</key>
    <string>Standard</string>
    <key>UI-Undo</key>
    <string>undo</string>
</dict>
</plist>
上記設定の「Character Picker」を表にした;


TextEditでの「e」を押し続けた時の「Character Picker」応答は;

 と間延びしてしまう。これはギリシャ文字のTeX表現「\epsilon」等を入れた為である。

なお、ローマ字とギリシャ文字の対応は、Greekに対する「Keyboard Viewer」での対応に合わせた。


【感想】
  • 駄目元で作成したものの、意外と使い勝手がいい。
  • 通常のエディタ(TextWrangler)でも使えるとどうなるか興味深い。
    • と思っていたが、先ほど無意識に長押しを居ていたら「Character Picker」が動いていた。素晴らしい!
  • 数字キーへのアサインメントはポップアップ・メニュが振動して使えない。なぜだろうか?

関連のページ

  1. 修飾キーの辞書登録
  2. 「Mac_pico_tips/欧文文字のアクセント入力」の収録
————
  1. 開始 2013-06-30(日) 16:58:25 
  2. 追加 2013-07-01(月) 15:49:58  
  3. 追加 2013-07-01(月) 17:53:38  エディタ(TextWrangler)でも「Character Picker」は作動した!

2013-06-19

KeyRemap4MacBookの導入、その19: SandS とKeyOverlaidModifier

此れまでに「flipped around Apple Wireless Keyboard」の大まかな設定は、
で報告してある通りだ。この設定は、単一の.xml;
  • ~/Library/Application Support/KeyRemap4MacBook/flipped_around_Apple_WK.xml
に記述していた。

今回は、其の設定に「SandS: Space & Shift」の機能を、別途、SandS_fn.xmlに書き込み、flipped_around_Apple_WK.xmlからincludeさせて動作させたので、報告する。

なお、参考にしたのは、

  • KeyRemap4MacBookの「Change Space Key」の実例、特に、
  • Space to Shift (+ When you type Space only, send  Space) Fn+Space to Space
このxmlのソース・コードは、ご自分のKeyRemap4MacBookの下にあるspace.xmlの行62~69に記述されている;
  • /Applications/KeyRemap4MacBook.app/Contents/Resources/include/checkbox/standards/space.xml
其の部分だけ引用させて頂きますと;

    <item>
      <name>Space to Shift_L</name>
      <appendix>(+ When you type Space only, send Space)</appendix>
      <appendix>Fn+Space to Space</appendix>
      <identifier>remap.space2shiftL_space_fnspace</identifier>
      <autogen>__KeyToKey__ KeyCode::SPACE, ModifierFlag::FN, KeyCode::SPACE</autogen>
      <autogen>__KeyOverlaidModifier__ KeyCode::SPACE, KeyCode::SHIFT_L, KeyCode::SPACE</autogen>
    </item>


関連ファイルの状況を、Finderにより、図1に示す;

Figure 1. Related files in a Finder

KeyRemap4MacBookの[Change Key]の設定の状況を図2a,bに示す;

Figure 2a. SandS_fn in [Change Key] of KeyRemap4MacBook.
Figure 2b. flipped_around_Apple_WK.xml includes SandS_fn.xml.


今回のSandSのxmlは先に述べたように「Change Space Key」記載のxmlから修正したもので、図3に示す;

Figure 3. SandS_fn.xml


ここで、赤い色の注釈部分がSandSの主要部分であり、「___KeyOverlaidModifier__」により構成されていて、其のキー・コード意味は順番に;

「F6」だけが押し下げされると、SandSと認識する設定。
「OverlaidModifier」として「Shift_L」と設定。
「SandS short-clic」の場合は、「Space」送出の設定。


詳しいキー挙動は、EventViewerでの記録として、図4に示す;


Figure 4. EventViewer for "Normal Shift_R & Normal Space" and "SandS with Fn".

青い注釈部分が、"Normal Shift_R & Normal Space"に対応する。スペースのような実入力キーのeventTypeは「keyDown/Up」に対応するが、修飾キーの一つである「シフト」のそれは

赤い注釈部分が"SandS with Fn"にに対応し、三つのモードがある;

  • 「SandS short-clic」:キー挙動は「Space: 黄緑の縦棒部分」
    • 青い部分が直列に作動しているのと同じ挙動を示している。
  • 「SandS long-click」: キー挙動は「Shift_L: 黄の縦棒部分」KeyOverlaidModifier: 黒の縦棒に対応。
  • 「SandS long-click」は、図5の "【key Overlaid Modifier】Timeout"より長くF6の押し下げ在る時に発生する。
  • 「Sand with Fn」:キー挙動は「Space: 黄緑の縦棒部分」 
    • Spaceが連続的に送出されているのが見えている。

KeyRemap4MacBookの「Key Repeat」タブを図5に示す;

Figure 5. Key Repeat tab of KeyRemap4MacBook.


長い事、機能が判らなかったKeyOverlaidModifierが明瞭に理解出来たので、次の課題としては、「Mouse Key」を調べたい。

————

  1. 開始 2013-06-19(水) 10:56:24 
  2. 追加 2013-09-18(水) 14:31:05 space.xmlのディレクトリとSandS部分の直接引用

2013-06-11

KeyRemap4MacBookの導入、その18: private.xmlとinclude

KeyRemap4MacBookで制御するべき周辺機器が多くなってきたので、private.xmlも機器ごとに分割しないと、修正部分が複雑になってミスを犯し易くなったり、修正部分が判り難くなったりする。

private.xmlの分割は、includeタグによって実現される。実際にKeyRemap4MacBookのFinder情報は;

Fig.1 ~/Library/Application Support/KeyRemap4MacBookのFinder情報


今回は、private.xmlと同じ階層にあるディレクトリ、INCLUDE_for_private_xmlにある個別のxmlをprivate.xmlが呼び出す階層構造としてみた;

Fig.2 private.xmlでのincludeタグによる個別のxmlの呼び出し
上記の「path」設定では、private.xmlからの相対パスで書かれている事に注意して欲しいまたincludeの順番に従ってリロードされている(下図3.1と比較すると判る)。

さて、KeyRemap4MacBookのPreferences設定で、「K811のflipped around mode(standard mode)」を選択した際のチェック状況を下図3.1で緑色のボックスで示します。

Fig.3.1 Private.xml check status for K811 standard mode of flipped around.


他方、「K811のF1キーとの"2-key rollover test mode"」での設定を示します;

Fig.3.2 Private.xml check status for K811's 2-key rollover test mode with F1-key.


これらのモード切り替えは、KeyRemap4MacBookのプルダウン・メニュで行う;

Fig.4 Mode change are in the pull-down menu of KeyRemap4MacBook on Status Bar

上記のモード自体の設定は、下図5のようにする;

 Fig.5 Mode prifile is set at [MenuBar] of KeyRemap4MacBook on Status Bar

————
  1. 開始 2013-06-11(火) 22:17:09 
  2. 追加 2013-06-12(水) 10:45:57 Fig.5

2013-06-05

JavaScriptのDebugger

JavaScriptの練習に並行して、デバッガについて調べて見た。昔、FirefoxでFireburgというアド・オンを入れてみたものの、フォントが小さすぎて使えなかった経験があるからだ。

そこで、日常的に使っている、Firefox, Safariを調べて見ると、昔と同じで「小さな固定フォントだけ」なので愕然とした。他方最近、「JavaScriptをターミナルで走らせる」という検索をしたとき、「Google Chrome」のデバッガの解説が豊富にあるようなので、久しぶりに「Version 27.0.1453.110」を入手してみた。

デバッガは「⌥⌘j」で呼び出せる。



デバッガの後にあるウェブのフォントと比べると、デバッガのフォントは情けない程に小さい。駄目元で「⌘+」をすると、なんとデバッガのフォント・サイズは増大する! 適当に見好いサイズにすると;



という訳で、「近眼・老眼」な私に取って、「Google Chrome」のデバッガ(debugger)は有難いツールになりそうです。なお、フォントの増大/減少は「⌘+/-」でできました。


————
  1. 開始 2013-06-05(水) 10:50:39 

2013-05-31

"Quick Look"からjQueryへ

取り留めの無い話の様ですが、意外な関連があります。"Quick Look"に興味が湧いたのは、KeyRemap4MacBookのキー操作の図面をキー入力一発で引き出せるかをトライしていた時です。

始めには、"Quick Look"をターミナル経由で呼び出せれば善いと考えて、調べて見たのですが、良く判りませんでした。そこで、アップルのサポート・コミュニティ、「Mac mini」のフォーラムで質問しました;
そこで判ったのは"Quick Look"に対応するコマンドは、敢えて言えば「qlmanage」だけれど、デバッグ用に作られているので、使い勝手は悪いよ、という結論でした。

これを説明下さったHiro.Sさんが、AppleScriptから"Quick Look"で画像ファイルを表示する手法をお教え下さったのですが、自分には馴染めませんでした。

逆に「qlmanage」でiTunesで演奏中の歌詞を、Dashboardに移動する事無く、現在のデスクトップ中に表示する方法をお示しになり、常連のHALさんとの活発な論議が起こりました。

他方私は、最近CDを聴くよりも、性能が向上したCALMRADIO.COMを聴く頃が多いです。そのとき、iTunesの情報窓では;
  • スクロールする上、
  • フォントも小さく、
  • 直ぐに見えない
という不満があったので、「2013/05/11 11:37」に質問をさせて戴きました。此れに対する質疑応答から、「AppleScript Editor」を触りだして、AppleScriptからiTunesを操作する感じが、朧げながら判る感じがしてきました。

そんな最中、Hiro.Sさんから、2013/05/12 14:18に「(* Radio の情報をリストファイルに書き出す iTunes用 AppleScript……」というスクリプトの公開がありました。私には、こんなに簡単に望んだデータを引き出して、表に出来るのかと驚きました。

このころは、ファイルをエディタで開けて見るという単純な方法でした。でも、作業中に興味ある音楽が出てくると.appにしたアイコンをクリックするだけで情報がセーブできたり、眺めたり出来て、心理的にも充足感が高まりました。
  • 意外な局が面白かったり、
  • 全然知らないけれど興味の在る曲が判って、版元も検索出来たり。
  • 好きだけど名前の知らない曲が判明したり。
  • 知らない演奏家だけど善い音楽家を知ったり。

そのうちに、区切り記号を「tab:\t」にして、ファイル名を.tsv(tab-separated values)とするだけで、エディタで開かずとも"Quick Look"で、そこそこ見易く表示出来る事が判りました。

ところが、Hiro.Sさんから「2013/05/19 15:25」に「Javascript Bookmarklet」を使っって、ソート付きのHTMLの紹介がありました。これには衝撃的な印象を受けました。ブラウザを表示先とすれば、"Quick Look"の様に、データの損傷はなく、余計なボタンもなく、必要なデータをキーボードから直接呼び出せることになるからです。

で、急遽「ソートできる表」という観点から検索をしてみると「jQuery」というJavaScriptのツール群様のプラグ・インのjquery.csv2table.jsを使えば、「容易に・奇麗に・動的な表示」が可能らしいとわかりました。
まだ自分では使い方が判っていないのですが、師匠のHiro.Sさんにご教示を受けて使っています。

と言う様な、紆余曲折を経て、
  • "Quick Look: 静的" → ブラウザ + jQuery + csv2table.js: 動的
の旅が収束したと言う訳です。

____
この記事の履歴
  1. 開始 2013-05-31(金) 12:04:18 


2013-05-19

How to represent tab(\t) at sed command in bash script of os x

最近「tsp:tab-separated values」で、タブ(tab, \t)を他の文字列にする必要が有った。簡単に思えたが、ほとんどの「os x」に搭載された「bash中のsed」ではそう簡単でない事が判った。今後の為に纏めて置く。

以下に、説明の為に作成したスクリプト;

#!/bin/bash

#set -x

echo "=== $(basename $0): how to present tab in sed"
echo -e "== for $(bash --version | grep version)\n"

org="pqr    stu" # rとsの間にはタブ

echo "■ 次の原稿には、rとsの間にはタブがある;"
echo "  0.---「${org}」"

echo
echo  "■ タブをバレットに変えようとして、"
echo '■ 「sed -e "s/\t/•/"」にパイプしても、'
echo  "■ タブは其の儘で「t」が消えるだけ;"
echo "  1.---「${org}」"  | sed -e "s/\t/•/"


echo
echo  "■ タブを表す変数を生成する"
echo  '■ 方法1: t1="‹タブ押す›'
echo  '■ 方法2: t2=$(echo -e "\t\c")'
echo  '■■ 両者は等しい'

t1="    " #実際に「tab-key」を押した。
t2=$(echo -e "\t\c")

echo
echo '■ 「sed -e "s/${t1}/•/"」にパイプすると、タブは•に替わる'
echo "  2.---「${org}」"  | sed -e "s/${t1}/•/"

echo
echo '■ 「sed -e "s/${t2}/•/"」にパイプしてもOK'
echo "  3.---「${org}」"  | sed -e "s/${t2}/•/"

echo


echo ■ 参考資料に従って、1.の「'\'t」を「'"$'\''\t'\''"'」に書き換えて
echo '■ 「sed -e "s/"$''\t''"/•/"」にパイプしても、タブは•に替わる'
echo "  4.---「${org}」"  | sed -e "s/"$'\t'"/•/"

echo
echo ■ 同じ参考資料に従って、.bash_profileで「export mytab='$'\''\t'\'」と定義したので
echo '■ 「sed -e "s/$mytab/•/"」とパイプしても、タブは•に替わる'
echo "  5.---「${org}」"  | sed -e "s/$mytab/•/"
echo
echo 「上記、5.の方法が覚え易いし、安全だろう」

echo
echo "=== $(basename $0): end"

其の動作結果を示す;

u1@mmX75:~ $ test_tab
=== test_tab: how to present tab in sed
== for GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin11)

■ 次の原稿には、rとsの間にはタブがある;
  0.---「pqr    stu」

■ タブをバレットに変えようとして、
■ 「sed -e "s/\t/•/"」にパイプしても、
■ タブは其の儘で「t」が消えるだけ;
  1.---「pqr    s•u」

■ タブを表す変数を生成する
■ 方法1: t1="‹タブ押す›
■ 方法2: t2=$(echo -e "\t\c")
■■ 両者は等しい

■ 「sed -e "s/${t1}/•/"」にパイプすると、タブは•に替わる
  2.---「pqr•stu」

■ 「sed -e "s/${t2}/•/"」にパイプしてもOK
  3.---「pqr•stu」

■ 参考資料に従って、1.の「\t」を「"$'\t'"」に書き換えて
■ 「sed -e "s/"$\t"/•/"」にパイプしても、タブは•に替わる
  4.---「pqr•stu」

■ 同じ参考資料に従って、.bash_profileで「export mytab=$'\t'」と定義したので
■ 「sed -e "s/$mytab/•/"」とパイプしても、タブは•に替わる
  5.---「pqr•stu」

「↑の5.の方法が覚え易いし、安全だろう」

=== test_tab: end
u1@mmX75:~ $
 
【結論】 sedのなかで「\t」を使いたくなったら「$mytab」に置き換えるべし。

.bash_profileでの該当部分は;
export LANG=ja_JP.UTF-8
export mytab=$'\t'

【参考資料】
  1. http://mattintosh.hatenablog.com/entry/2013/01/16/143323
  2. bash Pocket Reference, O'REILLY, ISBN: 978-1-449-38788-4, p11, $' '
—————
この記事の履歴
  1. 開始 2013-05-19(日) 21:22:30 
  2. 修正 2013-05-20(月) 10:57:34 .bash_profile

2013-05-10

indented-text handling by using echo and here-document of bash on os x lion

KeyRemap4MacBookの調整の時に、動的に替わるxmlや複雑なxmlを作る事が多くなって来た。一般に、xmlが多量になるとインデント(indent)を確実にしないと、見通しが極度に低下する。更にKeyRemap4MacBookの特殊性として、「<autogen>タブ階層構造」と「<item>タブの階層構造」とが別々に意味を持つので、正しくインデントの必要性が高まって来た。

これらの「インデントされたテキスト(indented text)」を生成するときには、エスケープ・シークエンス(escape sequences)による出力 ;
  • 「エスケープ・シークエンスのオプションの付いたエコー・コマンド」
    • echo -e "\tHoge.$JJJ hoge\n"
を使っていた。しかし、量が増えて来たり、変数(variable, $JJJ)が入ってくると、作り間違えが急造して、修正が大変になってしまう。

そこで、不得意な「ヒア・ドキュメント(here document)」を使った具体例、echo_and_here-documentを作製したので、以下に説明する。なお、変数(variable, $JJJ)の処理は最後に触れます。

u1@mmX75:~/bin $ cat echo_and_here-document
#!/bin/bash

ex5() {

# EXAMPLE 5: basic "here document" wrapped in function, ex5    ###########
JJJ=$((JJJ+1))
cat <<EOF

<!-- EXAMPLE $JJJ: basic "here document" wrapped in function, ex5 -->
    <abc>
        efg, hij
    </abc>
   
EOF

}

################ Main ####################################################
echo  "$(basename $0): start"


# EXAMPLE 1: direct "echo with -e option" ################################
JJJ=1
echo -e "\n<!-- EXAMPLE $JJJ: simple \"echo with -e option\"\c"
echo -e " -->\n\t<abc>\n\t\tefg, hij\n\t</abc>"

# EXAMPLE 2: basic "here document" #######################################
JJJ=$((JJJ+1))
cat <<EOF

<!-- EXAMPLE $JJJ: basic "here document" -->
    <abc>
        efg, hij
    </abc>
   
EOF

# EXAMPLE 3: command substitution includes "here document" ###############
JJJ=$((JJJ+1))
ex3="$(
cat <<EOF

<!-- EXAMPLE $JJJ: "here document" included
                 by "command substitution:\$(...)"
                 and saved to variable, \$ex3.-->
    <abc>
        efg, hij
    </abc>
   
EOF
)"
echo "$ex3"

# EXAMPLE 4: basic "here document" redirect file, ex4. ###################
JJJ=$((JJJ+1))
cat <<EOF > ex4

<!-- EXAMPLE $JJJ: basic "here document" redirects to file, ex4 -->
    <abc>
        efg, hij
    </abc>
   
EOF
cat ex4
rm -f ex4

# EXAMPLE 5: basic "here document" redirect file in function ex5. ########
ex5 # just call function, ex5


# EXAMPLE 6: basic "here document" redirect file
#                 in external function ex6 at myUtuities ########
. myUtilities
ex6 # just call function, ex6

echo ""
echo "============= myUtilities ====================="
cat $HOME/bin/myUtilities | sed -e "s/^/contents: /"
echo "==============================================="

################ Main ####################################################
u1@mmX75:~/bin $


この実行結果は;

u1@mmX75:~ $ echo_and_here-document
echo_and_here-document: start

<!-- EXAMPLE 1: simple "echo with -e option" -->
    <abc>
        efg, hij
    </abc>

<!-- EXAMPLE 2: basic "here document" -->
    <abc>
        efg, hij
    </abc>
   

<!-- EXAMPLE 3: "here document" included
                 by "command substitution:$(...)"
                 and saved to variable, $ex3.-->
    <abc>
        efg, hij
    </abc>
   

<!-- EXAMPLE 4: basic "here document" redirects to file, ex4 -->
    <abc>
        efg, hij
    </abc>
   

<!-- EXAMPLE 5: basic "here document" wrapped in function, ex5 -->
    <abc>
        efg, hij
    </abc>
   

<!--
    EXAMPLE 6: basic "here document" wrapped
    in function, ex6() at external file, myUtilities
-->   
    <abc>
        efg, hij
    </abc>
   

============= myUtilities =====================
contents: #!/bin/bash
contents:
contents: ex6(){
contents:
contents: # EXAMPLE 6: basic "here document" wrapped in function, ex6 at myUtulities    ###########
contents: JJJ=$((JJJ+1))
contents: cat <<EOF
contents:
contents: <!--
contents:     EXAMPLE $JJJ: basic "here document" wrapped
contents:     in function, ex$JJJ() at external file, myUtilities
contents: -->   
contents:     <abc>
contents:         efg, hij
contents:     </abc>
contents:    
contents: EOF
contents: }
===============================================
echo_and_here-document: end
u1@mmX75:~ $

使った感想としては、利用目的に応じて;
  • 超簡単なら、EXAMPLE1
  • 簡単なら、EXAMPLE2
  • 繰り返しの利用なら、EXAMPLE3
  • ファイルとして保存なら、EXAMPLE4
  • 開発途中のファイルなら関数が使いよいかも、 EXAMPLE5
  • 開発が終わって、共通なユーティリティ・ファイルにするのもよい、EXAMPLE6
といった感じです。KeyRemap4MacBook関係では、圧倒的にEXAMPLE5らしそうです。

最後に変数(variable, $JJJ)の定義と演算ですが;
  • 数値代入:JJJ=5
  • 数値演算:KKK=$((JJJ*2))
実例;

u1@mmX75:~ $ JJJ=5
u1@mmX75:~ $ KKK=$((JJJ*2))
u1@mmX75:~ $ echo -e "\tJJJ=$JJJ, KKK=JJJ*2=$KKK"
    JJJ=5, KKK=JJJ*2=10
u1@mmX75:~ $

感想
  •  自信を持って、明確にヒア・ドキュメントを使えるようになった。
  • 「echo -e」の解説; 下記の本の「p71,72」が簡明で、その様に動作した。
    • Arnold Robbins, "bash Pocket Reference", O'REILLY, 2010
    •  ISBN: 978-1-449-38788-4 
  • 動作環境
    • Mac mini (mid 2011), Lion 10.7.5
    • bash --version
      • GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin11)
____
この記事の履歴
  1. 開始 2013-05-10(金) 14:57:11 
  2. 修正 2013-05-12(日) 02:30:18 
  3. 追加 2013-05-13(月) 17:11:01 EXAMPLE6

注目の投稿

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

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