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

相关文章
相关标签/搜索