利用Python脚本实现neovim的明暗主题自动切换

快开通你的小脑筋QwQ,跟我一起来!

开头~~

朋友,你是否和我一样,是个忠实的vim狂热粉,却苦于黑天白夜的敲代码,而感到双眼酸疼,那么没问题!今天,我就给您带来我们公司的最新产品 —- nvim主题自动切换器

其实就是个大佬们都看不上的垃圾脚本(

正文~~

先贴上代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
function! Auto_change_themes()
py << EOF

import vim
import os
import pytz
import datetime
from dateutil.tz import tzlocal
from suntime import Sun
import requests as req
import numpy as np

ret = req.get(
url = 'https://apis.map.qq.com/ws/location/v1/ip',
params={
'key': 'your key' #此处更换为你自己的密钥
}
).json()

home = os.environ['HOME']
config_dir = '/.config/nvim/location.npy'
file_path = home + config_dir

if os.path.exists(file_path):
read_location = np.load(file_path,allow_pickle=True).item()
latitude = read_location.get('result').get('location').get('lat')
longtitude = read_location.get('result').get('location').get('lng')

else:
np.save(file_path,ret)
read_location = np.load(file_path,allow_pickle=True).item()
latitude = read_location.get('result').get('location').get('lat')
longtitude = read_location.get('result').get('location').get('lng')

#latitude = 26.153224357107746
#longitude = 118.16177778433492

today = datetime.datetime.today()
year = today.year
month = today.month
day = today.day
sun = Sun(latitude,longtitude)

abd = datetime.date(year, month, day)
abd_sr = sun.get_local_sunrise_time(abd)
abd_ss = sun.get_local_sunset_time(abd)

now=datetime.datetime.now()
now=now.replace(tzinfo=tzlocal())
now_for_sunrise = now + datetime.timedelta(days=1)

if now_for_sunrise > abd_sr and now < abd_ss:
vim.command('set background=dark')
vim.command('colorscheme deus')
else:
vim.command('set background=dark')
vim.command('colorscheme onedark ')

EOF
endfunction

call Auto_change_themes()

建议建议仔细研读代码后,在进行编写,不要一味地复制粘贴!

设计思路

初版

最早呢,自从我在网络上搜寻一番后,我在胸中得到了我脚本的最初代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function! Auto_change_themes()
py << EOF

import vim
import os

date_early=8
date_late=18
now= int(os.popen('date | cut -d" " -f5 | cut -d: -f1').read)

if now > date_early and now < date_late:
vim.command('set background=dark')
vim.command('colorscheme deus')
else:
vim.command('set background=dark')
vim.command('colorscheme onedark ')


这里的”colorscheme”可自由更换为你喜欢的主题

但是你们也看到了这个其实就是个写死的命令,虽说能实现功能吧,但还是觉得太简陋了,于是就有了升级版。

升级版

思路如下:

为了使每个用户无论处于哪里,只要有良好的互联网连接,就能获得当地的日出日落时间,以准确判定系统主题。

我在pypi里找到了这样的案例:

1
2
3
4
5
6
7
8
9
10
11
12
13
import datetime
from suntime import Sun, SunTimeException

latitude = 51.21
longitude = 21.01

sun = Sun(latitude, longitude)

# Get today's sunrise and sunset in UTC
today_sr = sun.get_sunrise_time()
today_ss = sun.get_sunset_time()
print('Today at Warsaw the sun raised at {} and get down at {} UTC'.
format(today_sr.strftime('%H:%M'), today_ss.strftime('%H:%M')))

利用datetimesuntime这两个模块,我们就能通过经纬度来判断我们此地的日出以及日落时间,相较于手写时间,灵活了不少。

但是你应该也注意到了,latitude和longitude这两个值还是需要我们手动填写。那咋办呢,接着造啊!

于是我又开始了,全网找资料的历程,终于,让我在csdn上找到了这么一篇利用第三方api获取当前经纬度的文章:

1
2
3
4
5
6
7
8
import requests as req

ret = req.get(
url = 'https://apis.map.qq.com/ws/location/v1/ip',
params={
'key': 'your key' #此处更换为你自己的密钥
}
).json()

这里利用requests模块获取到了经纬等地理信息的列表文件,我们将它留存起来,以供之后使用。

看到这里,相信不少小伙伴们觉得:哎呀,这时间也自动了,经纬度也自动了,是不是就万事大吉了呢~~

非也!我要说的是,上述方案,只能在有网时使用,万一断网,那不是完犊子。所以,我由于又又又对脚本文件进行了更改:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import requests as req
import numpy as np

ret = req.get(
url = 'https://apis.map.qq.com/ws/location/v1/ip',
params={
'key': 'your key' #此处更换为你自己的密钥
}
).json()

home = os.environ['HOME']
config_dir = '/.config/nvim/location.npy'
file_path = home + config_dir

if os.path.exists(file_path):
read_location = np.load(file_path,allow_pickle=True).item()
latitude = read_location.get('result').get('location').get('lat')
longtitude = read_location.get('result').get('location').get('lng')

else:
np.save(file_path,ret)
read_location = np.load(file_path,allow_pickle=True).item()
latitude = read_location.get('result').get('location').get('lat')
longtitude = read_location.get('result').get('location').get('lng')

如上,只要我们在第一次联网的情况下,get了这个列表数据,将其保存,那么以后只要都去使用这个文件,岂不就是一劳永逸。只要用一个简单的if语句就可以判断文件的有无,并决定是否使用网络资源,读者大大们,你们说妙不妙

算了,不说了,再卖弄就要被制裁了。

条件判断

剩下的使用时间转换和列表读取,来判断时间的早晚,相信各位大佬们都会了,我就不再赘述 了。小白们也可以自己查资料的对吧,你们都是成年人了,嘿嘿。(其实就是懒狗不想写)

缺点

但是呢,这个插件没有想象中的那么好用。怎么说,功能是实现了,但是速度真的是一言难尽。在~/.config/nvim/init.vim里source了这个文件之后,启动时间足足延长了2s,这能忍吗,这忍不了!

所以追求速度的读者朋友们还是三思而后行!

感谢

文章到这里就结束了,说了这么多废话,还请各位多多包涵。

特别感谢以下博主给我提供的帮助:

csdn简说Python:https://blog.csdn.net/qq_39241986/article/details/109192934

知乎Yggdroot:https://zhuanlan.zhihu.com/p/89243293

  • 简说Python大哥为我提供了利用腾讯地图实时定位经纬度的解决方案
  • 而Yggdroot教会了我,如何利用Python编写vim插件

值得一提的是,Yggdroot用Python写了诸如Leader的优良插件,很值得大家学习!