oynix

于无声处听惊雷,于无色处见繁花

MacOS输入法输出当前时间

由遇到一个问题到解决一个问题,来发现思维的路径依赖。

博客首页有一个「技术博客」,日常发现的一些有趣的网站、或是值得一读文章,我会不定期记录到里面。今天更新的时候,突然闪出个想法,想给这个页面加一个最后更新时间,这样一来当有人进到这个页面时,就会知道距离上次更新过去了多久,就像是给页面打上一个生产日期。

想到这不是一次性操作,后面每次更新都要获取当前时间,为了避免重复性操作,于是,就产生了这样一个需求,自动获取当前时间。问题在这里发生了一次转向,由添加时间到自动获取当前时间。

对于有些输入法这是个很简单的事,比如搜狗,只需要按下S和J两个按键,在可选项里就会看到当前时间,很是方便。但是MacOS里自带的输入里并没有提供这个功能。

这里面临一次选择,是换输入法,还是在现有的输入法上继续摸索。出于隐私安全方面的考虑,搜狗在处理用户隐私这一块,表现的还是不够克制,因此我决定继续使用系统自带输入法。

对于如何通过自带输入法获取当前时间,我试过向Google的Gemini提问,也试过用同样的问题问ChatGPT(turbo-3.5),虽属不同的平台,回答倒是一致,都告诉我在菜单栏里打开「表情与符号」,里面有一个「时间与日期」的选项,在这里设置格式,然后就可以输出时间了,还说可以通过设置字符替换,当检测到触发词时,便自动替换成时间。

无一例外,均不可行。当我告诉他回答的不对的时候,他又说我说的对,里面确实没有这样一个选项。让我哭笑不得。

于是,探索方式在这里发生转向,放弃人工智能,回到人工。

当我拿着这个问题,去问Google的时候,在搜索结果排名靠前几个里,竟一下便看到了AI给我的回答,事情一下就合理了。

几经查找和验证,发现可行的方式是通过Automator来实现,创建一个自动化流程,无需输入,通过shell脚本的date命令获取当前的时间,然后再将结果输出,替换当前选中的文本,如果没有选中的内容,则会自动添加是光标的位置。

然后,给这个自动化流程绑定一个全局的系统快捷键,通过快捷键触发流程,即可。

按照,这个步骤实现后,在几个常见的文本输入的地方验证了下,均可行,唯独Sublime无效,而Sublime又是我的主力。

这个时候,问题再一次遇到了分叉。是更换文本编辑软件,还是继续在Sublime上折腾。适应一款软件是需要时间成本的,继续在Sublime上研究也是需要时间成本的,对比了下二者,最终决定还是继续在Sublime上折腾这个事。最主要的原因可能就是,在启动速度上Sublime有很大的优势,同时我还给Sublime设置了Shell快捷命令,此外,文本类型的扩展名默认打开程序,我都设置成了Sublime。

于是,我开始研究为什么系统快捷键会在Sublime没有效果,第一反应想到的就是拦截,我设定的是Command + Shift + Option + Y,Finder占用了太多的快捷键,想到一个,试一下,发现被占用了,再想一个,又发现被占用了,所以最终才用了个这么独特的组合快捷键。

下一步,我想到的就是修改Sublime里这组快捷键的行为,最好是删除,避免和系统的产生冲突,直接解决问题。但问题好像并没有我想象的这么简单,Sublime使用KeyBindings插件管理快捷键,我没有找到其中定义了这个组合,所以没想明白为什么按了之后没有触发系统快捷键的操作,在手动添加了这个组合,将它的command定义成了none,想通过这种方式让其触发系统快捷键,但依然没有奏效。

几次尝试,也走不通这条路,就想放弃了。想到反正触发系统快捷键也是执行date命令获取时间,不如直接在Sublime里定义,Sublime可以自定义快捷键的对应的command,将date命令集成到command里,也可实现需求。

这个时候,继续转向,不再尝试触发系统快捷键,而是自定义Sublime的command。

一个command实际上就是对应一个py文件。点击Preferences里的Browse Packages,会打开一个Packages的目录,该目录以及其子目录下的所有以py结尾并且符合语法的文件,都会被Sublime检测到并可以command的形式调用。点击Tools/Developer/New Plugins,会自动创建一个py文件。

1
2
3
4
5
6
7
8
import sublime
import sublime_plugin


class ExampleCommand(sublime_plugin.TextCommand):
def run(self, edit):
self.view.insert(edit, 0, "Hello, World!")

一个class对应一个command,命名要求是大驼峰,对应的命令是全小写字母,以_连接。我的class名字是InsertDateCommand,那么在快捷键中便可通过insert_date触发。

在我正常尝试了一会在python中调用date命令获取时间后,突然反应过来,都开始写python了,怎么还想着调用命令行的命令呢,不过是获取个时间,直接用datetime不就可以了吗,简单而直接。

1
2
3
4
5
6
7
8
9
10
11
12
import sublime
import sublime_plugin
import datetime


class InsertDateCommand(sublime_plugin.TextCommand):
def run(self, edit):
t = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S %z') + '+0800'
selections = self.view.sel()
if len(selections) == 1 and selections[0].begin() == selections[0].end():
self.view.insert(edit, selections[0].begin(), t)

selections是当前选中的区域,当只选中一个区域,并且区域的长度是0时,才会将格式化后的时间字符串插入到选中区域的起点位置。这么听有点绕,简单说就是调用这个命令后,会把时间戳加到光标位置,如果选中了区域,则什么都不会发生。

快捷键的写法如下,json格式的。

1
2
3
4
5
[

{ "keys": ["super+shift+alt+y"], "command": "insert_date" }
]

至此,问题得到全面解决。

总的来说,在解决一个问题时,可能会不断调整摸索方向,有时也需要调整问题本身,从而才可以不断向着自己的预期靠近。

------------- (完) -------------
  • 本文作者: oynix
  • 本文链接: https://oynix.com/2024/03/168b4c071736/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

欢迎关注我的其它发布渠道