20201011のMacに関する記事は5件です。

Mac用タイル型ウィンドウマネージャーのyabaiがヤバイ

WM(Window Manager)とは

Linuxを普段使いしている人ならおなじみのWM(Window Manger)。
キーボードだけでモニター内のアプリのウィンドウを操作できるツールです。
有名なものだとi3xmonadがあります。
この二つをは基本的にLinuxのみで動くもので、LinuxからMacに移行する人や、両方とも使う人にはMac用の代替品が欲しくなります。
その一つがyabaiです。

yabaiとは

yabaiはi3ライクにウィンドウ操作ができるWMです。
yabai.gif

キーボードのみでウィンドウの切り替えやサイズ・レイアウトの変更ができます。

yabaiのセットアップ

yabaiをbrewでインストール

brew install koekeishiya/formulae/yabai

yabai自体は yabai -m window --focus recentなどのコマンドでウィンドウを操作するもので、キーボードで操作するには、skhdというショートカットツールが必要になります。

skhdをbrewでインストール

brew install koekeishiya/formulae/skhd

yabaiとskhdには、ショートカットを定義するそれぞれの設定ファイルをルートディレクトリに置く必要があります。
基本的には、yabaiの開発者の設定ファイルを参考にして改良しました。

.yabairc
#!/usr/bin/env sh

# global settings
yabai -m config mouse_follows_focus          on
yabai -m config focus_follows_mouse          autoraise
yabai -m config window_placement             second_child
yabai -m config window_topmost               on
yabai -m config window_shadow                off
yabai -m config window_opacity               on
yabai -m config window_opacity_duration      0.0
yabai -m config active_window_opacity        1.0
yabai -m config normal_window_opacity        0.95
yabai -m config window_border                on
yabai -m config window_border_width          6
yabai -m config active_window_border_color   0xff775759
yabai -m config normal_window_border_color   0xff555555
yabai -m config insert_feedback_color        0xaad75f5f
yabai -m config split_ratio                  0.50
yabai -m config auto_balance                 on
yabai -m config mouse_modifier               fn
yabai -m config mouse_action1                move
yabai -m config mouse_action2                resize

# general space settings
yabai -m config layout                       bsp
yabai -m config top_padding                  12
yabai -m config bottom_padding               12
yabai -m config left_padding                 12
yabai -m config right_padding                12
yabai -m config window_gap                   06

# specific space settings
yabai -m config --space 2 layout             stack
yabai -m config --space 7 layout             float

# window rules
yabai -m rule --add app="^Mail$" space=2
yabai -m rule --add app="^Safari$" space=3
yabai -m rule --add app="^Notes$" space=4
yabai -m rule --add app="^Transmission$" space=5
yabai -m rule --add app="^Spotify$" space=6
yabai -m rule --add app="^Discord$" space=7 grid=1:1:0:0:1:1 manage=off
yabai -m rule --add app="^Steam$" space=7 manage=off
yabai -m rule --add app="^System Preferences$" manage=off

# signals
yabai -m signal --add event=window_destroyed action="yabai -m query --windows --window &> /dev/null || yabai -m window --focus mouse"
yabai -m signal --add event=application_terminated action="yabai -m query --windows --window &> /dev/null || yabai -m window --focus mouse"

yabai -m signal --add event=application_activated app="^mpv$" action="/Users/Koe/Scripts/mpv_opacity"
yabai -m signal --add event=application_deactivated app="^mpv$" action="/Users/Koe/Scripts/mpv_opacity"

# restore position of floating windows when they are manually unfloated
# ~/Scripts/yabai_restore.sh

echo "yabai configuration loaded.."
.skhdrc
# focus window
alt - x : yabai -m window --focus recent
alt - h : yabai -m window --focus west
alt - j : yabai -m window --focus south
alt - k : yabai -m window --focus north
alt - l : yabai -m window --focus east
alt - z : yabai -m window --focus stack.prev
alt - c : yabai -m window --focus stack.next

# swap window
shift + alt - x : yabai -m window --swap recent
shift + alt - h : yabai -m window --swap west
shift + alt - j : yabai -m window --swap south
shift + alt - k : yabai -m window --swap north
shift + alt - l : yabai -m window --swap east

# move window
shift + cmd - h : yabai -m window --warp west
shift + cmd - j : yabai -m window --warp south
shift + cmd - k : yabai -m window --warp north
shift + cmd - l : yabai -m window --warp east

# balance size of windows
shift + alt - 0 : yabai -m space --balance

# make floating window fill screen
shift + alt - up     : yabai -m window --grid 1:1:0:0:1:1

# make floating window fill left-half of screen
shift + alt - left   : yabai -m window --grid 1:2:0:0:1:1

# make floating window fill right-half of screen
shift + alt - right  : yabai -m window --grid 1:2:1:0:1:1

# create desktop, move window and follow focus - uses jq for parsing json (brew install jq)
shift + cmd - n : yabai -m space --create && \
                  index="$(yabai -m query --spaces --display | jq 'map(select(."native-fullscreen" == 0))[-1].index')" && \
                  yabai -m window --space "${index}" && \
                  yabai -m space --focus "${index}"

# create desktop and follow focus - uses jq for parsing json (brew install jq)
cmd + alt - n : yabai -m space --create && \
                index="$(yabai -m query --spaces --display | jq 'map(select(."native-fullscreen" == 0))[-1].index')" && \
                yabai -m space --focus "${index}"

# destroy desktop
cmd + alt - w : yabai -m space --destroy

# fast focus desktop
cmd + alt - x : yabai -m space --focus recent
cmd + alt - z : yabai -m space --focus prev || skhd -k "ctrl + alt + cmd - z"
cmd + alt - c : yabai -m space --focus next || skhd -k "ctrl + alt + cmd - c"
cmd + alt - 1 : yabai -m space --focus  1 || skhd -k "ctrl + alt + cmd - 1"
cmd + alt - 2 : yabai -m space --focus  2 || skhd -k "ctrl + alt + cmd - 2"
cmd + alt - 3 : yabai -m space --focus  3 || skhd -k "ctrl + alt + cmd - 3"
cmd + alt - 4 : yabai -m space --focus  4 || skhd -k "ctrl + alt + cmd - 4"
cmd + alt - 5 : yabai -m space --focus  5 || skhd -k "ctrl + alt + cmd - 5"
cmd + alt - 6 : yabai -m space --focus  6 || skhd -k "ctrl + alt + cmd - 6"
cmd + alt - 7 : yabai -m space --focus  7 || skhd -k "ctrl + alt + cmd - 7"
cmd + alt - 8 : yabai -m space --focus  8 || skhd -k "ctrl + alt + cmd - 8"
cmd + alt - 9 : yabai -m space --focus  9 || skhd -k "ctrl + alt + cmd - 9"
cmd + alt - 0 : yabai -m space --focus 10 || skhd -k "ctrl + alt + cmd - 0"

# send window to desktop and follow focus
#shift + cmd - x : yabai -m window --space recent && yabai -m space --focus recent
#shift + cmd - z : yabai -m window --space prev && yabai -m space --focus prev
#shift + cmd - c : yabai -m window --space next && yabai -m space --focus next
#shift + cmd - 1 : yabai -m window --space  1 && yabai -m space --focus 1
#shift + cmd - 2 : yabai -m window --space  2 && yabai -m space --focus 2
#shift + cmd - 3 : yabai -m window --space  3 && yabai -m space --focus 3
#shift + cmd - 4 : yabai -m window --space  4 && yabai -m space --focus 4
#shift + cmd - 5 : yabai -m window --space  5 && yabai -m space --focus 5
#shift + cmd - 6 : yabai -m window --space  6 && yabai -m space --focus 6
#shift + cmd - 7 : yabai -m window --space  7 && yabai -m space --focus 7
#shift + cmd - 8 : yabai -m window --space  8 && yabai -m space --focus 8
#shift + cmd - 9 : yabai -m window --space  9 && yabai -m space --focus 9
#shift + cmd - 0 : yabai -m window --space 10 && yabai -m space --focus 10

# focus monitor
ctrl + alt - x  : yabai -m display --focus recent
ctrl + alt - z  : yabai -m display --focus prev
ctrl + alt - c  : yabai -m display --focus next
ctrl + alt - 1  : yabai -m display --focus 1
ctrl + alt - 2  : yabai -m display --focus 2
ctrl + alt - 3  : yabai -m display --focus 3

# send window to monitor and follow focus
ctrl + cmd - x  : yabai -m window --display recent && yabai -m display --focus recent
ctrl + cmd - z  : yabai -m window --display prev && yabai -m display --focus prev
ctrl + cmd - c  : yabai -m window --display next && yabai -m display --focus next
ctrl + cmd - 1  : yabai -m window --display 1 && yabai -m display --focus 1
ctrl + cmd - 2  : yabai -m window --display 2 && yabai -m display --focus 2
ctrl + cmd - 3  : yabai -m window --display 3 && yabai -m display --focus 3

# move window
shift + ctrl - a : yabai -m window --move rel:-20:0
shift + ctrl - s : yabai -m window --move rel:0:20
shift + ctrl - w : yabai -m window --move rel:0:-20
shift + ctrl - d : yabai -m window --move rel:20:0

# increase window size
shift + alt - a : yabai -m window --resize left:-20:0
shift + alt - s : yabai -m window --resize bottom:0:20
shift + alt - w : yabai -m window --resize top:0:-20
shift + alt - d : yabai -m window --resize right:20:0

# decrease window size
shift + cmd - a : yabai -m window --resize left:20:0
shift + cmd - s : yabai -m window --resize bottom:0:-20
shift + cmd - w : yabai -m window --resize top:0:20
shift + cmd - d : yabai -m window --resize right:-20:0

# set insertion point in focused container
ctrl + alt - h : yabai -m window --insert west
ctrl + alt - j : yabai -m window --insert south
ctrl + alt - k : yabai -m window --insert north
ctrl + alt - l : yabai -m window --insert east
ctrl + alt - i : yabai -m window --insert stack

# rotate tree
alt - r : yabai -m space --rotate 90

# mirror tree y-axis
alt - y : yabai -m space --mirror y-axis

# mirror tree x-axis
alt - x : yabai -m space --mirror x-axis

# toggle desktop offset
alt - a : yabai -m space --toggle padding && yabai -m space --toggle gap

# toggle window parent zoom
alt - d : yabai -m window --toggle zoom-parent

# toggle window fullscreen zoom
alt - f : yabai -m window --toggle zoom-fullscreen

# toggle window native fullscreen
shift + alt - f : yabai -m window --toggle native-fullscreen

# toggle window split type
alt - e : yabai -m window --toggle split

# float / unfloat window and restore position
# alt - t : yabai -m window --toggle float && /tmp/yabai-restore/$(yabai -m query --windows --window | jq -re '.id').restore 2>/dev/null || true
alt - t : yabai -m window --toggle float && yabai -m window --grid 4:4:1:1:2:2

# toggle sticky (show on all spaces)
alt - s : yabai -m window --toggle sticky

# toggle topmost (keep above other windows)
alt - o : yabai -m window --toggle topmost

# toggle picture-in-picture
alt - p : yabai -m window --toggle border && \
          yabai -m window --toggle pip

# change layout of desktop
ctrl + alt - a : yabai -m space --layout bsp
ctrl + alt - d : yabai -m space --layout float
ctrl + alt - s : yabai -m space --layout $(yabai -m query --spaces --space | jq -r 'if .type == "bsp" then "float" else "bsp" end')

また、yabaiとskhdを有効化するには、[設定]→[セキュリティとプライバシー]→[プライバシー]→[アクセシビリティ]でコンピュータの制御の権限を有効にする必要があります。

スクリーンショット 2020-09-26 15.30.37.png

権限を有効化できたら、serviceとして起動します。

brew services start skhd
brew services start yabai

これで既存のウィンドウが自動で綺麗なタイル型に配置され、.skhdrcで設定したショートカットでウィンドウを操作できます。

デモ

上記のショートカット設定で、実際にウィンドウを操作してみます。

ウィンドウの移動

alt + hjkl(vimと同じキーバインドの上下左右)

move_window2.gif

ウィンドウの切り替え

shift + alt + hjkl

swap_window.gif

ウィンドウサイズを大きくする

shift + alt + aswd

yabai_increase.gif

ウィンドウサイズを小さくする

shift + command + aswd

yabai_decrease.gif

ウィンドウを画面の中心に配置する

alt + t

yabai_senter.gif

.cf

https://github.com/koekeishiya/yabai
https://github.com/koekeishiya/dotfiles/blob/master/skhd/skhdrc

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MacBook Pro 13インチ Late 2013 を macOS Mojave + XCode 11.3.1 にバージョンアップするメモ

ハードディスクを整理して、20GBまで空きスペースを作ったので、やっとMojaveとXCodeをバージョンアップしたので、その際のメモです。

環境

  • MacBook Pro (Retina, 13-inch, Late 2013)

バージョンアップ前

  • macOS 10.13.6(High Sierra)
  • XCode Version 10.1

バージョンアップ後

  • macOS 10.14.6(Mojave)
  • XCode Version 11.3.1 (11C505)

バックアップ作成

どんな方法でも良いのでバックアップしましょう。

今回は手持ちの外付けHDDに、ユーザーフォルダのみバックアップしました。

電源

ACアダプターから電源を取るようにします。

macOS のバージョンアップ

こちらから、
macOS Mojave にアップグレードする方法
https://support.apple.com/ja-jp/HT210190

macOS Mojave をダウンロードする

のあたりから、App Store経由でダウンロードします。

2~3時間かかるので、休みの時に時間をかけてやるのがおすすめです。

OSが更新されて再起動されたら、このMacについてからバージョンを確認します。

スクリーンショット 2020-10-11 19.36.43.png

XCodeのバージョンアップ

MacOSがバージョンアップできたので、バージョンアップした macOS 10.14.6 に対応したXCodeをバージョンアップします。

現時点(2020-10-11)でのmacOS 10.14.6 に対応したXCodeはVersion 11.3.1なので、こちらをダウンロードします。

App Store経由では以前のバージョンのXCodeはダウンロードできないので、下記よりダウンロードします。

More Downloads for Apple Developers
https://developer.apple.com/download/more/

※Developer登録が必要です。

スクリーンショット 2020-10-11 19.45.58.png

Xcode_11.3.1.xip をダウンロードします。
1時間程度かかります。

ダウンロードできたら、ダブルクリックして展開するとXCode.appが展開したフォルダにできるので、それをアプリケーションフォルダに移動します(以前のバージョンは上書きでOK)

XCodeを起動して(初回起動時に処理が走ります)、バージョンを確認します。

スクリーンショット 2020-10-11 19.04.11.png

参考

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

iterm を格好良くした

itermの画面

terminal.png

やったこと

  • itermのテーマをjapanesequeにした
  • 背景を半透明にした
  • 「コンピュータ名:」を緑色にした(詳細は後述)
    • 全部白いままだとコマンドをどこで打ったのかわかりづらいので。
    • 黒地に緑が個人的に格好良いと思うので
  • ステータスバーでgitとファイルパスをつけた。

「コンピュータ名:」を緑色にする方法

Preferences > Profile > Advanced > Triggers edit で以下のように設定する。
これで文頭からkubotaaで始まる場合のみ色がつく。
Macのシステムを操作して色をつける方法もあるみたいだが、これはitermの機能を使った。
iterm_color.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

macOSのキーボードショートカットを変更し、EmacsのMarkSetができるようにする

EmacsのMark set(Ctrl+Space)と入力ソースのキーボードショートカットが競合している。

システム環境→キーボード→キーボードショートカット(タブ)→入力ソース のチェックボックスを外せば解決する。

前の入力ソースを選択 のチェックボックスを外す

スクリーンショット 2020-10-11 16.16.53.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Pythonを使ってWindowsやMacを監視し、操作中のアプリの情報を収集してみる

はじめに

お家で仕事することが多くなり、多くの人が「みんなきちんと家で仕事してるのか?」という不安を抱えているという話を聞いています。

そもそも不安になること自体がおかしいことかなと思いますが、上司が不安になると自分が困ることになる人もいるのかなと思ったりもします。

ということで、パソコンを使っている時にリアルタイムで使用しているアプリの情報を収集できればその不安も少しは低減できるのではないかと考え、方法を検討してみました。

ここでは、「アクティブウィンドウを変更するたびにアクティブウインドウのタイトルを取得して表示する」という方法をまとめてみます。

動作環境

  • macOS Move
  • Windows10 Pro
  • Python3.7

ライブラリのインストール

Macを操作するライブラリ

Macの方は以下のコマンドで必要なライブラリをインストールして下さい。

pip install -U PyObjC

Windowsを操作するライブラリ

Windowsの方は以下のコマンドで必要なライブラリをインストールして下さい。

pip install -U pywin32

スクリプトの作成

get_active_window_title.py
#!/usr/bin/env python

import sys

# Mac用
if sys.platform == "darwin":
    from AppKit import NSWorkspace
    from Quartz import (
        CGWindowListCopyWindowInfo,
        kCGWindowListOptionOnScreenOnly,
        kCGNullWindowID
    )

    def getActiveWindowTitle():

        curr_app = NSWorkspace.sharedWorkspace().frontmostApplication()
        curr_pid = NSWorkspace.sharedWorkspace().activeApplication()['NSApplicationProcessIdentifier']
        curr_app_name = curr_app.localizedName()
        options = kCGWindowListOptionOnScreenOnly
        windowList = CGWindowListCopyWindowInfo(options, kCGNullWindowID)

        txt = ""

        for window in windowList:
            pid = window['kCGWindowOwnerPID']
            windowNumber = window['kCGWindowNumber']
            ownerName = window['kCGWindowOwnerName']
            geometry = window['kCGWindowBounds']
            windowTitle = window.get('kCGWindowName', u'Unknown')

            if curr_pid == pid:
                activeWindowTitle = ownerName + " - " + windowTitle

        return activeWindowTitle

# Windows用
elif sys.platform == "win32":
    import win32gui

    def getActiveWindowTitle():

        activeWindowTitle = win32gui.GetWindowText(win32gui.GetForegroundWindow());
        return activeWindowTitle

else:
    def getActiveWindowTitle():
        return ""

def main():
    bufWindowTitle = ""

    try:
        while True:
            activeWindowTitle = getActiveWindowTitle()
            if bufWindowTitle != activeWindowTitle:
                print(activeWindowTitle)
                bufWindowTitle = activeWindowTitle
    except KeyboardInterrupt:
        sys.exit(0)

if __name__ == '__main__':
    main()

実行

作成したら以下のコマンドで実行します。

python get_active_window_title.py

アクティブウィンドウを切り替えるたびにアプリケーション名が表示されるはずです。

できた!

これを指定したサーバーに送信するようにすれば自分がきちんと仕事をしていることがきちんとわかり、「証明しろ!」って言われても大丈夫!!
...大丈夫!
......大丈夫だと思う。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む