对于 Vim Script 的语法的认知似乎还停留在 《笨方法学 Vim Script》的年代, 在接触 Neovim 以及使用 Lua 写插件之前一直都是使用 Vim Script。 即使是现在部分插件为了兼容 Vim,任然会使用 Vim 脚本实现一个兼容版本。 随着 Vim 版本的更新,实际上以及引入了很多新的语法格式。
查看了下自己以往写的 Vim 脚本,string 的连接符仍然是使用单个点,实际上 Vim 早就支持使用 ..
符号来连接字符串。
let s:foo = 'abc' . 'def'
" 可以改成
let s:foo = 'abc' .. 'def'
在函数内部调用传入的参数,过往最常用的无外乎 a:0
、 a:000
或者 a:foo
等等。
a:
实际上是一个 dict
变量, 可以看下具体包含哪些 key
:
function! s:foo(x, y, ...)
echom a:
endfunction
1,2call s:foo(1, 2, 3)
执行 so %
输出如下:
{'0': 1, '000': [3], '1': 3, 'y': 2, 'firstline': 1, 'x': 1, 'lastline': 2}
{'0': 1, '000': [3], '1': 3, 'y': 2, 'firstline': 1, 'x': 1, 'lastline': 2}
从上面的输出不难看出 a:
字典变量中 key
包括:
0
: 可变参数数量, 可变参数是 1 个 3000
: 可变参数组成的列表x
或者 y
: 特定名称的参数此外还有两个特殊 key
值,firstline
和 lastline
, 这个是传入的 range, 同时这意味着在定义函数时,参数名称不可以是 firstline
和 lastline
。
否则会有如下错误:
E125: Illegal argument: firstline
在 Vim 8.1.1310 中,增加了 optional-function-argument
, 具体写法如下:
function! s:foo(x, y = 3, ...)
echom a:
endfunction
call s:foo(1)
{'0': 0, '000': [], 'y': 3, 'firstline': 1, 'x': 1, 'lastline': 1}
上面的输出可以看出,在调用 s:foo
函数时,虽然只传入了一个参数,但是在函数内部 a:
任然有一个 y
key,其值为默认值 3
。
闭包在其他很多编程语言里面都有类似的写法,可以理解为一个函数工厂,根据“环境变量”返回一个特定环境下的函数。
在 Vim 7.4.2120 中给 :function
定义增加了 closure 属性。示例如下:
function! s:foo(x)
function! s:xy(y) closure
return pow(a:y, a:x)
endfunction
return funcref('s:xy')
endfunction
let s:a = s:foo(2)
let s:b = s:foo(3)
echo s:a(2)
echo s:b(2)
若不使用 closure
关键字,在函数 s:xy
内部是无法调用 a:x
的。
其实,在 Lua 中也可以实现类似的功能:
local function foo(x)
return function(y)
return y^x
end
end
local a = foo(2)
local b = foo(3)
print(a(2))
print(b(2))
以上两种输出结果都是:
4.0
8.0
已经不是第一次玩传奇类氪金游戏了,基本上都是前期氪金买的东西, 后期一文不值,并且有可能可以白嫖。意味着,前期氪金很多, 后期跟不上氪的话,会很容易被追上。
这里记录一下散人(微氪)玩家的玩法。
这游戏根据天数,会定期出活动,这里根据我自己的目前所在区服来更新。有可能与老区或者新区有不一样的。
新建角色选法师、或者道士,战士不适合微氪玩。 赞助拿前三个赞助就够了,在吃 10 元红包,凑满 100,领取 98 连冲奖励。
主线任务、红包任务做完。任务做完,灵符一分不用, 只买第一天两个赞助对应的称号跟衣服,第八天这些灵符会返回来。
第二到第五天 每天吃100红包,灵符传奇币全攒着, 武魂只升级到10, 神器2。
异兽、符文、英雄之心,不要合成,材料全留着。
以前第八天是灵符抽技能活动,现在改版了,变成了狂暴直氪, 前四个任务是额度到了就可以领取,第五个是需要抽奖抽到一个才能领取。 微氪抽奖就算了,这次我只开通了第四个赞助,拿了一个狂暴装备, 同时天赋里面可以用98万灵符购买紫电神雷技能。
末日是直氪卷轴开岛上箱子。500 元可以拿三件末日、 一个狐狸、四个特权。可以五天每天 100 元直氪末日卷轴, 顺便拿 98 元连冲奖励及 5 天连冲装扮。
秒杀活动有点类似与狂暴,前四个任务也是五百额度, 包括:兽神装备、妖狱特权、三件秒杀、三个技能觉醒。
神罚套装的活动跟第十五天的末日活动几乎是一样的,因此也是 500 元拿三件神罚、 三个特权、一个精灵幻化、一件兽神装备任选,也是五天每天 100 元直氪末日卷轴, 顺便拿 98 元连冲奖励及 5 天连冲装扮。
炎阳套装和前面的秒杀类似,前四个任务是五百,包括:8阶军装刀、“传奇回收”、“经验专享”、“传奇回收Ⅱ”、超级幸运、三件炎阳。
完成每日任务,周年庆商店里面的东西可以全部兑换出来,包括六个英雄、一个狐狸、苍血真龙皓月各一件,升星石等等。
每个部位三个属性,锻造时,两个单字锻造成双字,双字+单字锻造成终极。
锻造时左边为主装备、右边为附装备,锻造失败附装备损毁。
因此稀有属性单字,或者包含稀有属性的双字应该放在左边,与稀有属性匹配的双字要直接熔炼掉。
这样才能最大化装备收益。
下面列出装备各部位属性,三个字自上而下稀有程度递减:
武器 | 属性 | 匹配 |
---|---|---|
血 | 吸血 | 爆裂 (爆 + 攻),全熔炼 |
爆 | 暴击几率 | 怒血 (血 + 攻) |
攻 | 攻击增伤 | 破天 (血 + 爆) |
衣服 | 属性 | 匹配 |
---|---|---|
防 | 物伤减免、魔伤减免 | 不灭(抗 + 反) |
抗 | 暴击抵抗 | 金刚 |
反 | 反伤 | 神体 |
头盔 | 属性 | 匹配 |
---|---|---|
防 | 物伤减免、魔伤减免 | 天命(护 + 闪) |
护 | 破甲抵抗 | 玄体 |
闪 | 吸血抵抗 | 龙体 |
项链 | 属性 | 匹配 |
---|---|---|
血 | 吸血 | 斩神(破 + 攻),全熔炼 |
破 | 无视双防 | 怒血(血 + 攻) |
攻 | 攻击增伤 | 弑天(血 + 破) |
手镯 | 属性 | 匹配 |
---|---|---|
固 | 暴伤减免 | 天怒(破 + 闪) |
破 | 无视双防 | 无双 |
闪 | 吸血抵抗 | 爆破 |
戒指 | 属性 | 匹配 |
---|---|---|
攻 | 攻击增伤 | 戮魔(爆 + 狂) |
爆 | 暴击几率 | 灭神 |
狂 | 暴击增伤 | 破天 |
鞋子 | 属性 | 匹配 |
---|---|---|
防 | 物伤减免、魔伤减免 | 破军 |
御 | 暴击抵抗 | 真魂(防 + 护) |
护 | 破甲抵抗 | 神体 |
腰带 | 属性 | 匹配 |
---|---|---|
防 | 物伤减免、魔伤减免 | 天命(御 + 护) |
御 | 暴击抵抗 | 不灭 |
护 | 破甲抵抗 | 混元 |
符文一共有八个,按照最低级别提供套装属性,符文主要来自于试炼之地的boss、禁地。
龙子主要来自于龙眠神殿 Boss、禁地,
异兽主要来自于灵犀 Boss 爆落,活动里面七天登录送、60 连重送任选:
妖狱进地图的条件依赖于出战的兽神级别,优先让最高级出战,点击兽神,会显示兽神装扮是否齐全,提示是否被其他兽神装备了。
出战最高级别兽神后,进入地图,只打最高级别的boss。
很早以前,我注册过一个叫做“黑客派”的论坛,后来这个论坛改名为“链滴”。
当时论坛提供了使用 Github 账号授权登录,由于早期并未注意过 GitHub 登录授权的权限问题。 被站长直接控制 Github 账号去执行 star 和 follow 操作,相关帖子可以看:https://v2ex.com/t/534800
谷歌搜索已无主站入口:
直接搜索最新网址,发现一篇道歉信排名靠前,可想此事当时影响挺大的。
但是非注册用户点击却无法阅读,啥意思?只给注册用户道歉?
使用 web achive 服务拉取到道歉信内容:
最近我尝试登录这个账号并提交账号注销申请,按照他的网站说明:来去自由·关于支持永久停用账号。
但是似乎并不是那么回事。
申请注销时提示更新失败 - Can not deactivate moderator account。于是只能手动将自己以往再次网站发的帖子全部改成:
在体用账号帖子留言后,账号被封禁,而不是被停用。
最后,我们再看下链滴作者 D 的博客 https://88250.b3log.org 评论系统,使用 Github 登录时所需要的权限:
在初次注册登录时,都会出现以下界面,可以点击右侧红框下拉按钮,展开所有的权限。实际上,如果仅用于注册网站,需要一个唯一的注册ID的话,获取邮箱地址的权限就足够了。 图片中显示了 julia 语言论坛授权登录权限信息:
在 Github 账户设置界面依次点击:Integrations
-> Applications
-> Authorized OAuth Apps
:
如果需要看各自的授权权限点开即可查看:
如果认为该权限太高,可以点击右侧的 Revoke access
。
最后,我们来看看号称国内版 Github 的码云使用 Github 授权时需要的权限:
请问要读写用户的 Followers 做什么?
今天使用 Google 搜索自己之前发过的一篇文章“停用 v2ex 账号”,
发现搜索结果如下。奇怪的是,
有一个域名为 jbwqfy.com
的网站居然是全站复制了我的个人博客。
打开其首页,我今日刚发的文章他都有,基本上是实时同步了,目前无法查明原因。
whois 查询结果显示如下,并没有什么有效信息。
大概是 2023 年 9 月份,将网站从 Github Page 服务切换到了 Cloudflare Page。 一开始切换的原因是因为 Github 强制用户使用两步验证才能登录,失去了对 Github 账号的访问权限, 因此将网站移到了 Cloudflare Page 服务上。
登录 Cloudflare 后,在左侧点击 Workers & Pages
-> Create
-> Connect to Git
, 选择对应的仓库,
值得开心的是这里可以选择私有仓库。Github Page 服务免费用户无法使用私有仓库托管 Jekyll 静态网站。
构建设定:
bundle exec jekyll build
/_site
/docs
Enabled
原先使用的 github-pages
对应的 Jekyll 版本太老,语法高亮的插件 rouge
也非常老旧。
在这里既然已经手动执行命令构建,那么可以使用一些比较新的插件,而不受 Github Page 的限制。
修改 docs/Gemfile
为:
source "https://rubygems.org"
gem "jekyll"
gem 'jekyll-redirect-from'
gem 'rouge', '~> 4.2'
gem 'jekyll-paginate'
原先购买的域名已经转移到了 Cloudflare 上面了,这样一来域名的解析及网站的托管都在同一个平台,也方便管理。
前面写过一篇Lua 与 VimL 速度比较的文章, 里面对 Lua 与 VimL 脚本计算速度做了比较。随着 Vim 的更新并且推出了新的脚本语言 Vim9Script, 也想看一下这个新的脚本语言写法及执行效率到底如何。
任然参考上一篇文章中的比较方式,Vim9Script 实现的函数如下:
vim9script
def V9Fibo(N: string)
var start = reltime()
var t = str2nr(N)
var b = 0
while t > 0
t = t - 1
var a = 1
b = 1
var c = 73
while c > 0
c = c - 1
var tmp = a + b
a = b
b = tmp
endwhile
endwhile
var sec = reltimefloat(reltime(start))
echo b
echom printf('Vim9Fibo(%s): %.6g sec', N, sec)
enddef
defcompile
command! -nargs=+ TestV9Func V9Fibo(<f-args>)
新建一个 vim 文件,写入上述内容。使用 :so %
载入脚本,分别执行如下测试命令:
:TestV9Func 1000
:TestV9Func 10000000
本地测试结果:
Vim9Fibo(1000): 0.007455 sec
Vim9Fibo(10000000): 69.937198 sec
在前一篇文章中比较的是 Vim Script 和 Lua 的速度,其结果是:
Fibo(1000): 0.410364 sec
Fibo(10000000): 1470.280914 sec
LuaFibo(1000): 9.052000e-4 sec
LuaFibo(10000000): 1.235385 sec
测试结果不难看出,Vim9Script 相较于老版本的 Vim script 确实有很大的速度提升。
计算参数1000时,从 0.41s
提升到了 0.0074s
;
计算参数一千万时,从 1470s
提升到了 69s
。
但是相较于 Lua 的 9.0e-4s
和 1.23s
的测试结果,还是相差太多。