使用多个显示器能够避免在任务窗口或应用之间来回切换,从而提升效率。然而随着工做空间的扩大,同时也带来了其它问题,包括:git
无论你是否是 VIM 党,不停地在鼠标与键盘之间切换绝对是一件分心且低效的事,不少“懒人”宁肯花时间记住数量庞大的组合快捷键(固然若是记不住也不要紧,有一款做弊神器能够帮助你快速查看当前应用的快捷键:Cheatsheet),也不肯让本身的右手离开键盘。github
虽然为了不使用鼠标你甚至能够给 Chrome 装上 VIM 映射的插件,但总有些时候不得不依赖鼠标完成一些精确的点击、拖动等操做,然而根据心理物理学中著名的费茨定律(Fitt's law),鼠标移动时间与目标距离成正比,与目标大小成反比:app
也就是说随着工做空间的扩大,使用鼠标的效率将会愈来愈低。除了鼠标的问题以外,当同时有多个应用窗口在你面前打开的时候,即便想要经过组合快捷键操做,也容易搞混当前捕获焦点的应用是哪一个。固然就算有多个窗口重叠出现,你能够经过查看左上角工具栏所显示的应用名称来肯定当前焦点,不过费茨定律对于视觉搜索也是一样适用的,对于连眼睛都懒得抬起来的人来讲宁肯经过 Command+Tab 尝试切换来找到当前焦点的应用。工具
不过这个问题能够经过另一款做弊神器来解决:HazeOverlua
它可让当前出于焦点的窗口正常显示,而其它全部窗口都蒙上一层半透明的黑纱:spa
macOS 提供了一个有趣的小功能,只要快速晃动鼠标就可让指针放大,从而让你快速定位本身的鼠标。然而这点微小的工做远远没法弥补它在窗口管理上的不足。与 Windows 上贴边停靠、甩一甩甩掉其它窗口的功能相比,macOS 窗口左上角红黄绿的三个小圆点几乎毫无存在感,抛开面积过小不易点击不说,绿色的放大按钮只能进入或退出全屏模式,虽而后来加入了长按进入双全屏模式,也基本上是个鸡肋:在小屏幕笔记本上没什么用,有扩展屏的时候更不必用。因而乎在苹果强大的生态号召力之下出现了许多第三方解决方案,可是个人需求很简单,我以为将一块屏幕划分红皿、田之类的格局没有任何须要,我只须要最简单的功能:插件
前两条根本就是 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