Mac 多屏幕窗口管理神器

使用多個顯示器能夠避免在任務窗口或應用之間來回切換,從而提升效率。然而隨着工做空間的擴大,同時也帶來了其它問題,包括:git

  1. 使用鼠標的效率進一步下降;
  2. 活動窗口過多容易失去焦點;
  3. 更多時候是以上兩點同時發生:找半天不知道鼠標指針在哪,多屏幕之間拖動、管理窗口變得更加困難。

無論你是否是 VIM 黨,不停地在鼠標與鍵盤之間切換絕對是一件分心且低效的事,不少「懶人」寧肯花時間記住數量龐大的組合快捷鍵(固然若是記不住也不要緊,有一款做弊神器能夠幫助你快速查看當前應用的快捷鍵:Cheatsheet),也不肯讓本身的右手離開鍵盤。github

雖然爲了不使用鼠標你甚至能夠給 Chrome 裝上 VIM 映射的插件,但總有些時候不得不依賴鼠標完成一些精確的點擊、拖動等操做,然而根據心理物理學中著名的費茨定律(Fitt's law),鼠標移動時間與目標距離成正比,與目標大小成反比:app

也就是說隨着工做空間的擴大,使用鼠標的效率將會愈來愈低。除了鼠標的問題以外,當同時有多個應用窗口在你面前打開的時候,即便想要經過組合快捷鍵操做,也容易搞混當前捕獲焦點的應用是哪一個。固然就算有多個窗口重疊出現,你能夠經過查看左上角工具欄所顯示的應用名稱來肯定當前焦點,不過費茨定律對於視覺搜索也是一樣適用的,對於連眼睛都懶得擡起來的人來講寧肯經過 Command+Tab 嘗試切換來找到當前焦點的應用。工具

不過這個問題能夠經過另一款做弊神器來解決:HazeOverlua

它可讓當前出於焦點的窗口正常顯示,而其它全部窗口都蒙上一層半透明的黑紗:spa

macOS 提供了一個有趣的小功能,只要快速晃動鼠標就可讓指針放大,從而讓你快速定位本身的鼠標。然而這點微小的工做遠遠沒法彌補它在窗口管理上的不足。與 Windows 上貼邊停靠、甩一甩甩掉其它窗口的功能相比,macOS 窗口左上角紅黃綠的三個小圓點幾乎毫無存在感,拋開面積過小不易點擊不說,綠色的放大按鈕只能進入或退出全屏模式,雖而後來加入了長按進入雙全屏模式,也基本上是個雞肋:在小屏幕筆記本上沒什麼用,有擴展屏的時候更不必用。因而乎在蘋果強大的生態號召力之下出現了許多第三方解決方案,可是個人需求很簡單,我以爲將一塊屏幕劃分紅皿、田之類的格局沒有任何須要,我只須要最簡單的功能:插件

  1. 能夠最大化但不是全屏;
  2. 能夠佔據左半邊或右半邊;
  3. 能夠在不一樣顯示器之間快速移動。

前兩條根本就是 Windows 的基本功能,我嘗試了一些窗口管理應用以後,最終選擇能夠經過代碼精確配置的 Hammerspoon,與通常的工具不一樣,首先它是開源的,其次使用 Lua 腳本做爲配置文件。指針

個人配置文件在 這裏 Gist-hammerspoon.init.lua,保存到本地~/.hammerspoon/init.lua,而後 Reload Config 便可。Hammerspoon 還提供一個 Console 界面,能夠方便調試:調試

配置文件說明

-- 通常組合鍵爲 Shift + Command + ?
local hyper = {'shift', 'cmd'}

-- 最大化窗口
-- 快捷鍵爲 Shift + Command + ↑
hs.hotkey.bind(hyper, 'up', function()
    hs.grid.maximizeWindow()
end)

-- 讓窗口占據左半邊(Windows 下面的向左貼邊停靠)
-- 快捷鍵爲 Shift + Command + ←
hs.hotkey.bind(hyper, "Left", function()
  local win = hs.window.focusedWindow()
    local f = win:frame()
    local screen = win:screen()
    local max = screen:frame()

    f.x = max.x
    f.y = max.y
    f.w = max.w / 2
    f.h = max.h
    win:setFrame(f)
end)

-- 向右停靠相似

-- 將當前窗口移動到第 n 個屏幕
-- 並最大化窗口
-- 快捷鍵爲 Ctrl + Command + 屏幕數字
local hyper2 = {'ctrl', 'cmd'}
moveto = function(win, n)
  local screens = hs.screen.allScreens()
  if n > #screens then
    hs.alert.show("No enough screens " .. #screens)
  else
    local toWin = hs.screen.allScreens()[n]:name()
    hs.alert.show("Move " .. win:application():name() .. " to " .. toWin)
    hs.layout.apply({{nil, win:title(), toWin, hs.layout.maximized, nil, nil}})
  end
end

hs.hotkey.bind(hyper2, "1", function()
  local win = hs.window.focusedWindow()
  moveto(win, 1)
end)
hs.hotkey.bind(hyper2, "2", function()
  local win = hs.window.focusedWindow()
  moveto(win, 2)
end)
hs.hotkey.bind(hyper2, "3", function()
  local win = hs.window.focusedWindow()
  moveto(win, 3)
end)複製代碼

查看錄屏效果code

相關文章
相關標籤/搜索