F48f013215383cffdd105b2e29784cef
Mac隐藏桌面文件(一键会议模式)

HammerSpoon隐藏桌面文件下载地址

注意:本文针对 Mac 用户,Windows 用户可以找到很多功能类似的软件来完成这样一个工作,因此我就不推荐了。

如果你是一个做视频的博主,或者是一个上班族,那么你可能会有这样一个烦恼。例如:

领导突然要开一个会议,需要用你的电脑做投屏演示,而你的电脑桌面文件比较乱,不想让大家看到。或者在录制视频教程的时候,不想把桌面文件录制进去。

这时你会怎么办呢?是选择把桌面文件临时移动到其他文件夹,还是想来一点黑魔法?像下面这样:

通过菜单栏工具直接隐藏桌面文件。

可以看到,在选择隐藏文件后,桌面上的文件就不见了,点击显示文件后,就会再次出现。那么这个神奇的工具在哪里能找到呢?

其实这个工具哪里都木有,这个是借助 HammerSpoon 自定义的一个工具。

首先了解一下什么是 HammerSpoon,你可以把它看作是一个系统工具箱,它将系统提供的功能和服务统一的封装成了 lua 接口,这样就可以通过 lua 脚本直接进行控制了,相比不从头学 MacOS 开发而言,使用 lua 脚本的门槛更低。

你可以通过这篇文章更深入的了解一下 HammerSpoon: 免费又强大的 macOS 自动化工具,Hammerspoon 可以让你少买很多 App

隐藏桌面文件实现原理

我们接下来就看一下隐藏桌面文件是如何实现的吧。首先,我们需要以下的基础知识:

  1. 如何通过 shell 指令隐藏单个文件,或者直接隐藏桌面文件
  2. 如何使用 lua 脚本
  3. 使用 lua 脚本调用 shell 指令
  4. 如何通过 hammerspoon 创建菜单
  5. 如何监听菜单点击回调

如果这些你都不懂也没关系,请直接到最后看如何使用我写的脚本就可以了。

当然,如果你能看懂更好,这样就能自己去改造定制自己特有的功能了。

1. 使用 shell 指令隐藏桌面文件

1.1 统一隐藏

# 隐藏桌面文件
defaults write com.apple.finder CreateDesktop -bool FALSE; killall Finder
# 显示桌面文件
defaults write com.apple.finder CreateDesktop -bool true; killall Finder

这种方式可以直接控制桌面文件不显示,但这种方式需要重启 Finder(访达),而重启操作会导致我的 TotalFinder 插件失效,需要重新开启,比较烦人,所以在最终实现的时候没有采用这种方案。

1.2 隐藏单个文件

# 隐藏单个文件
chflags hidden <filePath>
# 显示单个文件
chflags nohidden <filePath>

通过这种方式可以根据文件的路径来单独的隐藏或者显示某个文件,这样我们就能遍历桌面的文件,获取到文件的路径,进行根据路径去隐藏文件。

使用这种方案可以实现更加细粒度的控制,也能方便让我们识别一些特殊的文件不去进行隐藏,例如 PPT 文件,PDF 文件,或者具有特殊标志的文件等。在下面内容中,我会展示如何识别特殊的标志,在处理时忽略掉这些特殊标志的文件。

2. 如何使用 lua 脚本

lua 脚本使用非常简单,粗略的看一遍菜鸟教程就能写了 Lua 教程

顺便说一下,一些游戏的 mod 都是用 lua 脚本写的,学会了 lua 脚本,就可以自己去写 mod 或者去修改别人的 mod 了。

3. 使用 lua 调用 shell

-- lua 调用 shell 命令
os.execute(command)

4. 如何通过 hammerspoon 创建菜单

local menubar = hs.menubar.new()
local menuData = {}

-- 创建菜单
local function buildMenu()
   menuData = {}
   table.insert(menuData, {title = "🎁 隐藏文件", fn = onHideMenuClicked})
   table.insert(menuData, {title = '-'})
   table.insert(menuData, {title = "🎉 显示文件", fn = onShowMenuClicked})
   menubar:setTooltip("文件管理")
   menubar:setMenu(menuData)
end

menubar:setTitle('🐾')
buildMenu()

通过这种方式就能在 hammerspoon 中创建一个菜单栏应用了。

将以上代码直接放到 hammerspoon 配置文件 init.lua 中,或者单独写到 hidden.lua 文件,然后在 init.lua 中使用 require "hidden" 就可以了。

它的配置文件组织方式可以参考 hammerspoon-config 我觉得它的组织方式比较清晰明确,可以方便根据自己的需求进行增减。

5. 如何监听菜单点击回调

-- fn = onHideMenuClicked 就是指定点击回调函数
table.insert(menuData, {title = "🎁 隐藏文件", fn = onHideMenuClicked})

5.1 隐藏文件和显示文件点击回调

在菜单被点击后会调用这个方法,在这个方法中对桌面文件夹进行遍历,并调用隐藏和显示文件的方法。

local path = "/Users/gcssloop/Desktop"

-- 隐藏文件菜单点击事件
local function onHideMenuClicked()
   print("Hide Menu Click")
   for file in hs.fs.dir(path) do
      hideFile(file)
   end   
end

-- 显示文件菜单点击事件
local function onShowMenuClicked()
   print("Show Menu Click")
   for file in hs.fs.dir(path) do
      showFile(file)
   end
end

5.2 显示和隐藏文件

在这一步中会忽略一些特殊文件和特殊文件夹,例如 . .. .DS_Store 这些特殊文件不需要进行处理。

它最终会调用的 chflagsWithTags 方法。

```lua
-- 隐藏文件, 忽略特殊文件和文件夹
local function hideFile(file)
local filePath = path .. "/" .. file
local attr = hs.fs.attributes(filePath)
local tags = hs.fs.tagsGet(filePath)
if attr.mode == 'directory' and file ~= '.' and file ~= '..' then
chflagsWithTags(tags, filePath, "hidden")
end
if attr.mode == 'file' and file ~= ".DS_Store" then
chflagsWithTags(tags, filePath, "hidden")
end
end

-- 显示文件, 忽略特殊文件和文件夹
local function showFile(file)
local filePath = path .. "/" .. file
local attr = hs.fs.attributes(filePath)
local tags = hs.fs.tagsGet(filePath)
if attr.mode == 'directory' and file ~= '.' and file ~= '..' then
chflagsWithTags(tags, filePath, "nohidden")
end

top Created with Sketch.