GLib(PyGObject) Tips

内容が古いと解っていながら放置していた PyGObject Tips 以下。
整理したり文字列の fstring 化等をやってとりあえず GLib のページだけ。
GLib(PyGObject) Tips – L’Isola di Niente

それでは寂しいので GIOChannel 関連を Gjs のページからもってくる。
GIOChannel(PyGObject) Tips – L’Isola di Niente

いざ書き換えしてみたらマジで内容が古かった、こりゃアカン。
盆休みくらいまでには全部書き換えしたいな、ポケ GO も飽きたし。

PyGObject で作りたいものは今は無いけどページを作っていたら何か思い付くかも。
PyObjC では実はあるんだけど手段で詰まってアプリもページも止まっていることは内緒。
zsh 関連は次の macOS アップデートから再開、今やってもなぁって感じだし。

しかし Python を始める人が増えた感じだよね。
C 言語のポインタを理解できない人がオブジェクトなんて理解できるのか疑問なんだけど。
Python でアプリが作れる人って実は C でも作れるけど面倒だから Python を使っている。
っていう人しかいないんだよね。

Open Terminal in Atom and Gedit

macOS 上の Atom で Terminal.app を一発で開きたい。
もちろん編集中ファイルの位置をカレントディレクトリにして。
Gedit, VScode には最初からその機能があったけど Atom には無いのね。

早速拡張をインス、、、、、なんてしないよ。
拡張のインストールネタをやっている輩は何もアプリが作れない人だけです(暴言)
プログラミングの実力は経験値だけなのに他人が作ったものに頼っている時点でねぇ。

それと Atom ウインドウ内部で開くターミナルを勧めている輩は何だよ。
debug 目的なんだから別プロセスにしなきゃ困るだろ、と思うんだが。
って、それは別の話ということで。

Atom は Node.js 製なので child_process.exec が使える。
Gjs, jjs, JXA, Node.js – L’Isola di Niente
後はカレントディレクトリを得る手段さえ解ればアッサリ作れるはず。

いや、coffeescript という Atom の拡張以外の使い道が思いつかない言語が。。。。。
世の中にはレールなんとか以外の使い道がゼロの言語を推すみたいな人もいるけどさ。
面倒だ、既存拡張のソースを見てしまえ!

GitHub – blueimp/atom-open-terminal-here: Open the Terminal (Mac OS X, Linux) or Command Prompt (Windows) in the given directory via context menu or keyboard shortcut in the Atom text editor.

index.coffee を見る。
child_process.exec は coffeescript ではこう書けばいいのか。
atom.workspace.getActivePaneItem() から辿って編集中パスが得られるようだ。
x-terminal-emulator って何かと調べたらサル専用ディストリだけじゃん。
サルブンツ以外の Linux 使いは結局自分で作らないといけなかったわwwwww

そういえばテンプレートリテラルは coffeescript ではどう描くの?
Template literals in Coffeescript (Example)
ダブルクォートとシャープって何よ、JS と同じバッククォートとドルでいいじゃん。
従うしかないけーが、ダブルクォートのエスケープめんどいな。

Atom を Gedit のように使う – L’Isola di Niente
これに追記する。

init.coffee

atom.commands.add 'atom-text-editor', 'editor:open-terminal', ->
    path = atom.workspace.getActivePaneItem()?.buffer?.file?.path
    dirname = require('path').dirname(path)
    require('child_process').exec "open -a Terminal \"#{dirname}\""

keymap.cson

'atom-workspace atom-text-editor:not([mini])':
    #etc...
    'alt-cmd-t': 'editor:open-terminal'

command+option+T で Terminal.app を開く機能追加おしまい。
ほとんどコピペだけどこの手段が解ってしまえば応用もできるし書き方も覚えた。
経験値はこんなことの積み重ねです。

ちなみに筆者は自前拡張呼び出しは command+option+* に統一している。
Gedit では Ctrl+Alt+* と同じように統一している。
Gedit 及び Eye of Gnome プラグイン – L’Isola di Niente
そうでもしないと自分で指定したはずのキーを結構忘れるんですよコレが。
拡張を沢山インストールって人は他人が決めたキーを全部覚えるのだろうか?

おまけ。

Gedit にこの機能は最初からあるけど 3.32 は起動すると stderr を吐く。
端末から gnome-terminal と打って起動すれば同じ stderr を吐くのが解る。
ということで標準の外部ツールを書き換えしましょう。

#!/bin/sh

gnome-terminal --working-directory=$GEDIT_CURRENT_DOCUMENT_DIR > /dev/null 2>&1 &

Ctrl+Alt+T にして入出力はすべて無しに。
これで stderr の赤い出力が出なくなるのでボトムパネルも開かなくなります。

(bash|zsh) array and for

zsh の for は何か bash と違うと思ったら
どうやら zsh では isf 区切りではなく配列を使うようだ。
先に配列について調べておく必要があるな。

zsh の配列操作の基本から応用まで – Qiita

配列は [1] から始まるんかい。
lua なんかもそうだけど何故ゼロにしなかったのか。
bash と整合性が、、、、、
って bash では isf 区切りが基本すぎて誰も使っていないと思うけーが。

シェルスクリプトの文字列と配列 – L’Isola di Niente

コイツを zsh 向けに書き換えしてみよう。

#!/bin/zsh

# 配列の作成、括弧で囲む
array=(先頭 次の項目 最後)

# echo してみる、インデックス指定無しだと先頭が出力される
echo $array
#=> 先頭

# インデックスは C 言語と同様
# bash と違って中括弧不要
# 先頭は 1 で最後は -1
#echo ${array[1]}
echo $array[2]
#=> 次の項目

# += で追加できる
# bash と違い括弧で囲む必要はない
#array+=(追加)
array+=追加
# 全てを出力する時は @ を指定
echo $array[@]
#=> 先頭 次の項目 最後 追加

# インデックスを使って追加や書き換えできる
# bash と同じだけどインデックスに注意
array[3]=三番目
echo $array[@]
#=> 先頭 次の項目 三番目 追加

# 範囲は関係ない、インデックスは並び順ではなく番号
array[10]=九番目
echo $array[10]
#=> 九番目

# 単なる未定義になる
echo 百番目は $array[100] です
#=> 百番目は です

# ポインタではない
array[-2]=$array[1]
array[1]=最初
echo $array[-2]
#=> 先頭

# bash で全てを出力する時は @ を指定
# for item in "${array[@]}"; do
for item in $array; do
    echo "item: $item"
done
# bash と同じヒアドキュメントで無理やり複数業コメントが可能
# atom, vscode 等は色分けしてくれる
: << __OUTPUT__
item: 最初
item: 次の項目
item: 三番目
item: 追加
item: 先頭
item: 九番目
__OUTPUT__

# こんな初期化もでき...なかった
#new_array=([1]=456 [2]=789 [0]=123)
#echo $new_array[@]
#=> error

なるほど、bash よりは簡単に使えるようにっているんだね。
Python 等が解る人ならインデックスにさえ注意すれば普通に扱える。
もっと機能はあるけど push(append) と for を覚えれば大抵困らない。
で、for はやはり配列を回すということみたい。

#!/bin/zsh

# 以下は共通です
# *.sh 等のワイルドカードも使えます
for f in これは 共通 です; do
    echo $f
done

# 変数に入れる場合 zsh は配列にする
# ワイルドカードなら arr=(*.sh), isf=*.sh
# てか zsh は arr=*.sh としてもワイルドカードを展開しない
if [[ $ZSH_EVAL_CONTEXT = toplevel ]]; then
    arr=(zshは 配列に します)
    for s in $arr; do
        echo $s
    done
    # 省略構文、変数が配列でも括弧が必要
    #for a ($arr) echo $a
else
    isf='bashはご存知 isf 区切りです'
    for s in $isf; do
        echo $s
    done
fi

# zsh の省略文
# do done の代わりにブレースを使うこともできる

# ブレース展開の結果が異なる
echo {02..10}
# bash: 2 3 4 5 6 7 8 9 10
# zsh:  02 03 04 05 06 07 08 09 10

ワイルドカード展開も配列になるのかなと思ったけど違うようだ。
bash と違ってイコール直後のアスタリスクは只の文字列扱いになるし。
in 直後の isf 区切りのみ特別扱いってことなのかな?
実際それで実用上は問題は無い気もする。

zshのfor文は強かった – Qiita

すごく機能は豊富だけど覚える必要があるかどうかは微妙。

それより発見、ブレース展開が小細工せずにゼロ詰めできる!
これだけのために Fedora にも zsh を入れようかと思うくらい便利。
って、ここ何のブログだっけ?

(bash|zsh) read command 2

read コマンドをもう少し。
ファイルの読み込みなんかは bash と同じみたい。

bash: ‘\n’ in read file (part2) | PaePoi

while read -r line; do
    echo $line
done << __DOC__
aaa bbb
ccc\nddd
eee
__DOC__

うん、sh と同じく \n 文字は改行扱いになるってか。
それより、ついでと思い bash 直指定したら文字列扱いになってしまったんだけど。
Fedora では sh は単なる bash へのシンボリックリンクなんだけど。

macOS の sh は別コマンドなのか、でも [[ とかの bash 拡張は使えるし。
正直よくわからんぞ。
シバンは明確に #!/bin/bash とかを利用したほうが良さげ。

(bash|zsh) read command

zsh と bash の read コマンドは全然違うようだ。
bash, zshでyes/no判定をするワンライナー – Qiita

公式のビルトインコマンド man ページも見つけた。
zsh: 17 Shell Builtin Commands

早速試そうと思ったけど bash とソースを分けるのは色々と不便だ。
zsh にしても $SHELL は bash のままだし、readonly に何か無いかな?

あった、$ZSH_EVAL_CONTEXT が定義されているかで判別できそう。
プロンプトとライン入出力と Y|N 判定をひとまとめに書いてみた。

#!/bin/zsh

echo 'May I ask your name?'

if [[ $ZSH_EVAL_CONTEXT = toplevel ]]; then
    read name\?'> '
    echo "Hello $name san"
    printf 'Do you like zsh? (y|N): '
    read -q && echo '\nGreat!' || echo '\noh my god...'
else
    read -p '> ' name
    echo "Hello $name san!"
    read -n1 -p 'Do you like bash? (y|N): ' res
    [[ $res = [Yy] ]] && printf '\nGreat!\n' || printf '\noh my god...\n'
fi

マジで全然ちげえ、この手段でまとめページを作るのは無理があるみたい。
zsh の read -q でプロンプトは出せないのかな?

おまけで、zsh の echo はエスケープシーケンスが使えると解った。
macOS の bash は echo -e すら使えないのに。
組み込みコマンドは大体別物と思ったほうが良さげ。

Atom の script は bash|zsh のシバンも見分けしてくれる、助かる。
入力はできないけど、まあそれは Gedit も同じだ。