2016-05-30

zsh: JavaScripを使って「Terminal.appのカラムや行」を設定する

zsh: JavaScripを使って「Terminal.appのカラムや行」を設定する
zsh: To sett columns and raws of Terminal.app by using JavaScript

経緯


JavaScriptを練習するのに、スクリプト・エディタを使っています。さらにTerminalに於いてjscを使っています。
  • /System/Library/Frameworks/JavaScriptCore.framework/Versions/A/Resources/jsc
  • OS: Yosemite  10.10.5 (14F1808)
その練習課題として、Terminal.appの設定を作ってみようと考えました。検索すると最適なスクリプトがありました;

これを基にして、"Script Editr"の”Window nenu -> Library”からTerminal.appを見ながら、完全設定をしようと思いましたが、なんと肝心んな16色のカラー設定やフォントの文字間隔、行 間隔の設定の項目が無くて、頓挫しました。

次の総括的な解説中の「コマンド・ライン引数の使用」を参考して、zshのスクリプト(txy)を作りました。

このスクリプトは、terminal作業の処理を次々にスクリーン・ショットに保存していくときに、意外と便利なので紹介します。



動作例


図1はターミナルが呼ばれた直後です。最後の設定(幅77x行10)となっています。
Figure 1 Just opened Terminal which preserve precious columns & raws.

そこで「% txy 80↩️」とすると幅だけが80に変わり、図2のように(幅80x行10)となります。
Figure 2. "txy 80" re-sized only columns to 80.

さらに 「% txy 82 22↩️」とすると幅と行が同時に変わり、図3のように(幅82x行22)となります。
Figure 3. "txy 82 22" re-sized columns & raws to (82x22)

最後に「% txy↩️」とすると規定値(幅80x行40)となります、図4.
Figure 4. "txy" re-sized to dafaut value (80x40).





スクリプト: txy


#!/bin/zsh 

# txy: default terminal resized to x*y
#           X: Number of columns for default Terminal.app
#           Y: Number of rows for default Terminal.app
# USAGE:
#         txy↩  -----> (80*40)     : defaut  ----------------------> Fig. 4
#         txy X↩   --> (X*Y0)      : Y0='previous value'  ---------> Fig. 2
#         txy X Y↩  -> (X*Y)       : set both of columns*raws  ----> Fig. 3. 
#         terminal opens with previous columns*raws:  ------------- > Fig. 1
    # 2016-05-07(土) 12:36:43  by mNeji
    # 2016-05-12(木) 11:55:07 set_JS, get_JS


###############################################################################
set_JS() {
# Execute $JS as Javascript. Throw unwanted output away to /dev/null
    osascript -l JavaScript -e "$1" > /dev/null
}

###############################################################################
get_JS() {
# Execute $JS as Javascript. The output is printed on standard output(screen)
    osascript -l JavaScript -e "$1"
}


########################### main ##############################################
# Reading current setting (X0•Y0) & display:
    td="Application('Terminal').defaultSettings"
    X0=$(get_JS "$td.numberOfColumns()")
    Y0=$(get_JS "$td.numberOfRows()")
    echo -n "terminal current: (${X0}x$Y0)  -->"

# Setting: (X, Y)
    case $# in
        0) X=80; Y=40;;
        1) X=$1; Y=$Y0;;
        2) X=$1; Y=$2;;
        *) X=$1; Y=$2;;
    esac

# Prepare JavaScript block for default Terminal Setting: ($X, $Y) 
    XYdataBlock="
    trmd =     Application('Terminal').defaultSettings
        trmd.numberOfColumns = $X
        trmd.numberOfRows = $Y
    "
    set_JS "$XYdataBlock"
    echo " resized: (${X}x${Y})\a"



zshで「osascript -l JavaScript -e JavaScript-commands」を使えば、JavaScript-commandsが実行できます。問題は、JavaScript- commandsは設定値を常時標準出力に出すことです。このような場合には「set_JS」関数を呼び出して、不要な出力を/dev/nullに捨てて います。
  • 例1)
    • set_JS "$XYdataBlock"

逆に、設定を読み取りたいコマンドの場合は、「get_JS」関数により出力させて、それを変数に代入させています。
  • 例2)
    • X0=$(get_JS "$td.numberOfColumns()")


感想


自力でアプリケーションのPreferencesを操れてうれしい。JavaScriptをshellの一つとして「#!/bin/javascript」とか「#!/bin/jsc」とか出来ないか? それとも「#!/bin/swift」の方が早かったり?


この記事の履歴
  1. 開始 2016-05-30(月) 23:18:39


2016-05-27

/Volumes内のドライブのUUIDをリストするスクリプト

5日ほど前に、Yosemiteで 「Update 2016-003」を実施しました。その後3日ほどしてから、DiskUtilで見ると、システム・ドライブの表示順序が不規則に入れ替わるようになりま した。「Apple サポート・コミュニティ: Mac OS X Technologies(Japan)」でこの現象を質問中です。
少なくとも「/etc/fstab」に「ドライブ毎に、UUID、種類、名前」をリストする必要があるようです。そこで、/Volumesの中にあるドライブのUUIDをリストするスクリプト、uuidsを作ったのでご紹介します。


terminalでの動作結果
Figure uuids action at terminal



スクリプト: uuids

#!/bin/zsh 
#
# uuids: list UUIDs in /Volumes/*
#
# USAGE: uuids↩
#_
# 2016-05-27(金) 18:11:14 
#
 
get_uuid(){
 #diskutil info "$1" | grep "Disk / Partition UUID:" | sed 's%[^0-9A-Z-]%%g' 
 diskutil info "$f" |grep 'Disk / Partition UUID:' |\
  sed 's%Disk / Partition UUID:    %%' | tr -d ' '  
}
 
 
mylc=( ${(f)"$(ls  /Volumes )"} )

echo "  #  UUIDs in /Volumes                      Drive Names"
echo " --  ------------------------------------  -----------------------------"
 
j=$((0))
for f in ${(O)mylc} ; do
 j=$((j+1))
  
 myu=$(get_uuid "$f")
 
  printf " %2d  %s  %s\n" $j $myu $f
done


この記事の履歴
  1. 開始2016-05-27(金) 23:18:54

注目の投稿

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

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