<msys2, tmux, powerline> 結局、少し自作。

msys2上のtmuxpowerlineをやりたい。

いろいろ試行の結果、本家powerlinepythonでぐりぐり動かすのは、 どもmsys2ではうまくなかった。
デーモンがうまく動いてないようで、pythonが呼ばれるたびに、CPUがブンブンうなるし、、、

github.com

次善の策として、tmux-powerline があったが、いろいろ使えないモジュールがあり、IPアドレス天気もいらないので、
結局、tmux.confに直接コードを埋め込むことにした。

やったこと。

その1) フォントをインストール。

github.com

DejaVuSansMonoをイントール。

その2) 下記のコードをtmux.confに書き書き。

# My powerline
S_LEFT_BOLD=""
S_LEFT_THIN=""
S_RIGHT_BOLD=""
S_RIGHT_THIN=""
set-option -g status on
set-option -g status-interval 1
set-option -g status-left-length 60
set-option -g status-right-length 90
set -g status-left "#{?client_prefix,#[fg=colour232]#[bg=colour170],#[fg=colour232]#[bg=colour245]} + #{?client_prefix,#[fg=colour170]#[bg=colour240],#[fg=colour245]#[bg=colour240]}${S_RIGHT_BOLD}#[fg=colour245,bg=colour240] #H #[default]${S_RIGHT_BOLD}"
set -g status-right "#[fg=colour240,bg=colour235]${S_LEFT_BOLD}#[fg=colour245,bg=colour240] %a ${S_LEFT_THIN} %Y-%m-%d ${S_LEFT_THIN} %H:%M #[default]"
set-window-option -g window-status-format "#[fg=colour235, bg=colour240]${S_RIGHT_BOLD}#[fg=colour245, bg=colour240] #I.#P ${S_RIGHT_THIN} #W #[fg=colour240, bg=colour235]${S_RIGHT_BOLD}"
set-window-option -g window-status-current-format "#[fg=colour235, bg=colour170]${S_RIGHT_BOLD}#[fg=colour255, bg=colour170] #I.#P ${S_RIGHT_THIN} #W #[fg=colour170, bg=colour235]${S_RIGHT_BOLD}"
set -g status-fg colour240
set -g status-bg colour235

例のpowerlineのかっこいい、三角のやつは、tmux-powerlineからコピーした。

github.com

<powerline, msys2> msys2でpowerlineをやる。

ずっとやってみたかった、mys2powerlineをやる。
やってみた。

ググると、pip install powerline-statusでインストールすればいいらしい。
インストール後、さっそく起動。 powerline-deamon -qでゴー。
エラーがでた。。。

うーんと思って調査したら、どうも、anacondaさんpythonでは、fcntlとかいうモジュールがない。
が、msys2でインストールできる/usr/bin/pythonにはある。

つうことで、anaconda pythonをオフしないといけんらしい。

> powerline-daemon -q
Traceback (most recent call last):
  File "C:/Anaconda3/Scripts/powerline-daemon", line 9, in <module>
    import fcntl
ModuleNotFoundError: No module named 'fcntl'

> winpty python
Python 3.6.6 |Anaconda, Inc.| (default, Jun 28 2018, 11:27:44) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import fcntl
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'fcntl'
>>> quit()

> /usr/bin/python
Python 3.7.1 (default, Oct 30 2018, 05:59:02)
[GCC 7.3.0] on msys
Type "help", "copyright", "credits" or "license" for more information.
>>> import fcntl
>>> quit()

と、いうことで、anaconda pythonPATHから抜いて、msys2デフォルトの/usr/bin/pythonを有効にする。
で、Powerlineをインストール。

>pip install powerline-status

でだ。
Powerlineちゅうのは、矢印とかのかっこいい部分は、専用のフォントをいれないといけん。

ぐぐったら、このフォントがよさげだったか、次の理由により、Powerlineからフォントを持ってきた。

github.com

理由。
msys2tmuxPowerline化するには、minttyのターミナルのフォント設定のLocale設定で、`Cを選ばないといけない。
やんないと、改行がうまくなく、ぐちゃぐちゃになる。ここ参考。

hibikore.murakan.info

で、Cを選択すると、Ritctyさんは、今度は、zshでかっこよくならない。
どうも、ja_JPCでカッコよいやつのフォントのコードが異なってるっぽい。。。

なので、Powerline本家から、フォントを持ってきて、インストール。

github.com

今回は、DejaVuSansMonoをイントールしてみた。

フォントサンプル。
https://github.com/powerline/fonts/blob/master/samples/All.md

インストールは、 Windowsボタン+Rファイル名を指定して実行のダイアログボックスを出し、
controlと入力して、コントロールパネルを開く。
で、フォントを選んで、.ttfとなってるファイルを入れこむ。

tmux.confの末尾に下記追加して、起動。

run-shell "powerline-daemon -q"
source ~/.local/lib/python3.7/site-packages/powerline/bindings/tmux/powerline.conf

で、成功。 カッコよくなった。

ただ、1つ問題が。。。
zsh+tmuxだと、zshPowerlineのブランチの表示部分がずれる、、、
しかも、lsだのpwdだのコマンドが遅い。
なんかいちいち、WindowsAntivirus Serviceがブーンって動くせいで、遅い。
なんとかなるのかな、、、

マニュアル。

github.com

参考。
qiita.com

blog.k3n.link

7me.oji.0j0.jp

<pyinstaller, Python, WSH> Pythonスクリプトから実行ファイル(exe)を作る。

Pythonスクリプトから実行ファイルexeを作る、変換する。

pyinstallerちゅうのでできるらしい。

試してみた。
インストールは、pipさんで。condaさんにはなかった。
例のCalculatorをwin32comで、制御するスクリプトを変換。
スクリプト

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import win32api as WScript
import win32com.client


if __name__ == '__main__':
    WshShell = win32com.client.Dispatch("WScript.Shell")
    WshShell.Run("calc")
    WScript.Sleep(100)
    WshShell.AppActivate("Calculator")
    WScript.Sleep(100)
    WshShell.SendKeys("1{+}", 0)
    WScript.Sleep(500)
    WshShell.SendKeys("2")
    WScript.Sleep(500)
    WshShell.SendKeys("~")
    WScript.Sleep(500)
    WshShell.SendKeys("*3")
    WScript.Sleep(500)
    WshShell.SendKeys("~")
    WScript.Sleep(2500)

で、変換。

>pyinstaller -F -w calc.py

で、なにやらいろいろ呪文が並ぶ。
で、calc\distというフォルダの下に、calc.exeを発見。
できたっぽい。
で、クリック。

が、、問題発生

止まらない、、、
どんどんcalc.exeプロセスが増殖して、やりたい放題。
暴走。。。

しょーが無しに、Windows強制シャットダウン。
あかんがや、、、まったく。。。

その後、sys.exit()を最後に付ければ、暴走しないことを確認。

sys.exit()は必須。

お世話になったところ。

kconcon3.hatenablog.com

edosha.hatenablog.jp

マニュアル。
PyInstaller Manual — PyInstaller 3.4 documentation

nekoyukimmm.hatenablog.com

<WSH, win32com, Python> WSHとwin32comの関係

WSH(Windows Script Host)と、win32comを眺めてみた。
win32comはどうやら、おそらく、WSHとほぼ同じ。

WScriptCalcを起動して、キーを送るスクリプト

https://msdn.microsoft.com/ja-jp/library/cc364423.aspx

set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run "calc"
WScript.Sleep 100
WshShell.AppActivate "Calculator"
WScript.Sleep 100
WshShell.SendKeys "1{+}"
WScript.Sleep 500
WshShell.SendKeys "2"
WScript.Sleep 500
WshShell.SendKeys "~"
WScript.Sleep 500
WshShell.SendKeys "*3"
WScript.Sleep 500
WshShell.SendKeys "~"
WScript.Sleep 2500

これのpython/win32com版。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import win32api as WScript
import win32com.client


if __name__ == '__main__':
    WshShell = win32com.client.Dispatch("WScript.Shell")
    WshShell.Run("calc")
    WScript.Sleep(100)
    WshShell.AppActivate("Calculator")
    WScript.Sleep(100)
    WshShell.SendKeys("1{+}", 0)
    WScript.Sleep(500)
    WshShell.SendKeys("2")
    WScript.Sleep(500)
    WshShell.SendKeys("~")
    WScript.Sleep(500)
    WshShell.SendKeys("*3")
    WScript.Sleep(500)
    WshShell.SendKeys("~")
    WScript.Sleep(2500)

動作はまったく同じ。

ちなみに、WScriptをsubprocessで呼び出しても同じ。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import subprocess


if __name__ == '__main__':
    subprocess.run("calc.vbs", shell=True)

なるほど。。。
と、いうことで、win32comでの制御は、基本WScriptどおり。
下記、マイクロソフトのところで、調べものすれば、結構思い通りに制御できそう。

WshShell オブジェクト

参考。大変役にたちました。

Windows Script Host Laboratory

www.atmarkit.co.jp