使用 Ubuntu 做自己的办公环境用了将近三年,最近换了新款的 MBP,系统都用的很舒服。

不过 Ubuntu 是在我的 TP W540上部署的,而 W540 + 电源适配太重了(我的电池是9芯的)

用了 mac 多少会吧 Ubuntu 上的一些使用习惯带过来。

其中一个习惯就是,Ubuntu 右上角点时间会出现日历(一个月有那些天的日历),而 mac 的没有,然后就想mac 上应该有自定义实现的方法。

去搜了一些,找到了 GeekTool这个工具,真的很棒,桌面能做多漂亮全看你想象力有多丰富。

我这里主要想实现一个自定义日历,需要用到 shell。

下载地址:https://www.tynsoe.org/v2/geektool/

文档的话,需要大家自己去看英文文档,使用难度:简单。

我想要在桌面显示 上一个月、当前月、下一个月 三个月的日历,并且当前月的当前天 要高亮显示。

需求很简单,做起来有些麻烦,问题主要是OSX 里的命令和 Ubuntu 里的 cal 命令不同。

OSX 里的cal 没有这个功能,既然没有,那就自己写一个吧,python 是一门强大的语言,我选择了用 python 来实现这个功能。

代码如下:

#!/usr/bin/env python
import calendar
import datetime
import re def get_year_month(d):
"""
:param datetime_obj: a datetime object ; for example : datetime.datetime.now()
:return: a datetime object
"""
return d.year, d.month def get_pre_datetime(datetime_obj):
"""
:param datetime_obj: a datetime object ; for example : datetime.datetime.now()
:return: a datetime object
"""
days_count = datetime.timedelta(days=datetime_obj.day)
pre_month_last_day_datetime_obj = datetime_obj - days_count
return pre_month_last_day_datetime_obj def get_next_datetime(datetime_obj):
"""
:param datetime_obj: a datetime object ; for example : datetime.datetime.now()
:return: a datetime object
"""
days_count = calendar.monthrange(datetime_obj.year, datetime_obj.month)[1]
next_month_datetime = datetime_obj + datetime.timedelta(days=days_count+1) - datetime.timedelta(datetime.datetime.now().day)
return next_month_datetime def day_format(datetime_obj, cal_str):
"""
:param datetime_obj: a datetime object ; for example : datetime.datetime.now()
:param d: a datetime object ; for example : datetime.datetime.now()
:return: a datetime object
"""
day = datetime_obj.day
reg_num = "\D{}\D".format(day)
reg = re.search(reg_num, cal_str).group()
ret = re.sub('\d+', "\033[31m{}\033[0m".format(day), reg)
return re.sub(reg, ret, cal_str) if __name__ == '__main__':
currnet_time = datetime.datetime.now() pre_year_month = get_year_month(get_pre_datetime(currnet_time))
currnet_year_month = get_year_month(currnet_time)
next_year_month = get_year_month(get_next_datetime(currnet_time)) # with open('/var/tmp/cal.log', 'w') as f:
# f.write(calendar.month(*pre_year_month, w=3, l=1))
# f.write(day_format(currnet_time, calendar.month(*currnet_year_month, w=3, l=1)))
# f.write(calendar.month(*next_year_month, w=3, l=1)) print(calendar.month(*pre_year_month, w=3, l=1))
print(day_format(currnet_time, calendar.month(*currnet_year_month, w=3, l=2)))
print(calendar.month(*next_year_month, w=3, l=1))

完成后的效果图:

在使用的过程中,跨年也没有问题:

  

给自己的 MAC 添加一个桌面日历的更多相关文章

  1. 给hexo博客的NEXT主题添加一个云日历

    一点废话 hexo中有文件的归档,但是博文的数目多了,浏览的时候也是很不方便的.于是我就有找个云日历的想法了,折腾了几天,网上的方法都试过了.但是没出效果.于是想着自己来写一个.这自己写的这部分是基于 ...

  2. 【转】windows7的桌面右键菜单的“新建”子菜单,在注册表哪个位置,如何在“新建"里面添加一个新项

    点击桌面,就会弹出菜单,然后在“新建”中就又弹出可以新建的子菜单栏.office与txt 的新建都是在这里面的.我想做的事情是:在右键菜单的“新建” 中添加一个“TQ文本”的新建项,然后点击它之后,桌 ...

  3. 给WebApp加一个“壳”,实现Andriod系统添加到桌面

    IOS系统的Safari浏览器有一个“添加到桌面”的功能,能在手机桌面上为你的Webapp添加一个快捷方式,其外观和Native App看起来一样. 这个功能对Webapp来说太有用了,它能让用户像“ ...

  4. 调用Android自带日历功能(日历列表单、添加一个日历事件)

    调用Android自带日历功能  觉得这篇文章不错,转载过来. 转载:http://blog.csdn.net/djy1992/article/details/9948393 Android手机配备有 ...

  5. 桌面上嵌入窗口(桌面日历)原理探索(将该窗口的Owner设置成桌面的Shell 窗口,可使用SetWindowLong更改窗口的GWL_HWNDPARENT,还要使用SetWindowPos设置Z-Order)

    今天在QQ群里有人问怎样实现将自己的窗口嵌入桌面,让它和桌面融为一体,就像很多桌面日历软件那样. 我当时想到的就是建立一个Child  Window,将他的父窗口设置成桌面Shell窗口就可以了.但是 ...

  6. Android开发被添加到桌面快捷方式

    Android开发被添加到桌面快捷方式 对于一个希望拥有很多其它用户的应用来说.用户桌面能够说是全部软件的必争之地,假设用户在手机桌面上建立了该软件的快捷方式.用户将会更频繁地使用该软件. 因此,全部 ...

  7. 轻狂写的桌面日历秀NSIS脚本供大家参考学习

    原文 轻狂写的桌面日历秀NSIS脚本供大家参考学习 现在共享桌面日历秀的NSIS脚本,以便交流学习.此脚本实现的功能如下: 7-Zip打开看不到内容.自动读取原安装路径,如果有则不允许更改.取得编译日 ...

  8. windows server 2012将计算机图标添加到桌面

    windows server 2012系统安装完以后桌面默认只有回收站一个图标,如何将window常用的图标(计算机.控制面板.网络.用户文件)的图标添加到桌面呢,下面为作者本人亲测.操作简单至极. ...

  9. windows server 2012将计算机图标添加到桌面(图文教程)(转)

    windows server 2012系统安装完以后桌面默认只有回收站一个图标,如何将window常用的图标(计算机.控制面板.网络.用户文件)的图标添加到桌面呢,下面为作者本人亲测.操作简单至极. ...

随机推荐

  1. Java基于文件的对象存储

    工作中经常需要处理对象的处理,有的时候还需要将对象保存到文件中做持久化. 特别是当不能使用数据库的时候就特别需要一个简单的对象集合的增删改查操作, 于是就有了下面这个文件DB的工具类 package ...

  2. [Netty] - Netty入门(最简单的Netty客户端/服务器程序)

    Java中的NIO是一种解决阻塞式IO问题的基本技术,但是NIO的编写对java程序员是有比较高的要求的.那么Netty就是一种简化操作的一个成熟的网络IO编程框架.这里简单介绍一个程序,代码是< ...

  3. Python2.7学习笔记-定义函数、filter/map/reduce/lambda

    我把写的代码直接贴在下面了,注释的不是很仔细,主要是为了自己复习时方便查找,并不适合没有接触过python的人看,其实我也是初学者. #定义函数 def my_abs(x): if x>=0: ...

  4. eclipse+HBASE开发环境搭建(已实践)

    开发准备: jdk1.8.45 hbase-1.2.2(windows下和linux个留一份) hadoop-2.7.2(linux一份) Linux系统(centos或其它) Hadoop安装环境 ...

  5. linux下基于rsync + find命令实现文件同步机制

    rsync和find是linux系统自带的命令,如果没有安装可以找到系统安装盘或者ISO文件,里面有rpm包,安装一下就可以了.       具体思路如下:             1)可以实现定时进 ...

  6. UIView和layer的关系

    UIView和layer的关系 UIView是layer的代理 View的根layer ---也就是说view本身自带一个layer, 这个layer 我们叫它根layer 所有视图显示是因为继承UI ...

  7. jQuery给CheckBox全选与不全选

    $(function(){ $("#checkAll").click(function() {//全选 $('input[name="DATA"]').prop ...

  8. 每天一个linux命令(38)--lsof 之FD文件描述符

    一般lsof 会输出以下这些信息: COMMAND: 进程的名称 PID:进程标识符 PPID:父进程标识符(需要指定-R参数) USER:进程所有者 PGID:进程所属组 FD:文件描述符,应用程序 ...

  9. MySQL · 引擎特性 · InnoDB IO子系统

    前言 InnoDB做为一款成熟的跨平台数据库引擎,其实现了一套高效易用的IO接口,包括同步异步IO,IO合并等.本文简单介绍一下其内部实现,主要的代码集中在os0file.cc这个文件中.本文的分析默 ...

  10. 用php做省份的三级联动 附带数据库

    可以把它做成小插件的形式,以后需要,可以随时调 来看一下怎么来做 先来写个div然后,再引入js包 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1 ...