Compare commits
	
		
			3 Commits
		
	
	
		
			6d7e11c238
			...
			2f948e13fb
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 2f948e13fb | |||
| b83574c3e0 | |||
|  | 768e9ad516 | 
							
								
								
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -1,4 +1,5 @@ | ||||
| /.idea/ | ||||
| /*.zip | ||||
| .idea/ | ||||
| build/ | ||||
| build/ | ||||
| .DS_Store | ||||
							
								
								
									
										17
									
								
								init.lua
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								init.lua
									
									
									
									
									
								
							| @ -3,14 +3,15 @@ package.path = hs.configdir .. '/?.lua;' .. hs.configdir .. '/?/init.lua;' .. hs | ||||
| 
 | ||||
| require "modules/reload" | ||||
| require "modules/hotkey" | ||||
| require "modules/commons" | ||||
| require "modules/system" | ||||
| -- require "modules/commons" | ||||
| -- require "modules/system" | ||||
| require "modules/windows" | ||||
| require "modules/launcher" | ||||
| require "modules/systemInfo" | ||||
| require "modules/snippet" | ||||
| require "modules/timesync" | ||||
| require "modules/caffeine" | ||||
| require "modules/inputstat" | ||||
| -- require "modules/systemInfo" | ||||
| -- require "modules/snippet" | ||||
| -- require "modules/timesync" | ||||
| -- require "modules/caffeine" | ||||
| -- require "modules/inputstat" | ||||
| require "modules/dict" | ||||
| require "modules/jsonFormat" | ||||
| -- require "modules/jsonFormat" | ||||
|      | ||||
|  | ||||
							
								
								
									
										40
									
								
								jxa/openInChrome.jxa
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								jxa/openInChrome.jxa
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,40 @@ | ||||
| var args = $.NSProcessInfo.processInfo.arguments; | ||||
| var argv = []; | ||||
| var argc = args.count; | ||||
| for (var i = 4; i < argc; i++) { | ||||
|     argv.push(ObjC.unwrap(args.objectAtIndex(i))); | ||||
| } | ||||
| var inputUrl = argv[0]; | ||||
| 
 | ||||
| var Chrome = Application('Google Chrome'); | ||||
| var windows = Chrome.windows(); | ||||
| var foundTab = false; | ||||
| 
 | ||||
| // 遍历所有窗口和标签页 | ||||
| for (var i = 0; i < windows.length; i++) { | ||||
|     var window = windows[i]; | ||||
|     var tabs = window.tabs(); | ||||
|     for (var j = 0; j < tabs.length; j++) { | ||||
|         var tab = tabs[j]; | ||||
|         if (tab.url().startsWith(inputUrl)) { | ||||
|             // 激活包含URL的窗口 | ||||
|             Chrome.activate(); | ||||
|             window.index = i + 1; // 窗口索引是从1开始的 | ||||
|             // 激活对应的标签页 | ||||
|             window.activeTabIndex = j + 1; // 标签索引也是从1开始的 | ||||
|             foundTab = true; | ||||
|             break; | ||||
|         } | ||||
|     } | ||||
|     if (foundTab) { | ||||
|         break; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| // 如果没有找到匹配的标签页,打开新窗口并导航到URL | ||||
| if (!foundTab) { | ||||
|     var newWindow = Chrome.Window().make(); | ||||
|     var newTab = newWindow.tabs[0]; | ||||
|     newTab.url = inputUrl; | ||||
|     Chrome.activate(); | ||||
| } | ||||
| @ -2,4 +2,5 @@ hyper = {"cmd", "ctrl", "alt"} | ||||
| hyperShift = {"alt", "shift"} | ||||
| hyperCtrl = {"alt", "ctrl"} | ||||
| hyperAlt = {"ctrl", "alt", "shift"} | ||||
| hyperCmd = {"alt", "cmd"} | ||||
| hyperCmd = {"alt", "cmd"} | ||||
| f19 = {'cmd','alt','shift','ctrl'} | ||||
| @ -1,46 +1,58 @@ | ||||
| local hotkey = require "hs.hotkey" | ||||
| local grid = require "hs.grid" | ||||
| local window = require "hs.window" | ||||
| local application = require "hs.application" | ||||
| local appfinder = require "hs.appfinder" | ||||
| local fnutils = require "hs.fnutils" | ||||
| -- http://qtdebug.com/mac-hammerspoon/ | ||||
| -- 键和应用对 | ||||
| -- 提示: 数字作为键,需要使用 [Number] 的格式 | ||||
| 
 | ||||
| grid.setMargins({0, 0}) | ||||
| 
 | ||||
| applist = { | ||||
|     {shortcut = 'A',appname = 'Launchpad'}, | ||||
|     {shortcut = 'C',appname = 'calendar'}, | ||||
|     {shortcut = 'D',appname = 'Disk Utility'}, | ||||
|     {shortcut = 'E',appname = 'Finder'}, | ||||
|     {shortcut = 'G',appname = 'Google Chrome'}, | ||||
|     {shortcut = 'Q',appname = 'Activity Monitor'}, | ||||
|     {shortcut = 'T',appname = 'Terminal'}, | ||||
|     {shortcut = 'S',appname = 'System Preferences'}, | ||||
|     {shortcut = 'Z',appname = 'Calculator'}, | ||||
| local KEY_APP_PAIRS = { | ||||
|     [5] = "QSpace Pro.app", | ||||
|     Q = "QQ.app",W = "WeChat.app",E = "Microsoft Edge.app",T = "iTerm.app",I = "IINA.app",O = "Obsidian.app", P = "/Users/tanpengsccd/Applications/JetBrains Toolbox/PyCharm Professional Edition.app", | ||||
|     A = "ILink.app", S = "Surge.app",F = "/System/Volumes/Data/Applications/Apifox.app" ,G = "https://ai.h6.work",K = "Spotify.app", L = "NeteaseMusic.app", | ||||
|     Z = "QSpace Pro.app",X = "Xcode.app",C = "Google Chrome.app",V = "Visual Studio Code.app",B="iTerm.app",N = "Notes.app",M = "Telegram.app", -- B = "wechatwebdevtools.app"*/ | ||||
|      | ||||
|     -- [2] = "Notable.app", | ||||
|     -- [3] = "Typora.app", | ||||
| } | ||||
| -- 修饰键 这里设置为 f19 | ||||
| 
 | ||||
| fnutils.each(applist, function(entry) | ||||
|     hotkey.bind({'ctrl', 'shift'}, entry.shortcut, entry.appname, function() | ||||
|         application.launchOrFocus(entry.appname) | ||||
|         -- toggle_application(applist[i].appname) | ||||
|     end) | ||||
| local  MOFIFER_KEY = f19 | ||||
| -- local  MOFIFER_KEY = "alt"  | ||||
| 
 | ||||
| -- 显示 Finder:  | ||||
| hs.hotkey.bind(MOFIFER_KEY, "1", function() | ||||
|     hs.application.open("/System/Library/CoreServices/Finder.app") | ||||
|     hs.application.get("com.apple.finder"):setFrontmost(true) | ||||
| end) | ||||
| 
 | ||||
| -- Toggle an application between being the frontmost app, and being hidden | ||||
| function toggle_application(_app) | ||||
|     local app = appfinder.appFromName(_app) | ||||
|     if not app then | ||||
|         application.launchOrFocus(_app) | ||||
|         return | ||||
|     end | ||||
|     local mainwin = app:mainWindow() | ||||
|     if mainwin then | ||||
|         if mainwin == window.focusedWindow() then | ||||
|             mainwin:application():hide() | ||||
|         else | ||||
|             mainwin:application():activate(true) | ||||
|             mainwin:application():unhide() | ||||
|             mainwin:focus() | ||||
|         end | ||||
| -- 重新加载配置  | ||||
| hs.hotkey.bind(f19, "R", function() | ||||
|     hs.reload() | ||||
| end) | ||||
| -------------------------------------------------------------------------------------- | ||||
| -- 按下 "F19+键" 会打开或激活对应的应用,如果应用不是绝对路径,则指的是 /Applications 中的应用 -- | ||||
| -------------------------------------------------------------------------------------- | ||||
| function bindAppWithHotkey(keyAppPairs,modifierKey) | ||||
|     -- hs.alert.show("modifierKey,key: " .. modifierKey .. "," .. keyAppPairs ..) | ||||
|     -- 确保MODIFIER_KEY已经被传递进来或在这里定义,例如MODIFIER_KEY = {"cmd", "alt"} | ||||
|     for key, target in pairs(keyAppPairs) do | ||||
|         hs.hotkey.bind(modifierKey, key, function() | ||||
|             hs.alert.show("" .. target) | ||||
|             -- 如果是以http前缀的,就是网址,需要使用 Chrome 打开 | ||||
|             if string.find(target, "^http") then  -- 使用'^http'来确保字符串以http开始 | ||||
|                 -- hs.alert.show("URL:" .. target) | ||||
|                 local url = target | ||||
|                 local scriptPath = os.getenv("HOME") .. "/.hammerspoon/jxa/openInChrome.jxa" -- 使用环境变量获取用户目录 | ||||
|                 local command = "osascript -l JavaScript " .. scriptPath .. " '" .. url .. "'" | ||||
|                 hs.execute(command) | ||||
|                 return | ||||
|             elseif string.find(target, "app$") then   -- 其它都当APP 处理 | ||||
|                 -- hs.alert.show("APP:" .. target) | ||||
|                 hs.application.launchOrFocus(target) -- 这种可以只传入app name,也可以传入路径 | ||||
|                 return | ||||
|             else  | ||||
|                 hs.alert.show("未知类型:" .. target) | ||||
|             end | ||||
|         end) | ||||
|     end | ||||
| end | ||||
| 
 | ||||
| -- 这里绑定 | ||||
| bindAppWithHotkey(KEY_APP_PAIRS,MOFIFER_KEY) | ||||
| @ -11,11 +11,12 @@ local fnutils = require "hs.fnutils" | ||||
| local geometry = require "hs.geometry" | ||||
| local mouse = require "hs.mouse" | ||||
| 
 | ||||
| local MOFIFER_KEY_HALF = f19 | ||||
| -- default 0.2 | ||||
| window.animationDuration = 0 | ||||
| window.animationDuration = 0.1 | ||||
| 
 | ||||
| -- left half | ||||
| hotkey.bind(hyper, "Left", function() | ||||
| hotkey.bind(MOFIFER_KEY_HALF, "Left", function() | ||||
|   if window.focusedWindow() then | ||||
|     window.focusedWindow():moveToUnit(layout.left50) | ||||
|   else | ||||
| @ -24,37 +25,37 @@ hotkey.bind(hyper, "Left", function() | ||||
| end) | ||||
| 
 | ||||
| -- right half | ||||
| hotkey.bind(hyper, "Right", function() | ||||
| hotkey.bind(MOFIFER_KEY_HALF, "Right", function() | ||||
|   window.focusedWindow():moveToUnit(layout.right50) | ||||
| end) | ||||
| 
 | ||||
| -- top half | ||||
| hotkey.bind(hyper, "Up", function() | ||||
| hotkey.bind(MOFIFER_KEY_HALF, "Up", function() | ||||
|   window.focusedWindow():moveToUnit'[0,0,100,50]' | ||||
| end) | ||||
| 
 | ||||
| -- bottom half | ||||
| hotkey.bind(hyper, "Down", function() | ||||
| hotkey.bind(MOFIFER_KEY_HALF, "Down", function() | ||||
|   window.focusedWindow():moveToUnit'[0,50,100,100]' | ||||
| end) | ||||
| 
 | ||||
| -- left top quarter | ||||
| hotkey.bind(hyperAlt, "Left", function() | ||||
| hotkey.bind(MOFIFER_KEY_HALF, "[", function() | ||||
|   window.focusedWindow():moveToUnit'[0,0,50,50]' | ||||
| end) | ||||
| 
 | ||||
| -- right bottom quarter | ||||
| hotkey.bind(hyperAlt, "Right", function() | ||||
| hotkey.bind(MOFIFER_KEY_HALF, "'", function() | ||||
|   window.focusedWindow():moveToUnit'[50,50,100,100]' | ||||
| end) | ||||
| 
 | ||||
| -- right top quarter | ||||
| hotkey.bind(hyperAlt, "Up", function() | ||||
| hotkey.bind(MOFIFER_KEY_HALF, "]", function() | ||||
|   window.focusedWindow():moveToUnit'[50,0,100,50]' | ||||
| end) | ||||
| 
 | ||||
| -- left bottom quarter | ||||
| hotkey.bind(hyperAlt, "Down", function() | ||||
| hotkey.bind(MOFIFER_KEY_HALF, ";", function() | ||||
|   window.focusedWindow():moveToUnit'[0,50,50,100]' | ||||
| end) | ||||
| 
 | ||||
| @ -69,7 +70,7 @@ hotkey.bind(hyper, 'C', function() | ||||
| end) | ||||
| 
 | ||||
| -- maximize window | ||||
| hotkey.bind(hyper, 'M', function() toggle_maximize() end) | ||||
| hotkey.bind(MOFIFER_KEY_HALF, 'return', function() window.focusedWindow(): maximize() end) | ||||
| 
 | ||||
| -- defines for window maximize toggler | ||||
| local frameCache = {} | ||||
| @ -86,34 +87,23 @@ function toggle_maximize() | ||||
| end | ||||
| 
 | ||||
| -- display a keyboard hint for switching focus to each window | ||||
| hotkey.bind(hyperShift, '/', function() | ||||
|     hints.windowHints() | ||||
|     -- Display current application window | ||||
|     -- hints.windowHints(hs.window.focusedWindow():application():allWindows()) | ||||
| end) | ||||
| -- hotkey.bind(hyperShift, '/', function() | ||||
| --     hints.windowHints() | ||||
| --     -- Display current application window | ||||
| --     -- hints.windowHints(hs.window.focusedWindow():application():allWindows()) | ||||
| -- end) | ||||
| 
 | ||||
| -- switch active window | ||||
| hotkey.bind(hyperShift, "H", function() | ||||
|   window.switcher.nextWindow() | ||||
| end) | ||||
| -- hotkey.bind(hyperShift, "H", function() | ||||
| --   window.switcher.nextWindow() | ||||
| -- end) | ||||
| 
 | ||||
| -- move active window to previous monitor | ||||
| hotkey.bind(hyperShift, "Left", function() | ||||
|   window.focusedWindow():moveOneScreenWest() | ||||
| end) | ||||
| 
 | ||||
| -- move active window to next monitor | ||||
| hotkey.bind(hyperShift, "Right", function() | ||||
|   window.focusedWindow():moveOneScreenEast() | ||||
| end) | ||||
| 
 | ||||
| -- move cursor to previous monitor | ||||
| hotkey.bind(hyperCtrl, "Right", function () | ||||
|   focusScreen(window.focusedWindow():screen():previous()) | ||||
| end) | ||||
| 
 | ||||
| -- move cursor to next monitor | ||||
| hotkey.bind(hyperCtrl, "Left", function () | ||||
| -- move cursor to previous/next monitor | ||||
| -- hotkey.bind(hyperCtrl, "Right", function () | ||||
| --   focusScreen(window.focusedWindow():screen():previous()) | ||||
| -- end) | ||||
| hotkey.bind(f19, "`", function () | ||||
|   focusScreen(window.focusedWindow():screen():next()) | ||||
| end) | ||||
| 
 | ||||
| @ -153,19 +143,37 @@ moveto = function(win, n) | ||||
|      | ||||
|   end | ||||
| end | ||||
| 
 | ||||
| -- move cursor to monitor 1 and maximize the window | ||||
| hotkey.bind(hyperShift, "1", function() | ||||
|   local win = window.focusedWindow() | ||||
|   moveto(win, 1) | ||||
| -- cycled move active window to another screen | ||||
| hs.hotkey.bind( f19, 'tab', function() | ||||
|   -- get the focused window | ||||
|   local win = hs.window.focusedWindow() | ||||
|   -- get the screen where the focused window is displayed, a.k.a. current screen | ||||
|   local screen = win:screen()              | ||||
|   -- compute the unitRect of the focused window relative to the current screen | ||||
|   -- and move the window to the next screen setting the same unitRect  | ||||
|   win:move(win:frame():toUnitRect(screen:frame()), screen:next(), true, 0) | ||||
| end) | ||||
| 
 | ||||
| hotkey.bind(hyperShift, "2", function() | ||||
|   local win = window.focusedWindow() | ||||
|   moveto(win, 2) | ||||
| end) | ||||
| -- -- move active window to monitor 1 and maximize the window | ||||
| -- hotkey.bind(f19, "1", function() | ||||
| --   local win = window.focusedWindow() | ||||
| --   moveto(win, 1) | ||||
| -- end) | ||||
| 
 | ||||
| hotkey.bind(hyperShift, "3", function() | ||||
|   local win = window.focusedWindow() | ||||
|   moveto(win, 3) | ||||
| end) | ||||
| -- hotkey.bind(f19, "2", function() | ||||
| --   local win = window.focusedWindow() | ||||
| --   moveto(win, 2) | ||||
| -- end) | ||||
| 
 | ||||
| -- hotkey.bind(f19, "3", function() | ||||
| --   local win = window.focusedWindow() | ||||
| --   moveto(win, 3) | ||||
| -- end) | ||||
| 
 | ||||
| -- -- move active window to previous/next monitor | ||||
| -- hotkey.bind(MOFIFER_KEY_HALF, '-', function() | ||||
| --   window.focusedWindow():moveOneScreenWest():maximize() | ||||
| -- end) | ||||
| -- hotkey.bind(MOFIFER_KEY_HALF, '=', function() | ||||
| --   window.focusedWindow():moveOneScreenEast():maximize() | ||||
| -- end) | ||||
							
								
								
									
										0
									
								
								timesync/timesync.sh
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								timesync/timesync.sh
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
		Loading…
	
		Reference in New Issue
	
	Block a user