1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Hammerspoonを使ってカーソルを合わせることなくウィンドウの移動と拡大縮小を行う

Last updated at Posted at 2022-06-11

今までウィンドウの移動と拡大縮小については、ショートカット化されてきませんでした。

(いちいちウィンドウの頭や右下にカーソルをあわせなくてはいけない例 ✕)
manual.gif]

本記事では

  1. それらにショートカットを設定する方法と
  2. それを実現するのに必要な素晴らしいツール(Hammerspoon)

を紹介します。これによりカーソル移動を最小化できます。

(ショートカット化によりカーソルをあわせなくてよくなった例 ◯)
move.gif]

前提

  • hammerspoon

hammerspoon について

hammerspoonは、OS Xの自動化ツールです。他のウィンドウ管理アプリShiftItの代替ツールとして挙げられています1

インストールはbrewでできます。

brew install hammerspoon --cask

Qiitaにもいくつか記事があります。

hammerspoon を触ってみる

hammerspoonは、とても 手軽プログラマブルに OS Xの設定が記述できます。
その一例を紹介します。

インストール後、menu barのハンマーのアイコンから「Open Config」を押して以下をコピペしてみてください。

DURATION = 0.05
DELTA = 10
function moveUp()
    local win = hs.window.focusedWindow()
    local f = win:frame()
    f.y = f.y + DELTA
    win:setFrame(f, DURATION)
end
function moveDown()
    local win = hs.window.focusedWindow()
    local f = win:frame()
    f.y = f.y - DELTA
    win:setFrame(f, DURATION)
end
function moveLeft(bound)
    local win = hs.window.focusedWindow()
    local f = win:frame()
    f.x = f.x - DELTA
    win:setFrame(f, DURATION)
end
function moveRight()
    local win = hs.window.focusedWindow()
    local f = win:frame()
    f.x = f.x + DELTA
    win:setFrame(f, DURATION)
end
hs.hotkey.bind({"cmd", "alt", "ctrl"}, "J", moveUp,nil,moveUp)
hs.hotkey.bind({"cmd", "alt", "ctrl"}, "K", moveDown,nil,moveDown)
hs.hotkey.bind({"cmd", "alt", "ctrl"}, "H", moveLeft,nil,moveLeft)
hs.hotkey.bind({"cmd", "alt", "ctrl"}, "L", moveRight,nil,moveRight)

ハンマーアイコンから「Reload Config」を押すと設定がロードされ、cmd+alt+ctrl+j,k,h,lでフォーカスしているウィンドウをショートカットから移動することがわかると思います。

設定方法

それでは冒頭の操作をショートカット化する方法を紹介します。
前述と同様に「Open Config」から以下の設定をコピペし「Reload Config」します。

init.lua
DURATION = 0.05
INTERVAL_SEC = 0.05
SCALE = 2.0

repeatMove = nil
function startMoveWindow()
    prevPoint = hs.mouse.absolutePosition()
    prevFrame = hs.window.focusedWindow():frame()

    repeatMove = hs.timer.doEvery(INTERVAL_SEC, function()
        local nextPoint = hs.mouse.absolutePosition()
        local win = hs.window.focusedWindow()
        local f = win:frame()
        f.x = prevFrame.x - (prevPoint.x - nextPoint.x) * SCALE
        f.y = prevFrame.y - (prevPoint.y - nextPoint.y) * SCALE
        win:setFrameInScreenBounds(f, DURATION)
        prevPoint = nextPoint
        prevFrame = hs.window.focusedWindow():frame()
    end)
    repeatMove:start()
end
function stopMoveWindow() repeatMove:stop() end
hs.hotkey.bind({"cmd", "alt", "ctrl"}, "A", startMoveWindow, stopMoveWindow, nil)

repeatResize = nil
function startResizeWindow()
    prevPoint = hs.mouse.absolutePosition()
    prevFrame = hs.window.focusedWindow():frame()

    repeatResize = hs.timer.doEvery(INTERVAL_SEC, function()
        local nextPoint = hs.mouse.absolutePosition()
        local win = hs.window.focusedWindow()
        local f = win:frame()
        f.w = prevFrame.w - (prevPoint.x - nextPoint.x) * SCALE
        f.h = prevFrame.h - (prevPoint.y - nextPoint.y) * SCALE
        -- bound sizeA
        local sf = hs.screen.find(f):frame()
        if (sf.x + sf.w < f.x + f.w) then f.w = sf.x + sf.w - f.x end
        if (sf.y + sf.h < f.y + f.h) then f.h = sf.y + sf.h - f.y end
        win:setFrame(f, DURATION)
        prevPoint = nextPoint
        prevFrame = hs.window.focusedWindow():frame()
    end)
    repeatResize:start()
end
function stopResizeWindow() repeatResize:stop() end
hs.hotkey.bind({"cmd", "alt", "ctrl"}, "S", startResizeWindow, stopResizeWindow, nil)

操作例

  • cmd+alt+ctrl+a+マウス操作でウィンドウ移動
  • 画面を超えないように止まってくれます (setFrameに変えると無効にできます)
move.gif]
  • cmd+alt+ctrl+s+マウス操作で拡大/縮小
  • 同様に画面を超えないように拡大が止まります
resize.gif]

ショートカットやSCALEはお好みで変えてください。

終わりに

少なくともウィンドウの頭にカーソルを合わせる時間は削れたかと思います。

hammerspoonは便利なツールなので、興味のある方は、公式のチュートリアルやAPIドキュメントを読むといろいろ膨らむと思います。

  1. A highly recommended alternative to ShiftIt that can be implemented using Hammerspoon. https://github.com/fikovnik/ShiftIt

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?