0%

我在i3wm下的折腾之路

我在I3(I3WM)下的折腾之路

很久之前我就开始一直使用Linux系统作为主要使用平台了, 期间也经历过从kylinUbuntu再到Fedora的过程, 最终稳定在Fedora下使用了大概有4年了. 或许有人会很奇怪, 我为什么选择Fedora而不是ArchUbuntu, 其实主要是我之前在RedHat实习过, 用习惯了它, 加上他的workstation更新比较稳定. 我从29一直更新到了33, 虽然有些小问题但是最终都折腾解决了, 自己比较懒, 想在折腾和稳定性之间找一个平衡点, 所以就沿用至今. 这里插一句, 我比较倾向于使用开源的软件, 所有即使工作了大家都用Mac我还是用的Fedora, 使用体验怎么说呢: 好坏参半, 很多时间花在了折腾的路上, 但是很多Linux下的学习经验用MAC的人也体会不到..

Fedora下我曾经使用的Gnome, 但是有一次折腾过程中发现了I3, 如获至宝, 使用至今, 那个键盘切来切去控制一切的感觉很爽(很装逼).

Fedora下安装I3很方便, 参考官方的fedoramagazine , 关于I3的配置文件如何设置, 请参考官方的用户手册 , 我自己根据这个折腾了很多, 后续我慢慢整理分享出来.

首先先放上几张我的系统效果图吧:

我是使用的双屏幕, 同时因为工作中使用到微信/QQ等工具, 在Linux上折腾起来很麻烦, 所有就又搞了一个虚拟机, 使用的VirtualBox+Winddows 7.

这里我反反复复经历过好几次想剔除掉虚拟机, 后来都失败了, 最终还是回归到使用虚拟机的道路上(真香TT)…那就先从折腾虚拟机的过程说起吧.

先说一下, 我在I3的配置中通过一个统一的启动脚本来控制登录后的自动执行的程序exec --no-startup-id $HOME/.config/i3/autoload.sh &, 后续很多执行逻辑都写这个脚本里面了, 后面会给出详细说明.

VirtualBox

开源软件VirtualBox, 这个谷歌或百度一下就知道怎么安装和制作一个虚拟机系统了. 我这里重点说下使用体验: extension pack 必装!!! 不然无法体会两个系统共享剪切板和文件系统的那种爽快.

我的I3配置中, 将VirtualBox设置的自动启动到一个workspace中并把这个ws固定分配在一个屏幕中:

1
2
3
4
5
set $ws10 "10:vm"
workspace $ws10 output eDP-1 DP-1
bindsym $mod+0 workspace $ws10
assign [class="(?i)virtual"] $ws10
for_window [class="(?i)virtual"] focus

为了能在虚拟机下的微信/QQ/钉钉等软件收到消息后在linux系统下弹出提示(即使我切换到其他ws也能知道当前虚拟机下又消息了), 我做了很多折腾:

通知管理

首先, 在Linux下安装dunst这个工具,用于进行桌面消息通知. 其效果如下(也可访问其官网查看):

其配置文件我改的不多. 我采用的是systemd服务机制确保其在后台一直驻留:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ cat ~/.local/share/systemd/user/dunst.service

[Unit]
Description=dunst service
After=network.target

[Service]
ExecStart=/usr/bin/dunst -conf $HOME/.config/i3/dunstrc
RemainAfterExit=yes
Restart=on-failure
RestartSec=2
ExecReload=kill -HUP $MAINPID

[Install]
WantedBy=default.target

然后在启动脚本中通过systemctl --user start dunst.service启动服务

传递消息

为了能在传递消息, 首先我给虚拟机设置了一个独立的虚拟网卡, 在VB中配置成Host-only的网络, 然后在VB的主机网络管理中将这个vboxnet0设置成手动配置网卡的方式, 手动指定一个固定的内网地址:

1
2
3
IPv4地址: 192.168.56.1
IPv4网络掩码: 255.255.255.0
DHCP服务: 关闭

虚拟机配置了双网络, 一个就是上面这个Host-only, 另一个是一个NAT网络(用于访问外网)

在虚拟机中将Host-only这个网卡的地址手动绑定为192.168.56.2

Linux中部署一个自己写的程序的服务端, 监听192.168.56.1:23456这个地址, 一旦收到信息就调用notify-send 发送消息.

Linux下的这个服务端systemdservice文件以及登录启动方式和上面的dunst基本一致.

之后在虚拟机中使用AutoHotkey来监听系统中消息到来时任务栏的闪烁事件, 一旦触发就调用自己写的程序的客户端通过网络将消息发到Linux系统下的192.168.56.1:23456地址.

AutoHotkey设置开机启动, 其脚本AutoHotkey.ahk为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
; borrow from http://www.autohotkey.com/board/topic/36510-detect-flashingblinking-window-on-taskbar/?p=229583

DetectHiddenWindows, On
Script_Hwnd := WinExist("ahk_class AutoHotkey ahk_pid " DllCall("GetCurrentProcessId"))
DetectHiddenWindows, Off

; Register shell hook to detect flashing windows.
DllCall("RegisterShellHookWindow", "uint", Script_Hwnd)
OnMessage(DllCall("RegisterWindowMessage", "str", "SHELLHOOK"), "ShellEvent")
;...


ShellEvent(wParam, lParam) {

if (wParam = 0x8006) ; HSHELL_FLASH
{ ; lParam contains the ID of the window which flashed:

WinGetTitle, win_title, ahk_id %lParam%

}
}

编译以后执行执行就可以

虚拟机中点击url直接在Linux中打开

工作中经常遇到别人给你发个链接, 你想打开来看, 又不想在虚拟机中打开, 总是需要拷贝一下, 再到Linux下粘贴打开, 很麻烦!

我的思路就是利用上面的通知系统, 点击url时直接将url发到Linux, 然后在Linux服务端检查是否是一个url, 如果是就通过调用浏览器打开

那么在windows下就得修改注册表中对于url的默认打开程序,我这里在windows中安装了chrome, 并将其设置为默认浏览器. 然后修改其调用的程序, 改成我自己的客户端程序notify.exe.

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
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\ChromeHTML.SWC66KHLYIBC7ZKM7ZSF3B7DIA]
@="Chrome HTML Document"

[HKEY_CLASSES_ROOT\ChromeHTML.SWC66KHLYIBC7ZKM7ZSF3B7DIA\DefaultIcon]
@="C:\\Users\\Administrator\\AppData\\Local\\Google\\Chrome\\Application\\chrome.exe,0"

[HKEY_CLASSES_ROOT\ChromeHTML.SWC66KHLYIBC7ZKM7ZSF3B7DIA\shell]

[HKEY_CLASSES_ROOT\ChromeHTML.SWC66KHLYIBC7ZKM7ZSF3B7DIA\shell\open]

[HKEY_CLASSES_ROOT\ChromeHTML.SWC66KHLYIBC7ZKM7ZSF3B7DIA\shell\open\command]
@="\"C:\\Users\\Administrator\\Desktop\\notify.exe\" \"%1\""

[HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations]

[HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\360seurl]

[HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\360seurl\UserChoice]
"Progid"="360seurl"

[HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\ftp]

[HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\ftp\UserChoice]
"Progid"="ChromeHTML.SWC66KHLYIBC7ZKM7ZSF3B7DIA"

[HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\htmlfile]

[HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\htmlfile\UserChoice]
"Progid"="htmlfile"

[HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\http]

[HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\http\UserChoice]
"Progid"="ChromeHTML.SWC66KHLYIBC7ZKM7ZSF3B7DIA"

[HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\https]

[HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\https\UserChoice]
"Progid"="ChromeHTML.SWC66KHLYIBC7ZKM7ZSF3B7DIA"

[HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\irc]

[HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\irc\UserChoice]

我写的这个服务端与客户端一体化的小程序

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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
package main

import (
"flag"
"log"
"net/http"
"net/url"
"os/exec"
"regexp"
"strconv"
"sync/atomic"
"time"
)

type browserType = int

const (
chrome browserType = iota
ie
firefox
safari
urlPattern string = `(?:(?:https?:\/\/)?(?:[a-z0-9.\-]+|www|[a-z0-9.\-])[.](?:[^\s()<>]+|\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\))+(?:\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\)|[^\s!()\[\]{};:\'".,<>?]))`
cooldown = 800 // 1000ms
chromeBin = "/usr/bin/google-chrome"
firefoxBin = "/usr/bin/firefox"
)

var (
host, api string
port, timeout int
serverMode bool
browser browserType
limit int32
)

func init() {
flag.StringVar(&host, "h", "192.168.56.1", "the host address")
flag.IntVar(&port, "p", 34567, "the port number")
flag.StringVar(&api, "u", "/", "the url api to get")
flag.IntVar(&timeout, "t", 5000, "the timeout, unit ms")
flag.BoolVar(&serverMode, "s", false, "the server mode, else run in send msg mode")
flag.IntVar(&browser, "b", chrome, "the browser to open url")
}

func sendMsg(msg string) {
client := &http.Client{
Timeout: time.Duration(timeout) * time.Millisecond,
}
_, err := client.Get("http://" + host + ":" + strconv.Itoa(port) + api + "?msg=" + url.QueryEscape(msg))
if err != nil {
log.Fatalln(err)
}
}

func open(url string, browser browserType) {
switch browser {
case chrome:
runCmd(chromeBin, url)
case firefox:
runCmd(firefoxBin, url)
default:
runCmd(chromeBin, url)
}
}

func runCmd(path string, args ...string) {
cmd := exec.Command(path, args...)
err := cmd.Run()
if err != nil {
log.Println(err)
}
}

func notify(msg string) {
runCmd("notify-send", "您有新的消息: ", msg)
}

func server() {
addr := host + ":" + strconv.Itoa(port)
log.Println("run in server mode, address: http://" + addr)
urlValid := regexp.MustCompile(urlPattern)
http.HandleFunc(api, func(w http.ResponseWriter, r *http.Request) {
atomic.AddInt32(&limit, 1)
defer atomic.AddInt32(&limit, -1)
if atomic.LoadInt32(&limit) > 1 {
w.WriteHeader(http.StatusOK)
return
}
msg, err := url.QueryUnescape(r.URL.Query().Get("msg"))
if err != nil {
w.Write([]byte(err.Error()))
w.WriteHeader(http.StatusInternalServerError)
return
}
if urlValid.Match([]byte(msg)) {
go open(msg, browser)
} else {
go notify(msg)
}
time.Sleep(time.Duration(cooldown) * time.Millisecond)
w.WriteHeader(http.StatusOK)
})
s := &http.Server{
Addr: addr,
MaxHeaderBytes: 1 << 20,
}
log.Fatal(s.ListenAndServe())
}

func main() {
flag.Parse()
if !serverMode {
var msg string
if flag.NArg() > 0 {
msg = flag.Args()[0]
}
sendMsg(msg)
return
}
server()
}

编译方法:

1
2
$ go build -o notify main.go
$ GOOS=windows GOARCH=amd64 go build -o notify.exe -ldflags -H=windowsgui main.go

编译windows版本的时候-ldflags -H=windowsgui可以避免执行程序时候出现cmd弹窗.

剪切板

I3下使用copyq替代系统的剪切板, 在I3的配置中设置F3来显示copyq的界面,选择需要粘贴的历史剪切记录

1
bindsym F3 exec --no-startup-id copyq toggle

快捷输入

copyq还提供了一个快捷输入的途径, 我经常拿它来粘贴一些常用的地址或指令:
比如我在copyq中设置一个important的标签页, 将www.google.com插入为一个项目,并设置固定位置到0的位置, 然后我在I3中配置:

1
bindsym $mod+F3 exec --no-startup-id sleep 0.2 && copyq tab important select 0 paste && copyq tab Clipboard select 0

那么只要我使用$mod+F3按键, 就能在当前的输入框中粘贴www.google.com这个字符串. 如此我设置了一堆, 感觉甚是好用

1
2
3
bindsym $mod+F3 exec --no-startup-id sleep 0.2 && copyq tab important select 0 paste && copyq tab Clipboard select 0
bindsym $mod+F4 exec --no-startup-id sleep 0.2 && copyq tab important select 1 paste && copyq tab Clipboard select 0
bindsym $mod+F5 exec --no-startup-id sleep 0.2 && copyq tab important select 2 paste && copyq tab Clipboard select 0

纯文本粘贴

我的copyq设置的支持复制富文本方式, 在其中的命令/全局快捷键管理选项中可以添加一个粘贴为纯文本的方法:

1
2
3
4
5
copyq: 
var text = clipboard()
copy(text)
copySelection(text)
paste()

为其配置一个快捷键ctrl+shift+v, 那么就可以对于复制的富文本仅仅粘贴为纯文本, 规避一些复制粘贴的麻烦.

文本快速处理

有时, 我在写文字的时候, 遇到想给几行文字每行开头加个1.2.3..之类的序号, 或者想移出它们, 或者对于markdown格式的文本想每行前都加个-, 或者想对一行逗号分割的字符串组给每个字符串都加减引号, 或者想直接输入当前日期, 那么我时常会一行一行的处理, 很麻烦有没有?

于是, 我写了个结合xclipcopyq的脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash

if [[ "$1" = "num" ]];then
xclip -out -selection primary |awk 'BEGIN{i=1;}{if($0 != ""){if($1 ~ /[0-9]+\./){$1="";print $0;}else{print i". "$0;i++;}}else{print $0}}' |xclip -in -selection clipboard| copyq paste
elif [[ "$1" = "dot" ]];then
xclip -out -selection primary |awk '{if($0 != ""){if($1 != "*"){print "* "$0}else{$1="";print $0; }}else{print $0}}' |xclip -in -selection clipboard| copyq paste
elif [[ "$1" = "plus" ]];then
xclip -out -selection primary |awk '{if($0 != ""){if($1 != "-"){print "- "$0}else{$1="";print $0; }}else{print $0}}' |xclip -in -selection clipboard| copyq paste
elif [[ "$1" = "quote" ]];then
xclip -out -selection primary | awk '{if($0 != ""){if($0 ~ /["'\'']/){gsub("\"","",$0);gsub("'\''","",$0);print $0 }else{if($0 ~ /,/){gsub(/ *, */,"\",\"",$0);print "\""$0"\"" }else{gsub(/ +/,"\" \"",$0);print "\""$0"\""} } }else{print $0} }'|xclip -in -selection clipboard| copyq paste
elif [[ "$1" = "date" ]];then
echo -n "$(date +'%Y-%m-%d %H:%M:%S')"|xclip -in -selection clipboard | copyq paste
else
xclip -out -selection primary |xclip -in -selection clipboard
fi

然后在I3中给它们绑定按键, 之后只有选定那些文件, 就能一键处理好需要加减开头标记的文字并粘贴回编辑器:

1
2
3
4
5
bindsym $mod+i exec --no-startup-id ~/.config/i3/lineformat.sh num // 每行前加数字和.
bindsym $mod+u exec --no-startup-id ~/.config/i3/lineformat.sh dot // 每行前加*和空格
bindsym $mod+o exec --no-startup-id ~/.config/i3/lineformat.sh plus // 每行前加-和空格
bindsym $mod+y exec --no-startup-id ~/.config/i3/lineformat.sh quote // 给每个字符串加引号或者去除引号
bindsym $mod+t exec --no-startup-id ~/.config/i3/lineformat.sh date // 输入当前日期

截图

一键截图是必不可少的功能, 怎么实现呢?

经历几次选择后,我最终使用了flameshot . 相比于shutter来说flameshot的功能更丰富, 而且 shutter曾经因为Fedora大版本更新, 引起的perl的版本更新, 从而导致执行出错. flameshot则更加稳定.

I3中我配置了bindsym $mod+F2 exec --no-startup-id flameshot gui -p ~/share/screenshot/

然后在启动脚本autoload.sh中我设置了flameshot & 让其自动开机启动.

这样每次我需要截图的时候就直接$mod+F2进入截图模式, 保存后会自动默认写入~/share/screenshot/文件夹下. 还可以直接粘贴到输入框, 结合VB的extend共享剪切板机制, 直接可以粘贴到微信/QQ等应用中, 完全感受不到我在操作虚拟机有没有?

输入法

输入法这个真的是硬伤, 折腾过多次, 也折腾过很久. 不忍吐槽一下:默认的Ibus真的有点垃圾了..我使用的Rime输入法, 在Fcitx框架下, 使用搜狗也是可以的, 但是我不喜欢它那个收集信息的感觉..

Rime的配置和词库, 来来回回折腾过很久. 最终配置稳定在如下样子, 这里我喜欢用CapsLock切换中英文输入,

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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
# 如果要把 Caps Lock 設爲只改變字母的大小寫而不做中西文切換,可將 Caps_Lock 對應的切換方式設爲 noop
# 如果要以 Caps Lock 切換到西文模式,默認輸出小寫字母,請置 ascii_composer/good_old_caps_lock: false
# 如果要以 Caps Lock 切換到西文模式,默認輸出大寫字母,請使用以下設置:
# patch:
# ascii_composer/good_old_caps_lock: true
# ascii_composer/switch_key:
# Caps_Lock: clear
# Shift_L: commit_code
# Shift_R: commit_text
# Eisu_toggle: clear
# Control_L: noop
# Control_R: noop
patch:
ascii_composer:
good_old_caps_lock: false
switch_key:
Caps_Lock: commit_code
Control_L: noop
Control_R: noop
Shift_L: noop
Shift_R: inline_ascii
key_binder:
bindings:
- {accept: "Control+p", send: Up, when: composing}
- {accept: "Control+n", send: Down, when: composing}
- {accept: "Control+b", send: Left, when: composing}
- {accept: "Control+f", send: Right, when: composing}
- {accept: "Control+a", send: Home, when: composing}
- {accept: "Control+e", send: End, when: composing}
- {accept: "Control+d", send: Delete, when: composing}
- {accept: "Control+k", send: "Shift+Delete", when: composing}
- {accept: "Control+h", send: BackSpace, when: composing}
- {accept: "Control+g", send: Escape, when: composing}
- {accept: "Control+bracketleft", send: Escape, when: composing}
- {accept: "Alt+v", send: Page_Up, when: composing}
- {accept: "Control+v", send: Page_Down, when: composing}
- {accept: ISO_Left_Tab, send: Page_Up, when: composing}
- {accept: "Shift+Tab", send: Page_Up, when: composing}
- {accept: Tab, send: Page_Down, when: composing}
- {accept: minus, send: Page_Up, when: has_menu}
- {accept: equal, send: Page_Down, when: has_menu}
- {accept: comma, send: Page_Up, when: paging}
- {accept: period, send: Page_Down, when: has_menu}
menu:
page_size: 5
preset_color_schemes:
light:
name: register # 作者名
author: "register <registerdedicated@gmail.com>" # 作者

horizontal: true # 候选条横向显示
inline_preedit: true # 启用内嵌编码模式,候选条首行不显示拼音
candidate_format: "%c\u2005%@\u2005" # 用 1/6 em 空格 U+2005 来控制编号 %c 和候选词 %@ 前后的空间。

corner_radius: 5 # 候选条圆角半径
border_height: 7 # 窗口边界高度,大于圆角半径才生效
border_width: 7 # 窗口边界宽度,大于圆角半径才生效
back_color: 0xFFFFFF # 候选条背景色
border_color: 0xE0B693 # 边框色
font_face: "PingFangSC-Regular" # 候选词字体
font_point: 18 # 预选栏文字字号
label_font_face: "PingFangSC-Light" # 候选词编号字体
label_font_point: 14 # 预选栏编号字号
candidate_text_color: 0x000000 # 预选项文字颜色
text_color: 0x000000 # 拼音行文字颜色,24位色值,16进制,BGR顺序
comment_text_color: 0x999999 # 拼音等提示文字颜色
hilited_text_color: 0xFF6941 # 高亮拼音 (需要开启内嵌编码)
hilited_candidate_text_color: 0xFF6941 # 第一候选项文字颜色
hilited_candidate_back_color: 0xFFFFFF # 第一候选项背景背景色
hilited_comment_text_color: 0xFF6941 # 注解文字高亮

punctuator:
full_shape:
" " : { commit: " " }
"," : { commit: , }
"." : { commit: 。 }
"<" : [ 《, 〈, «, ‹ ]
">" : [ 》, 〉, », › ]
"/" : [ 、, /, "/", ÷ ]
"?" : { commit: ? }
";" : { commit: ; }
":" : :
"'" : { pair: [ "‘", "’" ] }
"\"" : { pair: [ "“", "”" ] }
"\\" : [ 、, \, "\\" ]
"|" : [ ・, |, "|", "§", "¦" ]
"`" : [ `, "`" ]
"~" : [ 〜, "~", ~, 〰 ]
"!" : { commit: ! }
"@" : [ @, "@", ☯ ]
"#" : [ #, "#", ⌘ ]
"%" : [ %, "%", "°", "℃" ]
"$" : [ ¥, "$", "€", "£", "¥", "¢", "¤" ]
"^" : { commit: …… }
"&" : [ &, "&" ]
"*" : [ *, "*", ・, ×, ※, ❂, · ]
"(" : (
")" : )
"-" : [ -, "-" ]
"_" : ——
"+" : [ +, "+" ]
"=" : [ =, "=" ]
"[" : [ 「, 【, 〔, [ ]
"]" : [ 」, 】, 〕, ] ]
"{" : [ 『, 〖, { ]
"}" : [ 』, 〗, } ]
half_shape:
"," : { commit: "," }
"." : { commit: "." }
"<" : [ "<", "," ]
">" : [ ">", "。" ]
"/" : { commit: "/" }
"?" : { commit: "?" }
";" : { commit: ";" }
":" : { commit: ":" }
"'" : "'"
"\"" : "\""
"\\" : ["\\","、"]
"|" : "|"
"`" : "`"
"~" : "~"
"!" : { commit: "!" }
"@" : "@"
"#" : "#"
"%" : "%"
"$" : "$"
"^" : [ "^", "……" ]
"&" : "&"
"*" : "*"
"(" : "("
")" : ")"
"-" : "-"
"_" : "_"
"+" : "+"
"=" : "="
"[" : "["
"]" : "]"
"{" : "{"
"}" : "}"
symbols:
#符號、電腦
'/fh': [ ©, ®, ℗, ℠, ™, ℡, ℻, ☇, ☈, ☉, ☊, ☋, ☌, ☍, ☎, ☏, ☐, ☑, ☒, ☓, ☕, ☖, ☗, ⛉, ⛊, ☘, ☙, ☚, ☛, ☜, ☝, ☞, ☟, ☠, ☡, ☢, ☣, ☤, ☥, ☦, ☧, ☨, ☩, ☪, ☫, ☬, ☭, ☮, ☯, ☸, ♨, ♰, ♱, ♲, ♳, ♴, ♵, ♶, ♷, ♸, ♹, ♺, ♻, ♼, ♽, ♾, ♿, ⚆, ⚇, ⚈, ⚉, ⚐, ⚑, ⚒, ⚓, ⚔, ⚕, ⚖, ⚗, ⚘, ⚙, ⚚, ⚛, ⚜, ⚝, ⚞, ⚟, ⚠, ⚡, ⚰, ⚱, ⚲, ⚳, ⚴, ⚵, ⚶, ⚷, ⚸, ⚹, ⚺, ⚻, ⚼, ⚽, ⚾, ⚿, ⛀, ⛁, ⛂, ⛃, ⛋, ⛌, ⛍, ⛎, ⛏, ⛐, ⛑, ⛒, ⛓, ⛔, ⛕, ⛖, ⛗, ⛘, ⛙, ⛚, ⛛, ⛜, ⛝, ⛞, ⛟, ⛠, ⛡, ⛢, ⛣, ⛨, ⛩, ⛪, ⛫, ⛬, ⛭, ⛮, ⛯, ⛰, ⛱, ⛲, ⛳, ⛴, ⛵, ⛶, ⛷, ⛸, ⛹, ⛺, ⛻, ⛼, ⛽, ⛾, ⛿ ]
'/dn': [ , ❖, ◁, ⌘, ⌥, ⎇, ⇧, ⇪, ↩, ⌅, ⌤, ⌫, ⌦, ⌧, ⌨, ⌀, ⌖, ⌗, ⏏, ↖, ↘, ⇞, ⇟, ⌚, ⏰, ⏱, ⏲, ⏳, ⌛, ⌜, ⌝⌞⌟, ⍑, ⏩, ⏪, ⏫, ⏬, ⏭, ⏮, ⏯ ]
#象棋、麻將、色子、撲克
'/xq': [ ♔, ♕, ♖, ♗, ♘, ♙, ♚, ♛, ♜, ♝, ♞, ♟ ]
'/mj': [ 🀀, 🀁, 🀂, 🀃, 🀄, 🀅, 🀆, 🀇, 🀈, 🀉, 🀊, 🀋, 🀌, 🀍, 🀎, 🀏, 🀐, 🀑, 🀒, 🀓, 🀔, 🀕, 🀖, 🀗, 🀘, 🀙, 🀚, 🀛, 🀜, 🀝, 🀞, 🀟, 🀠, 🀡, 🀢, 🀣, 🀤, 🀥, 🀦, 🀧, 🀨, 🀩, 🀪, 🀫 ]
'/sz': [ ⚀, ⚁, ⚂, ⚃, ⚄, ⚅ ]
'/pk': [ ♠, ♡, ♢, ♣, ♤, ♥, ♦, ♧ ]
#表情
'/bq': [ ☻, ☺, ☹ ]
#天氣
'/tq': [ ☀, ☁, ⛅, ⛈, ⛆, ☂, ☔, ☃, ⛄, ⛇ ]
#音樂
'/yy': [ 𝄞, ♩, ♪, ♫, ♬, ♭, ♮, ♯ ]
#兩性
'/lx': [ ♂, ♀, ⚢, ⚣, ⚤, ⚥, ⚦, ⚧, ⚨, ⚩, ⚪, ⚫, ⚬, ⚭, ⚮, ⚯ ]
#八卦、八卦名、六十四卦、六十四卦名、太玄經
'/bg': [ ☰, ☱, ☲, ☳, ☴, ☵, ☶, ☷ ]
'/bgm': [ 乾, 兌, 離, 震, 巽, 坎, 艮, 坤 ]
'/lssg': [ ䷀, ䷁, ䷂, ䷃, ䷄, ䷅, ䷆, ䷇, ䷈, ䷉, ䷊, ䷋, ䷌, ䷍, ䷎, ䷏, ䷐, ䷑, ䷒, ䷓, ䷔, ䷕, ䷖, ䷗, ䷘, ䷙, ䷚, ䷛, ䷜, ䷝, ䷞, ䷟, ䷠, ䷡, ䷢, ䷣, ䷤, ䷥, ䷦, ䷧, ䷨, ䷩, ䷪, ䷫, ䷬, ䷭, ䷮, ䷯, ䷰, ䷱, ䷲, ䷳, ䷴, ䷵, ䷶, ䷷, ䷸, ䷹, ䷺, ䷻, ䷼, ䷽, ䷾, ䷿ ]
'/lssgm': [ 乾, 坤, 屯, 蒙, 需, 訟, 師, 比, 小畜, 履, 泰, 否, 同人, 大有, 謙, 豫, 隨, 蠱, 臨, 觀, 噬嗑, 賁, 剝, 復, 无妄, 大畜, 頤, 大過, 坎, 離, 咸, 恆, 遯, 大壯, 晉, 明夷, 家人, 睽, 蹇, 解, 損, 益, 夬, 姤, 萃, 升, 困, 井, 革, 鼎, 震, 艮, 漸, 歸妹, 豐, 旅, 巽, 兌, 渙, 節, 中孚, 小過, 既濟, 未濟 ]
'/txj': [ ⚊, ⚋, ⚌, ⚍, ⚎, ⚏, 𝌀, 𝌁, 𝌂, 𝌃, 𝌄, 𝌅, 𝌆, 𝌇, 𝌈, 𝌉, 𝌊, 𝌋, 𝌌, 𝌍, 𝌎, 𝌏, 𝌐, 𝌑, 𝌒, 𝌓, 𝌔, 𝌕, 𝌖, 𝌗, 𝌘, 𝌙, 𝌚, 𝌛, 𝌜, 𝌝, 𝌞, 𝌟, 𝌠, 𝌡, 𝌢, 𝌣, 𝌤, 𝌥, 𝌦, 𝌧, 𝌨, 𝌩, 𝌪, 𝌫, 𝌬, 𝌭, 𝌮, 𝌯, 𝌰, 𝌱, 𝌲, 𝌳, 𝌴, 𝌵, 𝌶, 𝌷, 𝌸, 𝌹, 𝌺, 𝌻, 𝌼, 𝌽, 𝌾, 𝌿, 𝍀, 𝍁, 𝍂, 𝍃, 𝍄, 𝍅, 𝍆, 𝍇, 𝍈, 𝍉, 𝍊, 𝍋, 𝍌, 𝍍, 𝍎, 𝍏, 𝍐, 𝍑, 𝍒, 𝍓, 𝍔, 𝍕, 𝍖 ]
#天體、星座、星座名、十二宮
'/tt': [ ☄, ☼, ☽, ☾, ☿, ♀, ♁, ♂, ♃, ♄, ♅, ♆, ♇ ]
'/xz': [ ♈, ♉, ♊, ♋, ♌, ♍, ♎, ♏, ♐, ♑, ♒, ♓ ]
'/xzm': [ 白羊座, 金牛座, 雙子座, 巨蟹座, 獅子座, 室女座, 天秤座, 天蠍座, 人馬座, 摩羯座, 寶瓶座, 雙魚座 ]
'/seg': [ 白羊宮, 金牛宮, 雙子宮, 巨蟹宮, 獅子宮, 室女宮, 天秤宮, 天蠍宮, 人馬宮, 摩羯宮, 寶瓶宮, 雙魚宮 ]
#星號
'/xh': [ ★, ☆, ⛤, ⛥, ⛦, ⛧, ✡, ❋, ❊, ❉, ❈, ❇, ❆, ❅, ❄, ❃, ❂, ❁, ❀, ✿, ✾, ✽, ✼, ✻, ✺, ✹, ✸, ✷, ✶, ✵, ✴, ✳, ✲, ✱, ✰, ✯, ✮, ✭, ✬, ✫, ✪, ✩, ✧, ✦, ✥, ✤, ✣, ✢ ]
#方塊
'/fk': [ ▀, ▁, ▂, ▃, ▄, ▅, ▆, ▇, █, ▉, ▊, ▋, ▌, ▍, ▎, ▏, ▐, ░, ▒, ▓, ▔, ▕, ▖, ▗, ▘, ▙, ▚, ▛, ▜, ▝, ▞, ▟ ]
#幾何
'/jh': [ ■, □, ▢, ▣, ▤, ▥, ▦, ▧, ▨, ▩, ▪, ▫, ▬, ▭, ▮, ▯, ▰, ▱, ▲, △, ▴, ▵, ▶, ▷, ▸, ▹, ►, ▻, ▼, ▽, ▾, ▿, ◀, ◁, ◂, ◃, ◄, ◅, ◆, ◇, ◈, ◉, ◊, ○, ◌, ◍, ◎, ●, ◐, ◑, ◒, ◓, ◔, ◕, ◖, ◗, ◘, ◙, ◚, ◛, ◜, ◝, ◞, ◟, ◠, ◡, ◢, ◣, ◤, ◥, ◦, ◧, ◨, ◩, ◪, ◫, ◬, ◭, ◮, ◯, ◰, ◱, ◲, ◳, ◴, ◵, ◶, ◷, ◸, ◹, ◺, ◻, ◼, ◽, ◾, ◿ ]
#箭頭
'/jt': [ ←, ↚, →, ↛, ↑, ↓, ↔, ↮, ↕, ↖, ↗, ↘, ↙, ↜, ↝, ↞, ↟, ↠, ↡, ↢, ↣, ↤, ↥, ↦, ↧, ↨, ↩, ↪, ↫, ↬, ↭, ↯, ↰, ↱, ↲, ↳, ↴, ↵, ↶, ↷, ↸, ↹, ↺, ↻, ↼, ↽, ↾, ↿, ⇀, ⇁, ⇂, ⇃, ⇄, ⇅, ⇆, ⇇, ⇈, ⇉, ⇊, ⇋, ⇌, ⇐, ⇍, ⇑, ⇒, ⇏, ⇓, ⇔, ⇎, ⇕, ⇖, ⇗, ⇘, ⇙, ⇚, ⇛, ⇜, ⇝, ⇞, ⇟, ⇠, ⇡, ⇢, ⇣, ⇤, ⇥, ⇦, ⇧, ⇨, ⇩, ⇪, ⇫, ⇬, ⇭, ⇮, ⇯, ⇰, ⇱, ⇲, ⇳, ⇴, ⇵, ⇶, ⇷, ⇸, ⇹, ⇺, ⇻, ⇼, ⇽, ➔, ➘, ➙, ➚, ➛, ➜, ➝, ➞, ➟, ➠, ➡, ➢, ➣, ➤, ➥, ➦, ➧, ➨, ➩, ➪, ➫, ➬, ➭, ➮, ➱, ➲, ➳, ➴, ➵, ➶, ➷, ➸, ➹, ➺, ➻, ➼, ➽, ➾ ]
#數學
'/sx': [ ︴, -, ∈, ∏, ∑, +, ±, ÷, ×, <, ≮, =, ≠, >, ≯, ∕, √, ∝, ∞, ∟, ∠, ∥, ∧, ∨, ∩, ∪, ∫, ∮, ∴, ∵, ∷, ∽, ≈, ≌, ≒, ≡, ≤, ≥, ≦, ≧, ⊕, ⊙, ⊥, ⊿, ㏑, ㏒ ]
#數字+圈/弧/點
'/szq': [ ⓪, ①, ②, ③, ④, ⑤, ⑥, ⑦, ⑧, ⑨, ⑩, ⑪, ⑫, ⑬, ⑭, ⑮, ⑯, ⑰, ⑱, ⑲, ⑳, ㉑, ㉒, ㉓, ㉔, ㉕, ㉖, ㉗, ㉘, ㉙, ㉚, ㉛, ㉜, ㉝, ㉞, ㉟, ㊱, ㊲, ㊳, ㊴, ㊵, ㊶, ㊷, ㊸, ㊹, ㊺, ㊻, ㊼, ㊽, ㊾, ㊿, ⓿, ❶, ❷, ❸, ❹, ❺, ❻, ❼, ❽, ❾, ❿, ⓫, ⓬, ⓭, ⓮, ⓯, ⓰, ⓱, ⓲, ⓳, ⓴ ]
'/szh': [ ⑴, ⑵, ⑶, ⑷, ⑸, ⑹, ⑺, ⑻, ⑼, ⑽, ⑾, ⑿, ⒀, ⒁, ⒂, ⒃, ⒄, ⒅, ⒆, ⒇ ]
'/szd': [ ⒈, ⒉, ⒊, ⒋, ⒌, ⒍, ⒎, ⒏, ⒐, ⒑, ⒒, ⒓, ⒔, ⒕, ⒖, ⒗, ⒘, ⒙, ⒚, ⒛ ]
#字母+圈/弧
'/zmq': [ ⓐ, Ⓐ, ⓑ, Ⓑ, ⓒ, Ⓒ, ⓓ, Ⓓ, ⓔ, Ⓔ, ⓕ, Ⓕ, ⓖ, Ⓖ, ⓗ, Ⓗ, ⓘ, Ⓘ, ⓙ, Ⓙ, ⓚ, Ⓚ, ⓛ, Ⓛ, ⓜ, Ⓜ, ⓝ, Ⓝ, ⓞ, Ⓞ, ⓟ, Ⓟ, ⓠ, Ⓠ, ⓡ, Ⓡ, ⓢ, Ⓢ, ⓣ, Ⓣ, ⓤ, Ⓤ, ⓥ, Ⓥ, ⓦ, Ⓦ, ⓧ, Ⓧ, ⓨ, Ⓨ, ⓩ, Ⓩ ]
'/zmh': [ ⒜, ⒝, ⒞, ⒟, ⒠, ⒡, ⒢, ⒣, ⒤, ⒥, ⒦, ⒧, ⒨, ⒩, ⒪, ⒫, ⒬, ⒭, ⒮, ⒯, ⒰, ⒱, ⒲, ⒳, ⒴, ⒵ ]
#數字、分數
'/0': [ 〇, 零, ₀, ⁰, ⓪, ⓿ , 0]
'/1': [ 一, 壹, ₁, ¹, Ⅰ, ⅰ, ①, ➀, ❶, ➊, ⓵, ⑴, ⒈, 1, ㊀, ㈠, 弌, 壱, 幺, ㆒ ]
'/2': [ 二, 貳, ₂, ², Ⅱ, ⅱ, ②, ➁, ❷, ➋, ⓶, ⑵, ⒉, 2, ㊁, ㈡, 弍, 弐, 貮, 㒃, 㒳, 兩, 倆, ㆓]
'/3': [ 三, 叄, ₃, ³, Ⅲ, ⅲ, ③, ➂, ❸, ➌, ⓷, ⑶, ⒊, 3, ㊂, ㈢, 參, 参, 叁, 弎, 仨, ㆔]
'/4': [ 四, 肆, ₄, ⁴, Ⅳ, ⅳ, ④, ➃, ❹, ➍, ⓸, ⑷, ⒋, 4, ㊃, ㈣, 亖]
'/5': [ 五, 伍, ₅, ⁵, Ⅴ, ⅴ, ⑤, ➄, ❺, ➎, ⓹, ⑸, ⒌, 5, ㊄, ㈤, 㐅, 㠪, 𠄡 ]
'/6': [ 六, 陸, ₆, ⁶, Ⅵ, ⅵ, ⑥, ➅, ❻, ➏, ⓺, ⑹, ⒍, 6, ㊅, ㈥, ↅ]
'/7': [ 七, 柒, ₇, ⁷, Ⅶ, ⅶ, ⑦, ➆, ❼, ➐, ⓻, ⑺, ⒎, 7, ㊆, ㈦, 漆]
'/8': [ 八, 捌, ₈, ⁸, Ⅷ, ⅷ, ⑧, ➇, ❽, ➑, ⓼, ⑻, ⒏, 8, ㊇, ㈧ ]
'/9': [ 九, 玖, ₉, ⁹, Ⅸ, ⅸ, ⑨, ➈, ❾, ➒, ⓽, ⑼, ⒐, 9, ㊈, ㈨ ]
'/10': [ 十, 拾, ₁₀, ¹⁰, Ⅹ, ⅹ, ⑩, ➉, ❿, ➓, ⓾, ⑽, ⒑, 10, ㊉, ㈩, 什 ]
'/fs': [ ⅟, ½, ↉, ⅓, ⅔, ¼, ⅕, ⅖, ⅗, ⅘, ⅙, ⅚, ⅐, ⅛, ⅜, ⅝, ⅞, ⅑, ⅒ ]
#蘇州碼
'/szm': [ 〡, 〢, 〣, 〤, 〥, 〦, 〧, 〨, 〩, 〸, 〹, 〺 ]
#羅馬數字
'/lm': [ ⅰ, ⅱ, ⅲ, ⅳ, ⅴ, ⅵ, ⅶ, ⅷ, ⅸ, ⅹ, ⅺ, ⅻ, ⅼ, ⅽ, ⅾ, ⅿ ]
'/lmd': [ Ⅰ, Ⅱ, Ⅲ, Ⅳ, Ⅴ, Ⅵ, Ⅶ, Ⅷ, Ⅸ, Ⅹ, Ⅺ, Ⅻ, Ⅼ, Ⅽ, Ⅾ, Ⅿ ]
#拉丁
'/a': [ ₐ, ᵃ, ª, ᵄ, á, à, ȧ, â, ä, ǎ, ă, ā, ã, å, ą, ⱥ, ấ, ầ, ắ, ằ, ǡ, ǻ, ǟ, ẫ, ẵ, ả, ȁ, ȃ, ẩ, ẳ, ᶏ, ạ, ḁ, ậ, ẚ, ặ, ɐ, ɑ, ɒ, ᶛ, ᵅ ]
'/b': [ ᵇ, ḃ, ᵬ, ƀ, ɓ, ᶀ, ḅ, ḇ, ƃ, ᵦ, ᵝ, β ]
'/c': [ ᶜ, ć, ċ, ĉ, č, ç, ȼ, ḉ, ƈ, ᵓ, ɔ, ᶗ, ɕ, ᶝ ]
'/d': [ ᵈ, ḋ, ď, ď, ᵭ, ḑ, đ, ƌ, ɗ, ᶁ, ḍ, ᶑ, ḓ, ḏ, ð, ʤ, ƍ, ᶞ, dz, dž, ɖ, ʣ, ʥ, ȡ, ẟ ]
'/e': [ ₑ, ᵉ, é, è, ė, ê, ë, ě, ĕ, ē, ẽ, ę, ȩ, ɇ, ế, ề, ḗ, ḕ, ễ, ḝ, ẻ, ȅ, ȇ, ể, ẹ, ᶒ, ḙ, ḛ, ᶟ, ệ, ɛ, ǝ, ə, ₔ, ᵊ, ɚ, ɘ, ɜ, ɝ, ɞ, ʚ, ȝ, ᶾ, ᶕ, ᶚ, ᴈ, ᶓ, ᶔ, ᵋ, ᵌ, ⱸ ]
'/f': [ ᶠ, ḟ, ᵮ, ƒ, ᶂ, ff, ffi, ffl, fi, fʲ, fl, ʩ, ɟ, ɸ, ᶲ, ᵩ, ᵠ ]
'/g': [ ᵍ, ᵷ, ǵ, ġ, ĝ, ǧ, ğ, ḡ, ģ, ǥ, ɠ, ᶃ, ɣ, ᶢ, ɡ, ˠ, ᵧ, ᵞ ]
'/h': [ ͪ, ḣ, ĥ, ḧ, ȟ, ḩ, ħ, ɦ, ḥ, ḫ, ẖ, ⱨ, ɥ, ᶣ, ʱ, ƕ, ʮ, ʯ, ꜧ, ɧ ]
'/i': [ ᵢ, ı, ᴉ, í, ì, î, ï, ǐ, ĭ, ī, ĩ, į, ɨ, ḯ, ᶤ, ỉ, ȉ, ȋ, ị, ᶖ, ḭ, ᵎ, ɩ, ᶥ, ᵼ, ij ]
'/j': [ ⱼ, ʲ, ȷ, ĵ, ǰ, ɉ, ɟ, ᶡ, ʄ, ᶨ, ʝ ]
'/k': [ ᵏ, ḱ, ǩ, ķ, ƙ, ᶄ, ḳ, ḵ, ⱪ, ʞ ]
'/l': [ ˡ, ĺ, ŀ, ľ, ɫ, ⱡ, ļ, ƚ, ł, ƛ, ᶅ, ᶪ, ᶩ, ḷ, ɭ, ḽ, ḻ, ḹ, ɬ, ɮ, lj, ỻ, ʪ, ʫ, ȴ ]
'/m': [ ᵐ, ḿ, ṁ, ᵯ, ᶬ, ɱ, ᶆ, ṃ, ɯ, ᵚ, ɰ, ᶭ, ᴟ ]
'/n': [ ⁿ, ń, ǹ, ṅ, ň, ñ, ᵰ, ņ, ᶮ, ɲ, ʼn, ƞ, ᶇ, ṇ, ɳ, ᶯ, ṋ, ṉ, ȵ ]
'/o': [ ₒ, ᵒ, º, ó, ò, ȯ, ô, ö, ǒ, ŏ, ō, õ, ǫ, ő, ố, ồ, ɵ, ø, ṓ, ṑ, ȱ, ṍ, ȫ, ổ, ọ, ớ, ờ, ỡ, ộ, ɷ, ở, ợ, ᵔ, ᵕ, œ, ȣ, ᴔ, ⱺ ]
'/p': [ ᵖ, ṕ, ṗ, ᵱ, ᵽ, ƥ, ᶈ ]
'/q': [ ʠ, ɋ, ȹ ]
'/r': [ ᵣ, ŕ, ṙ, ř, ᵲ, ŗ, ɍ, ᵳ, ɽ, ȑ, ȓ, ᶉ, ṛ, ṟ, ṝ, ɹ, ɺ, ɻ, ɼ, ɾ, ɿ, ʳ, ʴ, ʵ, ᵨ ]
'/s': [ ˢ, ś, ṡ, ŝ, š, ᵴ, ş, ṥ, ṧ, ᶳ, ʂ, ᶊ, ṣ, ș, ȿ, ṩ, ʃ, ᶴ, ƨ, ʆ, ʅ, ƪ, ß, ſ, ẛ ]
'/t': [ ᵗ, ṫ, ť, ᵵ, ţ, ƭ, ᶵ, ƫ, ṭ, ʈ, ț, ṱ, ṯ, ⱦ, ʇ, ʧ, ʨ, ᶿ, ȶ, ŧ ]
'/u': [ ᵤ, ᵘ, ú, ù, û, ü, ǔ, ŭ, ū, ũ, ů, ų, ű, ᶶ, ʉ, ǘ, ǜ, ǚ, ṹ, ǖ, ṻ, ủ, ȕ, ȗ, ư, ᶙ, ụ, ṳ, ứ, ừ, ṷ, ṵ, ữ, ʉ̞, ʊ, ᶷ, ᵙ, ử, ᵿ, ự, ᴝ, ᴞ, ᵫ ]
'/v': [ ᵥ, ᵛ, ṽ, ᶹ, ᶌ, ṿ, ⱴ, ʋ, ᶺ, ʌ ]
'/w': [ ʷ, ẃ, ẁ, ẇ, ŵ, ẅ, ẘ, ẉ, ƿ, ʍ, ⱳ ]
'/x': [ ₓ, ᶍ, ˣ, χ, ᵪ, ᵡ ]
'/y': [ ʸ, ý, ỳ, ẏ, ŷ, ÿ, ȳ, ỹ, ẙ, ɏ, ỷ, ƴ, ỵ, ʎ, ỿ ]
'/z': [ ᶻ, ź, ż, ẑ, ž, ᵶ, ƶ, ȥ, ᶎ, ᶼ, ẓ, ʐ, ɀ, ẕ, ⱬ, ʑ, ᶽ, ʒ ]
#上標、下標
'/sb': [ ⁰, ¹, ², ³, ⁴, ⁵, ⁶, ⁷, ⁸, ⁹, ˜, ⁺, ⁻, ⁼, ⁽, ⁾, ᴬ, ᵃ, ᵄ, ᵅ, ᶛ, ᴭ, ᵆ, ᴮ, ᴯ, ᵇ, ᵝ, ᶜ, ᵓ, ᶝ, ᴰ, ᵈ, ᶞ, ᵟ, ᴱ, ᵉ, ᴲ, ᵊ, ᵋ, ᶟ, ᵌ, ᶠ, ᶡ, ᶲ, ᵠ, ᴳ, ᵍ, ᶢ, ˠ, ᵞ, ᴴ, ʰ, ᶣ, ʱ, ᴵ, ⁱ, ᶤ, ᵎ, ᶥ, ᴶ, ʲ, ᶨ, ᴷ, ᵏ, ᴸ, ᶫ, ˡ, ᶩ, ᶪ, ᴹ, ᵐ, ᶬ, ᵚ, ᶭ, ᴺ, ᴻ, ⁿ, ᵑ, ᶮ, ᶯ, ᴼ, ᵒ, ᶱ, ᴽ, ᴾ, ᵖ, ᴿ, ʳ, ʶ, ʴ, ʵ, ˢ, ᶴ, ᶳ, ᵀ, ᵗ, ᶵ, ᶿ, ᵁ, ᵘ, ᶶ, ᶷ, ᵙ, ⱽ, ᵛ, ᶺ, ᶹ, ᵂ, ʷ, ˣ, ᵡ, ʸ, ᶻ, ᶾ, ᶽ, ᶼ ]
'/xb': [ ₀, ₁, ₂, ₃, ₄, ₅, ₆, ₇, ₈, ₉, ₊, ₋, ₌, ₍, ₎, ‸, ᴀ, ₐ, ᴁ, ʙ, ᴃ, ᵦ, ᴄ, ᴐ, ᴒ, ᴅ, ᴆ, ᴇ, ₑ, ₔ, ᵩ, ɢ, ʛ, ᴦ, ᵧ, ʜ, ₕ, ɪ, ᵻ, ᵢ, ᴊ, ⱼ, ᴋ, ₖ, ʟ, ₗ, ᴌ, ᴧ, ᴍ, ₘ, ꟺ, ɴ, ᴎ, ₙ, ᴏ, ₒ, ɶ, ʘ, ᴓ, ᴑ, ᴘ, ₚ, ᴨ, ᴪ, ʀ, ᵣ, ᴙ, ʁ, ᴚ, ᵨ, ₛ, ᴛ, ₜ, ᴜ, ᵤ, ᵾ, ᴠ, ᵥ, ᴡ, ₓ, ᵪ, ʏ, ᴢ, ᴣ ]
#希臘
'/xl': [ α, β, γ, δ, ε, ζ, η, θ, ι, κ, λ, μ, ν, ξ, ο, π, ρ, σ, ς, τ, υ, φ, χ, ψ, ω ]
'/xld': [ Α, Β, Γ, Δ, Ε, Ζ, Η, Θ, Ι, Κ, Λ, Μ, Ν, Ξ, Ο, Π, Ρ, Σ, Τ, Υ, Φ, Χ, Ψ, Ω ]
#俄語
'/ey': [ а, б, в, г, д, е, ё, ж, з, и, й, к, л, м, н, о, п, р, с, т, у, ф, х, ц, ч, ш, щ, ъ, ы, ь, э, ю, я ]
'/eyd': [ А, Б, В, Г, Д, Е, Ё, Ж, З, И, Й, К, Л, М, Н, О, П, Р, С, Т, У, Ф, Х, Ц, Ч, Ш, Щ, Ъ, Ы, Ь, Э, Ю, Я ]
#月份、日期、曜日等
'/yf': [ ㋀, ㋁, ㋂, ㋃, ㋄, ㋅, ㋆, ㋇, ㋈, ㋉, ㋊, ㋋ ]
'/rq': [ ㏠, ㏡, ㏢, ㏣, ㏤, ㏥, ㏦, ㏧, ㏨, ㏩, ㏪, ㏫, ㏬, ㏭, ㏮, ㏯, ㏰, ㏱, ㏲, ㏳, ㏴, ㏵, ㏶, ㏷, ㏸, ㏹, ㏺, ㏻, ㏼, ㏽, ㏾ ]
'/yr': [ 月, 火, 水, 木, 金, 土, 日, ㊊, ㊋, ㊌, ㊍, ㊎, ㊏, ㊐, ㊗, ㊡, ㈪, ㈫, ㈬, ㈭, ㈮, ㈯, ㈰, ㈷, ㉁, ㉀ ]
#時間
'/sj': [ ㍘, ㍙, ㍚, ㍛, ㍜, ㍝, ㍞, ㍟, ㍠, ㍡, ㍢, ㍣, ㍤, ㍥, ㍦, ㍧, ㍨, ㍩, ㍪, ㍫, ㍬, ㍭, ㍮, ㍯, ㍰ ]
#天干、地支、干支
'/tg': [ 甲, 乙, 丙, 丁, 戊, 己, 庚, 辛, 壬, 癸 ]
'/dz': [ 子, 丑, 寅, 卯, 辰, 巳, 午, 未, 申, 酉, 戌, 亥 ]
'/gz': [ 甲子, 乙丑, 丙寅, 丁卯, 戊辰, 己巳, 庚午, 辛未, 壬申, 癸酉, 甲戌, 乙亥, 丙子, 丁丑, 戊寅, 己卯, 庚辰, 辛巳, 壬午, 癸未, 甲申, 乙酉, 丙戌, 丁亥, 戊子, 己丑, 庚寅, 辛卯, 壬辰, 癸巳, 甲午, 乙未, 丙申, 丁酉, 戊戌, 己亥, 庚子, 辛丑, 壬寅, 癸卯, 甲辰, 乙巳, 丙午, 丁未, 戊申, 己酉, 庚戌, 辛亥, 壬子, 癸丑, 甲寅, 乙卯, 丙辰, 丁巳, 戊午, 己未, 庚申, 辛酉, 壬戌, 癸亥 ]
#節氣
'/jq': [ 立春, 雨水, 驚蟄, 春分, 清明, 穀雨, 立夏, 小滿, 芒種, 夏至, 小暑, 大暑, 立秋, 處暑, 白露, 秋分, 寒露, 霜降, 立冬, 小雪, 大雪, 冬至, 小寒, 大寒 ]
#單位
'/dw': [ Å, ℃, %, ‰, ‱, °, ℉, ㏃, ㏆, ㎈, ㏄, ㏅, ㎝, ㎠, ㎤, ㏈, ㎗, ㎙, ㎓, ㎬, ㏉, ㏊, ㏋, ㎐, ㏌, ㎄, ㎅, ㎉, ㎏, ㎑, ㏍, ㎘, ㎞, ㏎, ㎢, ㎦, ㎪, ㏏, ㎸, ㎾, ㏀, ㏐, ㏓, ㎧, ㎨, ㎡, ㎥, ㎃, ㏔, ㎆, ㎎, ㎒, ㏕, ㎖, ㎜, ㎟, ㎣, ㏖, ㎫, ㎳, ㎷, ㎹, ㎽, ㎿, ㏁, ㎁, ㎋, ㎚, ㎱, ㎵, ㎻, ㏘, ㎩, ㎀, ㎊, ㏗, ㏙, ㏚, ㎰, ㎴, ㎺, ㎭, ㎮, ㎯, ㏛, ㏜, ㎔, ㏝, ㎂, ㎌, ㎍, ㎕, ㎛, ㎲, ㎶, ㎼ ]
#貨幣
'/hb': [ ¥, ¥, ¤, ¢, $, $, £, £, ৳, ฿, ₠, ₡, ₢, ₣, ₤, ₥, ₦, ₧, ₩, ₪, ₫, €, ₭, ₮, ₯, ₰, ₱, ₲, ₳, ₴, ₵, ₶, ₷, ₸, ₹, ₺, ₨, ﷼ ]
#結構、偏旁、康熙(部首)、筆畫、標點
'/jg': [ ⿰, ⿱, ⿲, ⿳, ⿴, ⿵, ⿶, ⿷, ⿸, ⿹, ⿺, ⿻, 〾 ]
'/pp': [ 乛, 冫, 丷, 龹, ⺌, 龸, 亻, 亼, 亽, 仒, 冖, 冂, 冃, 冄, 宀, 罒, 㓁, 罓, 冈, 凵, 厶, 刂, 勹, 匚, 匸, 卩, 阝, 厂, 丆, 广, 壬, 訁, 讠, 釒, 钅, 飠, 饣, 龺, 攵, 夂, 夊, 尢, 尣, 兂, 旡, 巜, 巛, 彐, 彑, 彡, 彳, 龰, 辶, 廴, 㞢, 忄, 㣺, 扌, 爫, 龵, 廾, 歺, 癶, 氵, 氺, 火, 灬, 爿, 丬, 疒, 牜, ⺶, 犭, 豕, 豸, 虍, 艹, 卝, 龷, 丗, 龶, 芈, 丵, 菐, 黹, 礻, 衤, 糸, 糹, 纟, 龻, 镸, 髟, 襾, 覀, 吅, 㗊, 㠭, 㸚, 叕]
'/kx': [ 一, 丨, 丶, 丿, 乙, 亅, 二, 亠, 人, 儿, 入, 八, 冂, 冖, 冫, 几, 凵, 刀, 力, 勹, 匕, 匚, 匸, 十, 卜, 卩, 厂, 厶, 又, 口, 囗, 土, 士, 夂, 夊, 夕, 大, 女, 子, 宀, 寸, 小, 尢, 尸, 屮, 山, 巛, 工, 己, 巾, 干, 幺, 广, 廴, 廾, 弋, 弓, 彐, 彡, 彳, 心, 戈, 戶, 手, 支, 攴, 文, 斗, 斤, 方, 无, 日, 曰, 月, 木, 欠, 止, 歹, 殳, 毋, 比, 毛, 氏, 气, 水, 火, 爪, 父, 爻, 爿, 片, 牙, 牛, 犬, 玄, 玉, 瓜, 瓦, 甘, 生, 用, 田, 疋, 疒, 癶, 白, 皮, 皿, 目, 矛, 矢, 石, 示, 禸, 禾, 穴, 立, 竹, 米, 糸, 缶, 网, 羊, 羽, 老, 而, 耒, 耳, 聿, 肉, 臣, 自, 至, 臼, 舌, 舛, 舟, 艮, 色, 艸, 虍, 虫, 血, 行, 衣, 襾, 見, 角, 言, 谷, 豆, 豕, 豸, 貝, 赤, 走, 足, 身, 車, 辛, 辰, 辵, 邑, 酉, 釆, 里, 金, 長, 門, 阜, 隶, 隹, 雨, 靑, 非, 面, 革, 韋, 韭, 音, 頁, 風, 飛, 食, 首, 香, 馬, 骨, 高, 髟, 鬥, 鬯, 鬲, 鬼, 魚, 鳥, 鹵, 鹿, 麥, 麻, 黃, 黍, 黑, 黹, 黽, 鼎, 鼓, 鼠, 鼻, 齊, 齒, 龍, 龜, 龠 ]
'/bh': [ ㇀, ㇁, ㇂, ㇃, ㇄, ㇅, ㇆, ㇇, ㇈, ㇉, ㇊, ㇋, ㇌, ㇍, ㇎, ㇏, ㇐, ㇑, ㇒, ㇓, ㇔, ㇕, ㇖, ㇗, ㇘, ㇙, ㇚, ㇛, ㇜, ㇝, ㇞, ㇟, ㇠, ㇡, ㇢, ㇣ ]
'/bd': [ ₋, ⁻, ―, ˗, ˉ, _, ﹍, ﹎, ., ¡, ‼, ⁉, ¿, ؟, ⁈, ⁇, 、, 。, 、, 。, 〃, 〄, 々, 〆, 〇, 〈, 〉, 《, 》, 「, 」, 『, 』, 【, 】, 〒, 〓, 〔, 〕, 〖, 〗, 〘, 〙, 〚, 〛, 〜, 〝, 〞, 〟, 〠, 〰, 〱, 〲, 〳, 〴, 〵, 〶, 〷, 〻, 〼, 〽 ]
'/bdz': [ ﹅, ﹆, ﹁, ﹂, ﹃, ﹄, ︙, ︱, ︻, ︼, ︗, ︘, ︵, ︶, ︷, ︸, ︹, ︺, ︿, ﹀, ︽, ︾, ︰, ︲, ︳, ︴, ﹉, ﹊, ﹋, ﹌, ﹍, ﹎, ﹏, ﹇, ﹈, ︐, ︑, ︒, ︔, ︕, ︖ ]
#拼音、註音、聲調
'/py': [ ā, á, ǎ, à, ō, ó, ǒ, ò, ê, ē, é, ě, è, ī, í, ǐ, ì, ū, ú, ǔ, ù, ü, ǖ, ǘ, ǚ, ǜ, , ń, ň,  ]
'/zy': [ ㄅ, ㄆ, ㄇ, ㄈ, ㄉ, ㄊ, ㄋ, ㄌ, ㄍ, ㄎ, ㄏ, ㄐ, ㄑ, ㄒ, ㄓ, ㄔ, ㄕ, ㄖ, ㄗ, ㄘ, ㄙ, ㄧ, ㄨ, ㄩ, ㄚ, ㄛ, ㄜ, ㄝ, ㄞ, ㄟ, ㄠ, ㄡ, ㄢ, ㄣ, ㄤ, ㄥ, ㄦ, ㄪ, ㄫ, ㄬ, ㄭ, ㆠ, ㆡ, ㆢ, ㆣ, ㆤ, ㆥ, ㆦ, ㆧ, ㆨ, ㆩ, ㆪ, ㆫ, ㆬ, ㆭ, ㆮ, ㆯ, ㆰ, ㆱ, ㆲ, ㆳ, ㆴ, ㆵ, ㆶ, ㆷ ]
'/sd': [ ˉ, ˊ, ˇ, ˋ, ˆ, ˙, ˜, ˥, ˦, ˧, ˨, ˩, ꜀, ꜁, ꜂, ꜃, ꜄, ꜅, ꜆, ꜇ ]
#漢字+圈/弧
'/hzq': [ ㊀, ㊁, ㊂, ㊃, ㊄, ㊅, ㊆, ㊇, ㊈, ㊉, ㊊, ㊋, ㊌, ㊍, ㊎, ㊏, ㊐, ㊑, ㊒, ㊓, ㊔, ㊕, ㊖, ㊗, ㊘, ㊙, ㊚, ㊛, ㊜, ㊝, ㊞, ㊟, ㊠, ㊡, ㊢, ㊣, ㊤, ㊥, ㊦, ㊧, ㊨, ㊩, ㊪, ㊫, ㊬, ㊭, ㊮, ㊯, ㊰, ㉄, ㉅, ㉆, ㉇ ]
'/hzh': [ ㈠, ㈡, ㈢, ㈣, ㈤, ㈥, ㈦, ㈧, ㈨, ㈩, ㈪, ㈫, ㈬, ㈭, ㈮, ㈯, ㈰, ㈱, ㈲, ㈳, ㈴, ㈵, ㈶, ㈷, ㈸, ㈹, ㈺, ㈻, ㈼, ㈽, ㈾, ㈿, ㉀, ㉁, ㉂, ㉃ ]
#いろは順
'/iro': [ い, ろ, は, に, ほ, へ, と, ち, り, ぬ, る, を, わ, か, よ, た, れ, そ, つ, ね, な, ら, む, う, ゐ, の, お, く, や, ま, け, ふ, こ, え, て, あ, さ, き, ゆ, め, み, し, ゑ, ひ, も, せ, す ]
#假名
'/jm': [ あ, ぁ, い, ぃ, う, ぅ, え, ぇ, お, ぉ, か, ゕ, が, き, ぎ, く, ぐ, け, ゖ, げ, こ, ご, さ, ざ, し, じ, す, ず, せ, ぜ, そ, ぞ, た, だ, ち, ぢ, つ, っ, づ, て, で, と, ど, な, に, ぬ, ね, の, は, ば, ぱ, ひ, び, ぴ, ふ, ぶ, ぷ, へ, べ, ぺ, ほ, ぼ, ぽ, ま, み, む, め, も, や, ゃ, ゆ, ゅ, よ, ょ, ら, り, る, れ, ろ, わ, ゎ, ゐ, ゔ, ゑ, を, ん, ・, ー, ゝ, ゞ, ゟ ]
'/pjm': [ ア, ァ, イ, ィ, ウ, ゥ, エ, ェ, オ, ォ, カ, ヵ, ガ, キ, ギ, ク, グ, ケ, ヶ, ゲ, コ, ゴ, サ, ザ, シ, ジ, ス, ズ, セ, ゼ, ソ, ゾ, タ, ダ, チ, ヂ, ツ, ッ, ヅ, テ, デ, ト, ド, ナ, ニ, ヌ, ネ, ノ, ハ, バ, パ, ヒ, ビ, ピ, フ, ブ, プ, ヘ, ベ, ペ, ホ, ボ, ポ, マ, ミ, ム, メ, モ, ヤ, ャ, ユ, ュ, ヨ, ョ, ラ, リ, ル, レ, ロ, ワ, ヮ, ヰ, ヸ, ヴ, ヱ, ヹ, ヲ, ヺ, ン, ・, ー, ヽ, ヾ, ヿ, ㇰ, ㇱ, ㇲ, ㇳ, ㇴ, ㇵ, ㇶ, ㇷ, ㇸ, ㇹ, ㇺ, ㇻ, ㇼ, ㇽ, ㇾ, ㇿ ]
'/jmk': [ か, ゕ, き, く, け, ゖ, こ, カ, ヵ, キ, ク, ケ, ヶ, コ ]
'/jmg': [ が, ぎ, ぐ, げ, ご, ガ, ギ, グ, ゲ, ゴ ]
'/jms': [ さ, し, す, せ, そ, サ, シ, ス, セ, ソ ]
'/jmz': [ ざ, じ, ず, ぜ, ぞ, ザ, ジ, ズ, ゼ, ゾ ]
'/jmt': [ た, ち, つ, っ, て, と, タ, チ, ツ, ッ, テ, ト ]
'/jmd': [ だ, ぢ, づ, で, ど, ダ, ヂ, ヅ, デ, ド ]
'/jmn': [ な, に, ぬ, ね, の, ん, ナ, ニ, ヌ, ネ, ノ, ン ]
'/jmh': [ は, ひ, ふ, へ, ほ, ハ, ヒ, フ, ヘ, ホ ]
'/jmb': [ ば, び, ぶ, べ, ぼ, バ, ビ, ブ, ベ, ボ ]
'/jmp': [ ぱ, ぴ, ぷ, ぺ, ぽ, パ, ピ, プ, ペ, ポ ]
'/jmm': [ ま, み, む, め, も, マ, ミ, ム, メ, モ ]
'/jmy': [ や, ゃ, ゆ, ゅ, よ, ょ, ヤ, ャ, ユ, ュ, ヨ, ョ ]
'/jmr': [ ら, り, る, れ, ろ, ラ, リ, ル, レ, ロ ]
'/jmw': [ わ, ゐ, ゑ, を, ワ, ヰ, ヱ, ヲ ]
'/jma': [ あ, か, が, さ, ざ, た, だ, な, は, ば, ぱ, ま, や, ら, わ, ア, カ, ガ, サ, ザ, タ, ダ, ナ, ハ, バ, パ, マ, ヤ, ラ, ワ ]
'/jmi': [ い, き, ぎ, し, じ, ち, ぢ, に, ひ, び, ぴ, み, り, ゐ, イ, キ, ギ, シ, ジ, チ, ヂ, ニ, ヒ, ビ, ピ, ミ, リ, ヰ ]
'/jmu': [ う, く, ぐ, す, ず, つ, づ, ぬ, ふ, ぶ, ぷ, む, る, ウ, ク, グ, ス, ズ, ツ, ヅ, ヌ, フ, ブ, プ, ム, ル ]
'/jme': [ え, け, げ, せ, ぜ, て, で, ね, へ, べ, ぺ, め, れ, ゑ, エ, ケ, ゲ, セ, ゼ, テ, デ, ネ, ヘ, ベ, ペ, メ, レ, ヱ ]
'/jmo': [ お, こ, ご, そ, ぞ, と, ど, の, ほ, ぼ, ぽ, も, ろ, を, オ, コ, ゴ, ソ, ゾ, ト, ド, ノ, ホ, ボ, ポ, モ, ロ, ヲ ]
#假名+圈
'/jmq': [ ㋐, ㋑, ㋒, ㋓, ㋔, ㋕, ㋖, ㋗, ㋘, ㋙, ㋚, ㋛, ㋜, ㋝, ㋞, ㋟, ㋠, ㋡, ㋢, ㋣, ㋤, ㋥, ㋦, ㋧, ㋨, ㋩, ㋪, ㋫, ㋬, ㋭, ㋮, ㋯, ㋰, ㋱, ㋲, ㋳, ㋴, ㋵, ㋶, ㋷, ㋸, ㋹, ㋺, ㋻, ㋼, ㋽, ㋾ ]
#假名+半角
'/jmbj': [ ア, ァ, イ, ィ, ウ, ゥ, エ, ェ, オ, ォ, カ, キ, ク, ケ, コ, サ, シ, ス, セ, ソ, タ, チ, ツ, ッ, テ, ト, ナ, ニ, ヌ, ネ, ノ, ハ, ヒ, フ, ヘ, ホ, マ, ミ, ム, メ, モ, ヤ, ャ, ユ, ュ, ヨ, ョ, ラ, リ, ル, レ, ロ, ワ, ヲ, ン, ・, ー, ゙, ゚ ]
#韓文
'/hw': [ ㄱ, ㄴ, ㄷ, ㄹ, ㅁ, ㅂ, ㅅ, ㅇ, ㅈ, ㅊ, ㅋ, ㅌ, ㅍ, ㅎ ]
#韓文+圈/弧
'/hwq': [ ㉠, ㉡, ㉢, ㉣, ㉤, ㉥, ㉦, ㉧, ㉨, ㉩, ㉪, ㉫, ㉬, ㉭, ㉮, ㉯, ㉰, ㉱, ㉲, ㉳, ㉴, ㉵, ㉶, ㉷, ㉸, ㉹, ㉺, ㉻, ㉼, ㉽, ㉾, ㉿ ]
'/hwh': [ ㈀, ㈁, ㈂, ㈃, ㈄, ㈅, ㈆, ㈇, ㈈, ㈉, ㈊, ㈋, ㈌, ㈍, ㈎, ㈏, ㈐, ㈑, ㈒, ㈓, ㈔, ㈕, ㈖, ㈗, ㈘, ㈙, ㈚, ㈛, ㈜, ㈝, ㈞ ]
'/wo' : [woodpenker, woodpenker@163.com, woodpenker5@gmail.com]
recognizer:
patterns:
email: "^[A-Za-z][-_.0-9A-Za-z]*@.*$"
uppercase: "[A-Z][-_+.'0-9A-Za-z]*$"
url: "^(www[.]|https?:|ftp[.:]|mailto:|file:).*$|^[a-z]+[.].+$"
schema_list:
- schema: luna_pinyin_simp
- schema: luna_pinyin
style:
color_scheme: light
font_point: 17
horizontal: false
label_font_point: 17
switcher:
abbreviate_options: true
caption: "〔方案選單〕"
fold_options: true
hotkeys:
# - "Control+grave"
# - "Control+Shift+grave"
- "Control+Shift+F4"
option_list_separator: "/"
save_options:
- full_shape
- ascii_punct
- simplification
- extended_charset

而词库汇集了一堆, 有需要的我再分享出来吧:

1
2
3
4
5
6
7
8
9
10
luna_pinyin.biaoqing.dict.yaml     luna_pinyin.history.dict.yaml  luna_pinyin.sgplus.dict.yaml    net.userdb.txt
luna_pinyin.chat.dict.yaml luna_pinyin.moba.dict.yaml luna_pinyin.sgplus.userdb.txt sg2.userdb.txt
easy_en.dict.yaml luna_pinyin.cn_en.dict.yaml luna_pinyin.movie.dict.yaml luna_pinyin.shopping.dict.yaml squirrel.custom.yaml
easy_en.schema.yaml luna_pinyin.computer.dict.yaml luna_pinyin.music.dict.yaml luna_pinyin_simp.custom.yaml stroke.schema.yaml
easy_en.userdb luna_pinyin.custom.yaml luna_pinyin.net.dict.yaml luna_pinyin_tw.schema.yaml symbols.yaml
easy_en.userdb.txt luna_pinyin.english.dict.yaml luna_pinyin.place.dict.yaml luna_pinyin.userdb user.yaml
easy_en.userdb.userdb.txt luna_pinyin.extended.dict.yaml luna_pinyin.poetry.dict.yaml luna_pinyin.userdb.txt
extend.userdb.txt luna_pinyin.extended.table.txt luna_pinyin.prism.txt luna_pinyin.userdb.userdb.txt
luna_pinyin.extra_hanzi.dict.yaml luna_pinyin.sgmain.dict.yaml luna_pinyin.user.dict.yaml
luna_pinyin.anime.dict.yaml luna_pinyin.game.dict.yaml luna_pinyin.sgplus2.dict.yaml luna_pinyin.website.dict.yaml

最近我换到了Fcitx5下, 真的感觉很爽啊! 而且安装起来要方便多了, 使用dnf就搞定, 具体的方法请自行谷歌吧. 也可以参考知乎
Fedora 32 用上 Fcitx 5

这个环境变量一定要设置, 请参考Fedora 32 用上 Fcitx 5 操作.

1
2
3
4
INPUT_METHOD=fcitx5
GTK_IM_MODULE=fcitx5
QT_IM_MODULE=fcitx5
XMODIFIERS=@im=fcitx5

另外, 我在$HOME/.xprofile下也配置了fcitx5的设置:

1
2
3
4
5
6
export XIM=fcitx5                                                                                                                                              
export XIM_PROGRAM=fcitx5
export XMODIFIERS=@im=fcitx
export GTK_IM_MODULE=fcitx5
export QT_IM_MODULE=fcitx5
export QT4_IM_MODULE=fcitx5

ps: 偶尔可能会出现无法输入中文的情况, 我建议是关闭需要的输入的程序再重新启动一下就行.

锁屏

我的锁屏使用的是I3-lock-color. 效果图类似:

官方效果图

我为了实现开启锁屏后自动重置大写状态为关闭(避免重新登录时输入密码是大写的尴尬), 锁屏一定时间后就自动关闭显示器显示, 锁屏时联动番茄计时器重置计时时间这三个效果.我对i3lock-color的启动脚本做了些修改, 首先锁屏前重置Caps Lock的状态为关闭:

1
2
3
if [ "1" -eq "$(ls /sys/class/leds/*capslock/brightness|xargs -I {} cat {}| awk 'NR==1{print $0}')" ];then                                                     
xdotool key Caps_Lock
fi

之后在锁屏时间超过300秒以后,自动执行关闭屏幕显示的操作:

1
2
3
4
5
6
7
8
9
c=0
while pgrep i3lock
do
c=$((c+1))
if [[ "$c" -gt "20" ]];then
┆ xset dpms force off
fi
sleep 15
done

这其中还加入我对我自己开发的定时提醒程序的状态重置操作:/usr/bin/pomodoro client reset
完整的逻辑就是:

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
B='#00000000'  # blank                                                                                                                                         
C='#ffffff22' # clear ish
D='#66ff33ee' # default
T='#ff6600ee' # text
W='#ff0000bb' # wrong
V='#bb00bbbb' # verifying
if pgrep i3lock;then
exit
fi
/usr/bin/pomodoro client reset
/usr/bin/pomodoro client pause
if [ "1" -eq "$(ls /sys/class/leds/*capslock/brightness|xargs -I {} cat {}| awk 'NR==1{print $0}')" ];then
xdotool key Caps_Lock
fi
i3lock-color \
--insidevercolor=$C \
--ringvercolor=$V \
\
--insidewrongcolor=$C \
--ringwrongcolor=$W \
\
--insidecolor=$B \
--ringcolor=$D \
--linecolor=$B \
--separatorcolor=$D \
\
--verifcolor=$T \
--wrongcolor=$T \
--timecolor=$T \
--datecolor=$T \
--layoutcolor=$T \
--keyhlcolor=$W \
--bshlcolor=$W \
\
--screen 1 \
--blur 5 \
--clock \
--indicator \
--timestr="%H:%M:%S" \
--datestr="%Y-%m-%d" \
--keylayout 2
c=0
while pgrep i3lock
do
c=$((c+1))
if [[ "$c" -gt "20" ]];then
┆ xset dpms force off
fi
sleep 15
done
/usr/bin/pomodoro client reset
exit 0

这个脚本保存为lockscreen.sh

在I3的配置中添加快捷按键, 之后就可以用$mod+Ctrl+l来开启锁屏了.

1
bindsym $mod+Ctrl+l exec --no-startup-id $HOME/.config/i3/lockscreen.sh

快捷程序启动

为了快捷启动程序, 我使用了rofi这个工具, 效果图可参考官方:

效果图1

效果图2

I3的配置:

1
2
3
bindsym $mod+d exec rofi -show drun                                                                                                                            
bindsym $mod+Shift+d exec rofi -show run
bindsym $mod+Shift+s exec rofi -show ssh

这样每次需要启动一个程序的时候, 使用$mod+d唤起rofi来进行搜索即可启动.

Polybar配置

我使用Polybar替代默认了的i3bar, Polybar提供了很多很有趣的功能和模块, 折腾也是一次又一次..我这里就说说我自己常用的几个模块的魔改, 有空我再分享一下我的Polybar配置

字体配置

这个是折腾很久的, 因为找各种icon图标字体很麻烦, 以下是我使用到的主要字体:

1
2
3
4
5
6
7
8
9
10
font-0 = "Font Awesome,Font Awesome Regular:style=Regular:size=10:scale=10;0"                                                                                  
font-1 = "Font Awesome 5 Brands,Font Awesome 5 Brands Regular:style=Regular:size=10:scale=10;1"
font-2 = "Font Awesome 5 Free,Font Awesome 5 Free Regular:style=Regular:size=10:scale=10;2"
font-3 = "WenQuanYi Bitmap Song:style=Regular:size=10:scale=10;3"
font-4 = "Microsoft YaHei,微软雅黑:style=Regular:size=12:scale=12;4"
font-5 = "Siji:style=Regular:size=12:scale=18;5"
font-6 = "Hack:style=Regular:size=12:scale=10;6"
font-7 = "Weather Icons:size=12;7"
font-8 = "Font Awesome,Font Awesome Regular:style=Regular:size=8:scale=8;8"
font-9 = "Microsoft YaHei,微软雅黑:style=Regular:size=9:scale=9;9"

电源管理-重启/关机/登出以及虚拟机的自动保存

我在I3中设置了键盘控制关机的方法:

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
########################                                                                                                                                       
# Power menu
set $exec exec --no-startup-id
set $s_exit "(l)ogout/(s)hut down/(r)eboot"
set $s_rconf "Reboot?"
set $s_sconf "Shut Down?"
set $s_lconf "Logout?"

bindsym $mod+Shift+e mode $s_exit
mode $s_exit{
bindsym l mode $s_lconf
bindsym r mode $s_rconf
bindsym s mode $s_sconf

bindsym Escape mode "default"
bindsym Return mode "default"
bindsym $mod+Shift+e mode "default"
}

mode $s_lconf{
bindsym Return $exec ~/.config/i3/powermanager.sh exit
bindsym Escape mode $s_exit
}

mode $s_rconf{
bindsym Return $exec ~/.config/i3/powermanager.sh reboot
bindsym Escape mode $s_exit
}

mode $s_sconf{
bindsym Return $exec ~/.config/i3/powermanager.sh poweroff
bindsym Escape mode $s_exit
}

我就可以通过$mod+Shift+e来选择关机/重启/登出.

同时在Polybar中也设置了一个模块:

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
[module/powermenu]                                                                                                                                             
type = custom/menu

expand-right = true

format-spacing = 1
format-underline = #BF616A

label-open = ""
label-open-foreground = #ECEFF4
label-close = " X "
label-close-foreground = #EBCB8B
label-separator = |
label-separator-foreground = #A3BE8C

menu-0-0 = "Reboot"
menu-0-0-exec = menu-open-1
menu-0-1 = "Power off"
menu-0-1-exec = menu-open-2
menu-0-2 = "Log out"
menu-0-2-exec = menu-open-3

menu-1-0 = "Reboot"
menu-1-0-exec = ~/.config/i3/powermanager.sh reboot
menu-1-1 = "Cancel "
menu-1-1-exec = menu-open-0

menu-2-0 = "Power off"
menu-2-0-exec = ~/.config/i3/powermanager.sh poweroff
menu-2-1 = "Cancel "
menu-2-1-exec = menu-open-0

menu-3-0 = "Log out"
menu-3-0-exec = ~/.config/i3/powermanager.sh exit
menu-3-1 = "Cancel "
menu-3-1-exec = menu-open-0

我为了在关机/重启/登出的时候自动执行一些操作(目前就是保存虚拟机状态), 定义了这个powermanager.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash                                                                                                                                                    
function save(){
notify-send "虚拟机正在保存, 请稍等..."
vboxmanage controlvm win7 savestate
vboxmanage controlvm win7-home savestate
notify-send "虚拟机保存完毕."
}
if [ "exit" == "$1" ];then
save
i3-msg exit
elif [ "reboot" == "$1" ];then
save
sudo reboot
elif [ "poweroff" == "$1" ];then
save
sudo poweroff
else
exit 1
fi

时钟

Polybar的默认时钟不支持显示中文的星期X, 并且我想在点击的时候打开日历, 我就自己定义了一个:

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
#!/bin/bash                                                                                                                                                    
# ~/.config/polybar/script/time.sh脚本内容
weeknum=$(date +'%u')
weekday="-"
case "$weeknum" in
"1")
┆ weekday="一"
┆ ;;
"2")
┆ weekday="二"
┆ ;;
"3")
┆ weekday="三"
┆ ;;
"4")
┆ weekday="四"
┆ ;;
"5")
┆ weekday="五"
┆ ;;
"6")
┆ weekday="六"
┆ ;;
"7")
┆ weekday="日"
┆ ;;
*)
┆ ;;
esac
echo "$(date +'%m-%d %H:%M')$weekday"

Polybar的配置中:

1
2
3
4
5
6
7
8
9
10
[module/time]                                                                                                                                                  
type = custom/script
exec = ~/.config/polybar/script/time.sh
label =  %output%
label-font = 5
label-foreground = #ccffcc
interval = 10
click-left = zenity --calendar
click-right = tzclock
format-underline = #ccffcc

天气

1
2
3
4
5
6
7
8
9
[module/weather]                                                                                                                                               
type = custom/script
exec = ~/.config/polybar/script/weather.sh
exec-if = [ $(($(date +%s) - $(cat /tmp/polybar.tmp))) -gt 30 ]
interval = 10
click-left = google-chrome https://openweathermap.org/city/1808926 >/dev/null 2>&1
label-font = 8
format-foreground = #09edd3
format-underline = #09edd3

通过启动Polybar时记录一下时间戳的方式来延迟执行天气情况查询和显示模块. 这样避免在一开机就启动.
天气查询脚本是参考的抄来的.我使用的是openweathermap-fullfeatured 中的相关脚本.

Github提示

使用的是https://github.com/polybar/polybar-scripts.gitpolybar-scripts/polybar-scripts/notification-github/notification-github.sh脚本.

系统更新提示

使用的是https://github.com/polybar/polybar-scripts.gitpolybar-scripts/polybar-scripts/updates-fedora/updates-fedora.sh脚本

音视频播放控制

我的Polybar配置如下, 我这里主要是基于player-mpris-tail 改动了下显示效果, 把输出字符控制在15以内以解决title太长的问题

1
2
3
4
5
6
7
8
9
10
11
12
13
[module/player-mpris-tail]                                                                                                                                     
type = custom/script
exec = $HOME/.config/polybar/script/player-mpris-tail.py -f '{icon} {title}'
tail = true
label = %output:0:15:..%
label-foreground = #00ff99
label-font = 5
double-click-left = $HOME/.config/polybar/script/player-mpris-tail.py previous
click-left = $HOME/.config/polybar/script/player-mpris-tail.py play-pause
click-right = $HOME/.config/polybar/script/player-mpris-tail.py next click-middle = $HOME/.config/polybar/script/player-mpris-tail.py play-pause
scroll-up = $HOME/.config/polybar/script/player-mpris-tail.py previous
scroll-down = $HOME/.config/polybar/script/player-mpris-tail.py next
interval = 2

屏幕亮度控制

Polybar的配置中定义:

1
2
3
4
5
6
7
8
9
10
[module/bright]                                                                                                                                                
type = custom/script
exec = $HOME/.config/polybar/script/bright.sh
scroll-up = "$HOME/.config/polybar/script/bright.sh +"
scroll-down = "$HOME/.config/polybar/script/bright.sh -"
interval = 2
format-prefix = 
format-prefix-foreground = #00cc00
format-underline = #00cc00
format-foreground = #00cc00

而这个bright.sh脚本为:

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
#!/bin/bash                                                                                                                                                    
current=$(cat /sys/class/backlight/intel_backlight/brightness)
max=$(cat /sys/class/backlight/intel_backlight/max_brightness)
per=$((current*100/max))
if [ "$1" = "+" ];then
new=$((per+5))
if [ $new -gt 100 ];then
┆ new=$max
fi
echo $((new*max/100)) |sudo tee /sys/class/backlight/intel_backlight/brightness
elif [ "$1" = "-" ];then
new=$((per-5))
if [ $new -lt 0 ];then
┆ new=0
fi
echo $((new*max/100)) |sudo tee /sys/class/backlight/intel_backlight/brightness
else
if [ $per -eq 100 ];then
┆ echo "$per%"
elif [ $per -gt 75 ];then
┆ echo "$per%"
elif [ $per -gt 50 ];then
┆ echo "$per%"
elif [ $per -gt 25 ];then
┆ echo "$per%"
else
┆ echo "$per%"
fi
fi

这样我就能直接在Polybar的显示亮度模块上通过滚动鼠标中键来控制亮度.

单双屏幕切换与显示亮度

使用autorandrarandr , autorandr可以自动识别当前多屏幕模式, 而arandr相比与xrandr属于图形化修改的程序, 使用体验更好.

1
2
3
4
╰─$ autorandr 
office (detected) (current)
home
onescreen

使用arandr设置好屏幕后, 使用autorandr --save office --force 即可保存成office的方案.

在做屏幕插拔切换时执行bindsym $mod+Shift+m exec /usr/local/bin/autorandr --change && $HOME/.config/polybar/launch.sh && ~/.config/i3/reload_screen.sh
其中polybar通过launch.sh重新适配以解决系统bar的显示问题, 而reload_screen.sh的作用是为了将workspace在双屏时归位到对应的屏幕上去.

1
2
3
4
5
6
7
8
9
#!/bin/bash                                                                                                                                                    
if xrandr |grep -e '^DP-1 connected' > /dev/null;then
┆ i3-msg 'workspace 2:code' && i3-msg 'move workspace to output DP-1'
┆ i3-msg 'workspace 4:file' && i3-msg 'move workspace to output DP-1'
┆ i3-msg 'workspace 6:app' && i3-msg 'move workspace to output DP-1'
┆ i3-msg 'workspace 7:app' && i3-msg 'move workspace to output DP-1'
┆ i3-msg 'workspace 8:app' && i3-msg 'move workspace to output DP-1'
i3-msg 'workspace 1:web' && i3-msg 'move workspace to output DP-1'
fi

不同程序显示的效果和显示的默认位置

我在I3的配置中定义了很多关于不同程序显示的控制, 如:

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
for_window [class="(?i)guake"] floating enable,resize set width 100 ppt height 100 ppt,move position center                                                    
for_window [class="(?i)tilix"] floating enable,focus
for_window [class="(?i)copyq"] floating enable,move position mouse
for_window [class="(?i)blueman"] floating enable
for_window [class="(?i)calendar"] move --no-auto-back-and-forth container to workspace $ws10,workspace --no-auto-back-and-forth $ws10,focus
for_window [class="(?i)shutter"] floating enable
for_window [class="(?i)flameshot"] floation enable
for_window [class="(?i)golden"] floating enable
for_window [class="(?i)kodi"] move container to workspace $ws8,workspace $ws8,focus

assign [class="(?i)chrome"] $ws1
for_window [class="(?i)chrome"] focus

assign [class="(?i)firefox"] $ws1
for_window [class="(?i)firefox"] focus

assign [class="(?i)code"] $ws2
for_window [class="(?i)code"] focus

assign [class="(?i)virtual"] $ws10
for_window [class="(?i)virtual"] focus

assign [class="(?i)termina"] $ws5
for_window [class="(?i)termina"] focus

assign [class="(?i)rhythmbox"] $ws9
for_window [class="(?i)rhythmbox"] move scratchpad
……

太多了我就不一一列举了, 其中(?i)是不区分大小写匹配的意思.

我的I3的一些默认的显示效果配置:

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
force_display_urgency_hint 500 ms                                                                                                                              
focus_wrapping no
popup_during_fullscreen smart
focus_on_window_activation none # smart|urgent|focus|none
mouse_warping none # none|output
focus_follows_mouse yes #yes|no
hide_edge_borders smart #none|vertical|horizontal|both|smart
default_border none
default_floating_border normal
# split in horizontal orientation
bindsym $mod+- split h

# split in vertical orientation
bindsym $mod+= split v

# enter fullscreen mode for the focused container
bindsym $mod+f fullscreen toggle

# change container layout (stacked, tabbed, toggle split)
bindsym $mod+s layout stacking
bindsym $mod+w layout tabbed
bindsym $mod+e layout toggle split
bindsym $mod+shift+minus move scratchpad
bindsym $mod+minus scratchpad show
# toggle tiling / floating
bindsym $mod+space floating toggle

# change focus between tiling / floating windows
bindsym $mod+Shift+space focus mode_toggle

# focus the parent container
bindsym $mod+a focus parent

也从网上借鉴来一个调整窗体大小的方法:

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
mode "resize" {                                                                                                                                                
┆ # These bindings trigger as soon as you enter the resize mode

┆ # Pressing left will shrink the window’s width.
┆ # Pressing right will grow the window’s width.
┆ # Pressing up will shrink the window’s height.
┆ # Pressing down will grow the window’s height.
bindsym j resize shrink width 10 px or 10 ppt
┆ bindsym k resize grow height 10 px or 10 ppt
┆ bindsym l resize shrink height 10 px or 10 ppt
┆ bindsym semicolon resize grow width 10 px or 10 ppt

┆ # same bindings, but for the arrow keys
┆ bindsym Left resize shrink width 10 px or 10 ppt
┆ bindsym Down resize grow height 10 px or 10 ppt
┆ bindsym Up resize shrink height 10 px or 10 ppt
┆ bindsym Right resize grow width 10 px or 10 ppt

┆ # back to normal: Enter or Escape or $mod+r
┆ bindsym Return mode "default"
┆ bindsym Escape mode "default"
┆ bindsym $mod+r mode "default"
}

bindsym $mod+r mode "resize"

音量控制/播放控制/显示亮度控制

在I3中配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
#######################                                                                                                                                        
# Pulse Audio controls
bindsym XF86AudioRaiseVolume exec --no-startup-id pactl set-sink-volume alsa_output.pci-0000_00_1f.3.analog-stereo +5% #increase sound volume
bindsym XF86AudioLowerVolume exec --no-startup-id pactl set-sink-volume alsa_output.pci-0000_00_1f.3.analog-stereo -5% #decrease sound volume
bindsym XF86AudioMute exec --no-startup-id pactl set-sink-mute alsa_output.pci-0000_00_1f.3.analog-stereo toggle # mute sound
#######################
# Media player controls bindsym XF86AudioPlay exec --no-startup-id playerctl play-pause bindsym XF86AudioPause exec --no-startup-id playerctl play-pause
bindsym XF86AudioNext exec --no-startup-id playerctl next
bindsym XF86AudioPrev exec --no-startup-id playerctl previous
#######################
# back light
bindsym XF86MonBrightnessUp exec --no-startup-id ~/.config/polybar/script/bright.sh +
bindsym XF86MonBrightnessDown exec --no-startup-id ~/.config/polybar/script/bright.sh -

workspace切换

在I3中配置:

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
# 两次重复按键回调workspace                                                                                                                                    
workspace_auto_back_and_forth yes

bindsym $mod+x mode "mvoutput"
mode "mvoutput" {
bindsym j move workspace to output left
bindsym k move workspace to output right
bindsym h move workspace to output up
bindsym l move workspace to output down
bindsym p move workspace to output primary
bindsym Left move workspace to output left
bindsym Down move workspace to output down
bindsym Up move workspace to output up
bindsym Right move workspace to output right
bindsym Shift+Left move container to output left
bindsym Shift+Down move container to output down
bindsym Shift+Up move container to output up
bindsym Shift+Right move container to output right
bindsym Return mode "default"
bindsym Escape mode "default"
bindsym $mod+x mode "default"

}

# set workspace output
workspace $ws1 output DP-1 eDP-1
workspace $ws2 output DP-1 eDP-1
workspace $ws3 output eDP-1 DP-1
workspace $ws4 output DP-1 eDP-1
workspace $ws5 output eDP-1 DP-1
workspace $ws6 output DP-1 eDP-1
workspace $ws7 output DP-1 eDP-1
workspace $ws8 output DP-1 eDP-1
workspace $ws9 output eDP-1 DP-1
workspace $ws10 output eDP-1 DP-1

bindsym $mod+grave exec --no-startup-id bash $shdir/changeworkspace.sh
bindsym $mod+q workspace back_and_forth
bindsym $mod+Tab workspace next

我的这个changeworkspace.sh就是利用rofi来达到图形化选择切换目标的功能. 其实使用rofi -show window也就能实现同样的效果, 只是后者会显示I3下隐藏的scratchpad, 而我这个则不显示.

1
2
3
4
5
6
7
8
#!/bin/bash                                                                                                                                                    
show_ws=$(i3-msg -t get_workspaces | tr , '\n' | grep '"name":' | sed -e 's/"name"://g' -e 's/"//g')
choose=$(echo "$show_ws"|rofi -dmenu -p "choose active workspaces")
if [[ "$choose" =~ ^[0-9]:.*$ ]];then
i3-msg workspace "$choose"
elif [[ "$choose" =~ ^10:.*$ ]];then
i3-msg workspace "${choose}"
fi

鼠标theme/桌面theme

修改鼠标

修改文件~/.Xresources:

1
2
Xcursor.theme: material_light_cursors
Xcursor.size: 16

material_light_cursors是放在~/.icons下的cursor主题目录名称.

然后执行:

1
2
xrdb ~/.Xresources
i3 restart

修改主题

gnome使用gnome-tweaks 修改鼠标和主题

也可以使用LXAppearance 修改和安装主题

lightdm登录界面修改

使用lightdm-gtk-greeter-settings 修改配置

桌面背景

使用feh, 在I3中配置: exec --no-startup-id feh --bg-scale ~/Pictures/moon.jpg

触摸板开关/多手指手势支持/鼠标速度控制

我的鼠标在I3下有点飘~ 我就让I3帮我开机自动解决这个问题, 并且设置了触摸板手势的支持:

1
2
3
4
5
exec --no-startup-id libinput-gestures                                                                                                                         
# 启动时启动touchpad单击手势和滚动手势
exec --no-startup-id xinput set-prop 'DLL082A:01 06CB:76AF Touchpad' 'libinput Tapping Enabled' 1
exec --no-startup-id xinput set-prop 'DLL082A:01 06CB:76AF Touchpad' 'libinput Natural Scrolling Enabled' 1
exec --no-startup-id xinput set-prop 'DLL082A:01 06CB:76AF Touchpad' 'libinput Accel Speed' 0.4

'DLL082A:01 06CB:76AF Touchpad'这个设备id可以通过xinput list查到,
这些prop的名称可以通过xinput list-props查到.

开启/关闭触摸板

在I3中配置: bindsym $mod+Ctrl+t exec --no-startup-id $HOME/.config/i3/touchpad.sh

这个touchpad.sh如下:

1
2
3
4
5
6
7
8
9
10
#!/bin/bash                                                                                                                                                    
tID=$(xinput list|grep Touchpad|sed 's/^.*id=//g'|awk '{print $1}')
res=$(xinput list-props "${tID}"|grep "Device Enabled"|sed 's/.*:[ \t\n]*//g')
if [ "$res" = "1" ];then
xinput set-prop "${tID}" "Device Enabled" 0
notify-send "触摸板关闭"
else
xinput set-prop "${tID}" "Device Enabled" 1
notify-send "触摸板开启"
fi

关闭系统自动屏幕保护和电源管理

在I3的配置中设置:

1
2
exec --no-startup-id xset dpms 0 0 0                                                                                                                           
exec --no-startup-id xset s noblank && xset s noexpose && xset s off

开启自动启动模式选择与autoload.sh脚本

为了能够在开机登录I3的时候根据选择决定自动加载哪些程序, 我写了这个autoload.sh脚本, 结合I3配置来实现开机时根据时间和选择来选择性加载程序.

如果是下班以后的时间登录的就默认选择最小方案, 如果不是则默认选择全部的方案, 如果超时自动执行当前选择的方案, 如果取消则只是启动polybar和一些默认都会加载的程序(如截图、dunst等)

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
#!/bin/bash                                                                                                                                                    
# shellcheck disable=SC1091
source /home/wudy/.xprofile
cd "$HOME"|| echo "no home dir"
if [ "$(date +%H)" -lt "16" ] && [ "$(date +%u)" -lt "6" ] ;then
choose=$(zenity --list --radiolist --column "启动" --column "启动方案" TRUE 全部 FALSE "Home" FALSE "最小(Chrome+File)" FALSE "代码(Chrome+Code+Note+File+Music)" --timeout 6 --text "启动方案:") else
choose=$(zenity --list --radiolist --column "启动" --column "启动方案" FALSE 全部 FALSE "Home" TRUE "最小(Chrome+File)" FALSE "代码(Chrome+Code+Note+File+Music)" --timeout 6 --text "启动方案:") fi
# 默认开启后台自动加载的程序或服务: 剪切板管理(copyq), 蓝牙管理(blueman-applet和blueman-tray), 截图(flameshot), 通知管理(dunst), 梯子(v2ray), 虚拟机通知管理(notify-vm), 翻译软件(goldendict)
DISPLAY=:0 nohup copyq &
DISPLAY=:0 nohup blueman-applet &
nohup blueman-tray &
sleep 1
flameshot &
sleep 1
systemctl --user start v2ray.service
systemctl --user start dunst.service
systemctl --user start notify-vm.service
sleep 1
nohup /usr/bin/goldendict &
sleep 1
if [ "X$choose" != "X" ];then
if [ "$choose" != "最小(Chrome+File)" ];then
┆ QOwnNotes &
┆ sleep 1
fi
nautilus &
google-chrome &
sleep 3
if [ "$choose" != "最小(Chrome+File)" ];then
┆ code &
┆ sleep 4
fi
if [ "$choose" = "全部" ];then
┆VBoxManage startvm win7 &
fi
if [ "$choose" = "Home" ];then
┆ VBoxManage startvm win7-home &
fi
sleep 1
if [ "$choose" != "最小(Chrome+File)" ];then
┆ rhythmbox &
┆ netease-cloud-music &
fi
fi
"$HOME"/.config/polybar/launch.sh
# 自动设置音量到10%, 避免上次使用的时候设置很大, 自己没注意, 导致开音视频时发出很大的声音
pactl set-sink-volume alsa_output.pci-0000_00_1f.3.analog-stereo 10%

Tmux与Guake

我习惯在本地启动一个Tmux使用, 而我又喜欢Guake的一键显示关闭的形式, 为了结合使用两者, 并且开机时就自动给我初始化好, 我就添加了如下修改:

在I3的配置中添加:
exec --no-startup-id $HOME/.config/i3/tmux.sh

这个tmux.sh脚本如下:

1
2
3
4
5
6
#!/bin/bash
if tmux server-info > /dev/null ;then
guake -r "localhost" -e "tmux attach" &
else
guake -r "localhost" -e "tmux" &
fi

这样在登录I3的时候, 自动帮我在guake中打开tmux或者自动链接到已经存在的tmux

定时提醒-番茄工作法

使用C-S模式写的一个脚本, 启动一个后台服务, 定时刷新计时, 并提供socket接口, 使得可以通过端口号通信来控制计时重置/暂停/时间设置等操作. 时间到了以后通过notify-send发送消息提醒. 具体的实现比较简单,而我实现的比较丑陋, 我就不献丑了…

总结

以上是目前为止我在I3上折腾的历程记录, 后续我可能还会在哪天什么东西用着不爽的时候再折腾折腾..
比如, 我就计划折腾个wifi扫描和显示的东西, linux下切换wifi目前用的nmcli, 只能说勉强够用吧.

To Be Continue…