【LUA】转载github自用二改模版——调节音量、显示七日天气、历史剪贴板、系统信息显示

本文主要是介绍【LUA】转载github自用二改模版——调节音量、显示七日天气、历史剪贴板、系统信息显示,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

二改模版笔记

自动重新加载HS

function reloadConfig(files)doReload = falsefor _,file in pairs(files) doif file:sub(-4) == ".lua" thendoReload = trueendendif doReload thenhs.reload()end
end
myWatcher = hs.pathwatcher.new(os.getenv("HOME") .. "/.hammerspoon/", reloadConfig):start()
hs.alert.show("Config loaded")

调节音量

function changeVolume(diff)return function()local current = hs.audiodevice.defaultOutputDevice():volume()local new = math.min(100, math.max(0, math.floor(current + diff)))if new > 0 thenhs.audiodevice.defaultOutputDevice():setMuted(false)endhs.alert.closeAll(0.0)hs.alert.show("Volume " .. new .. "%", {}, 0.5)hs.audiodevice.defaultOutputDevice():setVolume(new)end
endhs.hotkey.bind({"shift","ctrl",'command'}, 'Down', changeVolume(-3))
hs.hotkey.bind({"shift","ctrl",'command'}, 'Up', changeVolume(3))

显示七日天气

local urlApi = 'http://v1.yiketianqi.com/free/api'
local menubar = hs.menubar.new()
local menuData = {}local weaEmoji = {lei = '🌩️',qing = '☀️',shachen = '😷',wu = '🌫',xue = '❄️',yu = '🌧',yujiaxue = '🌨',yun = '☁️',zhenyu = '🌧',yin = '⛅️',default = ''
}function updateMenubar()menubar:setTooltip("Weather Info")menubar:setMenu(menuData)
endfunction getWeather()hs.http.doAsyncRequest(urlApi, "GET", nil,nil, function(code, body, htable)if code ~= 200 thenprint('get weather error:'..code)returnendrawjson = hs.json.decode(body)city = rawjson.citymenuData = {}for k, v in pairs(rawjson.data) doif k == 1 thenmenubar:setTitle(weaEmoji[v.wea_img])if v.win_speed == "<3级" thentitlestr = string.format("%s  %s %s  🌡️%s-%s°C", city,weaEmoji[v.wea_img], v.wea, v.tem_night, v.tem_day)elsetitlestr = string.format("%s  %s 🌡️%s-%s°C  💨%s %s %s", city,weaEmoji[v.wea_img],v.tem_night, v.tem_day, v.win_speed,  v.win, v.wea)enditem = { title = titlestr }table.insert(menuData, item)table.insert(menuData, {title = '-'})elseif v.win_speed == "<3级" thentitlestr = string.format("%s  %s 🌡️%s-%s°C     %s",  v.date, weaEmoji[v.wea_img], v.tem_night, v.tem_day, v.wea)elsetitlestr = string.format("%s  %s 🌡️%s-%s°C  💨%s %s %s",  v.date, weaEmoji[v.wea_img],v.tem_night, v.tem_day, v.win_speed, v.win, v.wea)enditem = { title = titlestr }table.insert(menuData, item)endendupdateMenubar()end)
endmenubar:setTitle('👀')
getWeather()
updateMenubar()
hs.timer.doEvery(3000, getWeather)

剪贴板

--[[From https://github.com/victorso/.hammerspoon/blob/master/tools/clipboard.luaModified by Diego Zamboni
]]---- Feel free to change those settings
local frequency = 0.8 -- Speed in seconds to check for clipboard changes. If you check too frequently, you will loose performance, if you check sparsely you will loose copies
local hist_size = 100 -- How many items to keep on history
local label_length = 70 -- How wide (in characters) the dropdown menu should be. Copies larger than this will have their label truncated and end with "…" (unicode for elipsis ...)
local honor_clearcontent = false --asmagill request. If any application clears the pasteboard, we also remove it from the history https://groups.google.com/d/msg/hammerspoon/skEeypZHOmM/Tg8QnEj_N68J
local pasteOnSelect = false -- Auto-type on click-- Don't change anything bellow this line
local jumpcut = hs.menubar.new()
jumpcut:setTooltip("Clipboard history")
local pasteboard = require("hs.pasteboard") -- http://www.hammerspoon.org/docs/hs.pasteboard.html
local settings = require("hs.settings") -- http://www.hammerspoon.org/docs/hs.settings.html
local last_change = pasteboard.changeCount() -- displays how many times the pasteboard owner has changed // Indicates a new copy has been made--Array to store the clipboard history
local clipboard_history = settings.get("so.victor.hs.jumpcut") or {} --If no history is saved on the system, create an empty historyfunction subStringUTF8(str, startIndex, endIndex)if startIndex < 0 thenstartIndex = subStringGetTotalIndex(str) + startIndex + 1endif endIndex ~= nil and endIndex < 0 thenendIndex = subStringGetTotalIndex(str) + endIndex + 1endif endIndex == nil then return string.sub(str, subStringGetTrueIndex(str, startIndex))elsereturn string.sub(str, subStringGetTrueIndex(str, startIndex), subStringGetTrueIndex(str, endIndex + 1) - 1)end
end--返回当前截取字符串正确下标
function subStringGetTrueIndex(str, index)local curIndex = 0local i = 1local lastCount = 1repeat lastCount = subStringGetByteCount(str, i)i = i + lastCountcurIndex = curIndex + 1until(curIndex >= index)return i - lastCount
end--返回当前字符实际占用的字符数
function subStringGetByteCount(str, index)local curByte = string.byte(str, index)local byteCount = 1if curByte == nil thenbyteCount = 0elseif curByte > 0 and curByte <= 127 thenbyteCount = 1elseif curByte>=192 and curByte<=223 thenbyteCount = 2elseif curByte>=224 and curByte<=239 thenbyteCount = 3elseif curByte>=240 and curByte<=247 thenbyteCount = 4endreturn byteCount
end-- Append a history counter to the menu
function setTitle()if (#clipboard_history == 0) thenjumpcut:setTitle("✂") -- Unicode magicelsejumpcut:setTitle("✂") -- Unicode magic--      jumpcut:setTitle("✂ ("..#clipboard_history..")") -- updates the menu counterend
endfunction putOnPaste(string,key)if (pasteOnSelect) thenhs.eventtap.keyStrokes(string)pasteboard.setContents(string)last_change = pasteboard.changeCount()elseif (key.alt == true) then -- If the option/alt key is active when clicking on the menu, perform a "direct paste", without changing the clipboardhs.eventtap.keyStrokes(string) -- Defeating paste blocking http://www.hammerspoon.org/go/#pasteblockelsepasteboard.setContents(string)last_change = pasteboard.changeCount() -- Updates last_change to prevent item duplication when putting on pasteendend
end-- Clears the clipboard and history
function clearAll()pasteboard.clearContents()clipboard_history = {}settings.set("so.victor.hs.jumpcut",clipboard_history)now = pasteboard.changeCount()setTitle()
end-- Clears the last added to the history
function clearLastItem()table.remove(clipboard_history,#clipboard_history)settings.set("so.victor.hs.jumpcut",clipboard_history)now = pasteboard.changeCount()setTitle()
endfunction pasteboardToClipboard(item)-- Loop to enforce limit on qty of elements in history. Removes the oldest itemswhile (#clipboard_history >= hist_size) dotable.remove(clipboard_history,1)endtable.insert(clipboard_history, item)settings.set("so.victor.hs.jumpcut",clipboard_history) -- updates the saved historysetTitle() -- updates the menu counter
end-- Dynamic menu by cmsj https://github.com/Hammerspoon/hammerspoon/issues/61#issuecomment-64826257
populateMenu = function(key)setTitle() -- Update the counter every time the menu is refreshedmenuData = {}if (#clipboard_history == 0) thentable.insert(menuData, {title="None", disabled = true}) -- If the history is empty, display "None"elsefor k,v in pairs(clipboard_history) doif (string.len(v) > label_length) thentable.insert(menuData,1, {title=subStringUTF8(v,0,label_length).."…", fn = function() putOnPaste(v,key) end }) -- Truncate long stringselsetable.insert(menuData,1, {title=v, fn = function() putOnPaste(v,key) end })end -- end if elseend-- end forend-- end if else-- footertable.insert(menuData, {title="-"})table.insert(menuData, {title="Clear All", fn = function() clearAll() end })if (key.alt == true or pasteOnSelect) thentable.insert(menuData, {title="Direct Paste Mode ✍", disabled=true})endreturn menuData
end-- If the pasteboard owner has changed, we add the current item to our history and update the counter.
function storeCopy()now = pasteboard.changeCount()if (now > last_change) thencurrent_clipboard = pasteboard.getContents()-- asmagill requested this feature. It prevents the history from keeping items removed by password managersif (current_clipboard == nil and honor_clearcontent) thenclearLastItem()elsepasteboardToClipboard(current_clipboard)endlast_change = nowend
end--Checks for changes on the pasteboard. Is it possible to replace with eventtap?
timer = hs.timer.new(frequency, storeCopy)
timer:start()setTitle() --Avoid wrong title if the user already has something on his saved history
jumpcut:setMenu(populateMenu)hs.hotkey.bind({"cmd", "shift"}, "v", function() jumpcut:popupMenu(hs.mouse.getAbsolutePosition()) end)

系统信息显示

--- 显示系统信息
--- 可显示CPU\内存\硬盘\网络等实时信息
--- Created by sugood(https://github.com/sugood).
--- DateTime: 2022/01/14 22:00
---local menubaritem = hs.menubar.new()
local menuData = {}-- ipv4Interface ipv6 Interface
local interface = hs.network.primaryInterfaces()-- 该对象用于存储全局变量,避免每次获取速度都创建新的局部变量
local obj = {}function init()if interface thenlocal interface_detail = hs.network.interfaceDetails(interface)if interface_detail.IPv4 thenlocal ipv4 = interface_detail.IPv4.Addresses[1]table.insert(menuData, {title = "IPv4:" .. ipv4,tooltip = "Copy Ipv4 to clipboard",fn = function()hs.pasteboard.setContents(ipv4)end})endlocal mac = hs.execute('ifconfig ' .. interface .. ' | grep ether | awk \'{print $2}\'')table.insert(menuData, {title = 'MAC:' .. mac,tooltip = 'Copy MAC to clipboard',fn = function()hs.pasteboard.setContents(mac)end})obj.last_down = hs.execute('netstat -ibn | grep -e ' .. interface .. ' -m 1 | awk \'{print $7}\'')obj.last_up = hs.execute('netstat -ibn | grep -e ' .. interface .. ' -m 1 | awk \'{print $10}\'')elseobj.last_down =  0obj.last_down =  0endlocal date=os.date("%Y-%m-%d %a");table.insert(menuData, {title = 'Date: '..date,tooltip = 'Copy Now DateTime',fn = function()hs.pasteboard.setContents(os.date("%Y-%m-%d %H:%M:%S"))end})table.insert(menuData, {title = '打开:监  视  器    (⇧⌃A)',tooltip = 'Show Activity Monitor',fn = function()bindActivityMonitorKey()end})table.insert(menuData, {title = '打开:磁盘工具    (⇧⌃D)',tooltip = 'Show Disk Utility',fn = function()bindDiskKey()end})table.insert(menuData, {title = '打开:系统日历    (⇧⌃C)',tooltip = 'Show calendar',fn = function()bindCalendarKey()end})menubaritem:setMenu(menuData)
endfunction scan()if interface thenobj.current_down = hs.execute('netstat -ibn | grep -e ' .. interface .. ' -m 1 | awk \'{print $7}\'')obj.current_up = hs.execute('netstat -ibn | grep -e ' .. interface .. ' -m 1 | awk \'{print $10}\'')elseobj.current_down  = 0obj.current_up = 0endobj.cpu_used = getCpu()obj.disk_used = getRootVolumes()obj.mem_used = getVmStats()obj.down_bytes = obj.current_down - obj.last_downobj.up_bytes = obj.current_up - obj.last_upobj.down_speed = format_speed(obj.down_bytes)obj.up_speed = format_speed(obj.up_bytes)obj.display_text = hs.styledtext.new('▲ ' .. obj.up_speed .. '\n'..'▼ ' .. obj.down_speed , {font={size=9}, color={hex='#FFFFFF'}, paragraphStyle={alignment="left", maximumLineHeight=18}})obj.display_disk_text = hs.styledtext.new(obj.disk_used ..'\n'.. 'SSD ' , {font={size=9}, color={hex='#FFFFFF'}, paragraphStyle={alignment="left", maximumLineHeight=18}})obj.display_mem_text = hs.styledtext.new(obj.mem_used ..'\n'.. 'MEM ' , {font={size=9}, color={hex='#FFFFFF'}, paragraphStyle={alignment="left", maximumLineHeight=18}})obj.display_cpu_text = hs.styledtext.new(obj.cpu_used ..'\n'.. 'CPU ' , {font={size=9}, color={hex='#FFFFFF'}, paragraphStyle={alignment="left", maximumLineHeight=18}})obj.last_down = obj.current_downobj.last_up = obj.current_uplocal canvas = hs.canvas.new{x = 0, y = 0, h = 24, w = 30+30+30+60}-- canvas[1] = {type = 'text', text = obj.display_text}canvas:appendElements({type = "text",text = obj.display_cpu_text,-- withShadow = true,trackMouseEnterExit = true,},{type = "text",text = obj.display_disk_text,-- withShadow = true,trackMouseEnterExit = true,frame = { x = 30, y = "0", h = "1", w = "1", }},{type = "text",text = obj.display_mem_text,-- withShadow = true,trackMouseEnterExit = true,frame = { x = 60, y = "0", h = "1", w = "1", }},{type = "text",text = obj.display_text,-- withShadow = true,trackMouseEnterExit = true,frame = { x = 90, y = "0", h = "1", w = "1", }})menubaritem:setIcon(canvas:imageFromCanvas())canvas:delete()canvas = nil
endfunction format_speed(bytes)-- 单位 Byte/sif bytes < 1024 thenreturn string.format('%6.0f', bytes) .. ' B/s'else-- 单位 KB/sif bytes < 1048576 then-- 因为是每两秒刷新一次,所以要除以 (1024 * 2)return string.format('%6.1f', bytes / 2048) .. ' KB/s'-- 单位 MB/selse-- 除以 (1024 * 1024 * 2)return string.format('%6.1f', bytes / 2097152) .. ' MB/s'endend
endfunction getCpu()local data = hs.host.cpuUsage()local cpu = (data["overall"]["active"])return formatPercent(cpu)
endfunction getVmStats()local vmStats = hs.host.vmStat()-- --1024^2-- local megDiv = 1048576-- local megMulti = vmStats.pageSize / megDiv-- local totalMegs = vmStats.memSize / megDiv  --总内存-- local megsCached = vmStats.fileBackedPages * megMulti   --缓存内存-- local freeMegs = vmStats.pagesFree * megMulti   --空闲内存-- --第一种方法使用 APP内存+联动内存+被压缩内存 = 已使用内存-- --local megsUsed =  vmStats.pagesWiredDown * megMulti -- 联动内存-- --megsUsed = megsUsed + vmStats.pagesUsedByVMCompressor * megMulti -- 被压缩内存-- --megsUsed = megsUsed + (vmStats.pagesActive +vmStats.pagesSpeculative)* megMulti  -- APP内存-- --第二种方法使用 总内存-缓存内存-空闲内存 = 已使用内存-- local megsUsed = totalMegs - megsCached - freeMegs--第三种方法,由于部分设备pageSize获取不正确,所以只能通过已使用页数+缓存页数+空闲页数计算总页数local megsUsed =  vmStats.pagesWiredDown -- 联动内存megsUsed = megsUsed + vmStats.pagesUsedByVMCompressor -- 被压缩内存megsUsed = megsUsed + vmStats.pagesActive +vmStats.pagesSpeculative -- APP内存local megsCached = vmStats.fileBackedPages   --缓存内存local freeMegs = vmStats.pagesFree   --空闲内存local totalMegs = megsUsed + megsCached + freeMegslocal usedMem = megsUsed/totalMegs * 100return formatPercent(usedMem)
endfunction getRootVolumes()local vols = hs.fs.volume.allVolumes()for key, vol in pairs(vols) dolocal size = vol.NSURLVolumeTotalCapacityKeylocal free = vol.NSURLVolumeAvailableCapacityKeylocal usedSSD = (1-free/size) * 100if ( string.find(vol.NSURLVolumeNameKey,'Macintosh') ~= nil) thenreturn formatPercent(usedSSD)endendreturn ' 0%'
endfunction formatPercent(percent)if ( percent <= 0 ) thenreturn "  1%"elseif ( percent < 10 ) thenreturn "  " .. string.format("%.f", percent) .. "%"elseif  (percent > 99 )thenreturn "100%"elsereturn string.format("%.f", percent) .. "%"end
endlocal setSysInfo= function()--    if config ~=nil and config[1].showSysInfo ~= 'on' thenif 1 thenif(menuBarItem ~= nil and menuBarItem:isInMenuBar() == false) thenreturnendif (menuBarItem == nil) thenprint("设置状态栏:系统信息")menuBarItem= hs.menubar.new()elseif (menuBarItem:isInMenuBar() == false) thenmenuBarItem:delete()menuBarItem= hs.menubar.new()endinit()scan()if obj.timer thenobj.timer:stop()obj.timer = nilend-- 三秒刷新一次obj.timer = hs.timer.doEvery(3, scan):start()end
endfunction initData()setSysInfo()--监听系统信息开关的状态,判断是否要重置hs.timer.doEvery(1, setSysInfo)
end-- 初始化
initData()

这篇关于【LUA】转载github自用二改模版——调节音量、显示七日天气、历史剪贴板、系统信息显示的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/656720

相关文章

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形

在不同系统间迁移Python程序的方法与教程

《在不同系统间迁移Python程序的方法与教程》本文介绍了几种将Windows上编写的Python程序迁移到Linux服务器上的方法,包括使用虚拟环境和依赖冻结、容器化技术(如Docker)、使用An... 目录使用虚拟环境和依赖冻结1. 创建虚拟环境2. 冻结依赖使用容器化技术(如 docker)1. 创

JS 实现复制到剪贴板的几种方式小结

《JS实现复制到剪贴板的几种方式小结》本文主要介绍了JS实现复制到剪贴板的几种方式小结,包括ClipboardAPI和document.execCommand这两种方法,具有一定的参考价值,感兴趣的... 目录一、Clipboard API相关属性方法二、document.execCommand优点:缺点:

CentOS系统Maven安装教程分享

《CentOS系统Maven安装教程分享》本文介绍了如何在CentOS系统中安装Maven,并提供了一个简单的实际应用案例,安装Maven需要先安装Java和设置环境变量,Maven可以自动管理项目的... 目录准备工作下载并安装Maven常见问题及解决方法实际应用案例总结Maven是一个流行的项目管理工具

C#实现系统信息监控与获取功能

《C#实现系统信息监控与获取功能》在C#开发的众多应用场景中,获取系统信息以及监控用户操作有着广泛的用途,比如在系统性能优化工具中,需要实时读取CPU、GPU资源信息,本文将详细介绍如何使用C#来实现... 目录前言一、C# 监控键盘1. 原理与实现思路2. 代码实现二、读取 CPU、GPU 资源信息1.

如何设置vim永久显示行号

《如何设置vim永久显示行号》在Linux环境下,vim默认不显示行号,这在程序编译出错时定位错误语句非常不便,通过修改vim配置文件vimrc,可以在每次打开vim时永久显示行号... 目录设置vim永久显示行号1.临时显示行号2.永www.chinasem.cn久显示行号总结设置vim永久显示行号在li

在C#中获取端口号与系统信息的高效实践

《在C#中获取端口号与系统信息的高效实践》在现代软件开发中,尤其是系统管理、运维、监控和性能优化等场景中,了解计算机硬件和网络的状态至关重要,C#作为一种广泛应用的编程语言,提供了丰富的API来帮助开... 目录引言1. 获取端口号信息1.1 获取活动的 TCP 和 UDP 连接说明:应用场景:2. 获取硬

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学

JAVA系统中Spring Boot应用程序的配置文件application.yml使用详解

《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma

2.1/5.1和7.1声道系统有什么区别? 音频声道的专业知识科普

《2.1/5.1和7.1声道系统有什么区别?音频声道的专业知识科普》当设置环绕声系统时,会遇到2.1、5.1、7.1、7.1.2、9.1等数字,当一遍又一遍地看到它们时,可能想知道它们是什... 想要把智能电视自带的音响升级成专业级的家庭影院系统吗?那么你将面临一个重要的选择——使用 2.1、5.1 还是