Fanxs's Blog

【氵】Windows Terminal 设置

字数统计: 1.8k阅读时长: 7 min
2019/11/08 Share

前言:
最近在写些测试工具,没时间写点文章(懒)。这两天发现了Windows Terminal,研究了一下怎么设置,水一篇博文。

0x00. Windows Terminal 配置

Windows Terminal顾名思义就是「Windows 终端」,是一款全新的,现代的快速、高效且功能强大的终端应用程序。它同时适用于会用到:「命令提示符」、「PowerShell」和 「WSL」等命令行交互的用户。目前最新的版本中,Windows Terminal会自动识别系统中安装的WSL系统,可直接在ws终端中打开WSL。

Windows Terminal的好处有很多,其中有一点当然就是它好看,比Powershell和cmd的样式要好看很多,同时也允许我们对样式进行自定义。这篇文章就是闲来研究了一下ws的设置,怎么样给它整好看点儿。

在窗口上方打开Settings就可以开始对WS的配置。按住Alt再点击Settings则会打开默认设置default.json

打开后可看到profiles.json的结构很简单,包含有globals配置,profiles,schemes和keybindings等。globals的配置涉及到终端的一些使用配置,可以不用做修改。要设置ws的展示样式,主要关注profiles/schemes两项。

0x01. Profiles设置

Profiles项主要用来做终端的基础设置,如背景、初始文件夹、光标、字体等。具体可参考链接Profiles设置

Profiles中可设置很多选项来达到不一样的视觉效果,以下为挑出来的,我认为有较大作用的:

设置项 作用
backgroundImage 背景图片
backgroundImageAlignment 背景图片的对齐设置
backgroundImageOpacity 背景图片透明度
backgroundImageStretchMode 背景图片拉伸设置
colorScheme 使用的字体颜色方案
cursorColor 光标颜色
cursorShape 光标的形状"vintage" ( ▃ ), "bar" ( ┃ ), "underscore" ( ▁ ), "filledBox" ( █ ), "emptyBox" ( ▯ )
cursorHeight 光标的高度(仅当光标为vintage时生效)
fontFace 字体
fontSize 字体大小
historySize 可追述的历史记录数
icon 这个Tab显示的logo
padding 字体周围的padding,格式为“8, 8, 8, 8”
snapOnInput 设置为True时,在打字时会自动跳转到输入行
startingDirectory 开启终端时的目录
tabTitle 这个终端tab的名字
useAcrylic 亚克力背景,终端背景会像蒙着一层亚克力,半透明化
acrylicOpacity 设置亚克力背景透明度
foreground 前景颜色
background 背景颜色

这里所谓的前景颜色foreground,会影响终端字体输出的颜色,而background则为终端背景的颜色,这两项建议直接在scheme中所设置,当然如果对这两项有个人喜好的话,可以在profiles中设置,会覆盖scheme中这两项的设置。

0x02. Profiles例子

通过对profiles的设置,可以设置很多的效果,如设置background为图片:

1
2
"backgroundImage" : "C:/Wallpapers/秒速五厘米.png",
"backgroundImageOpacity" : 0.8,


这里的backgroundImage支持很多URI协议,可以直接图片的网络地址:

1
"backgroundImage" : "https://example/1.jpg",

background也可以设置为动图:

不想使用背景图片时,可以使用单一颜色作背景。此时设置毛玻璃亚克力背景的效果,会出现半透明化:

1
2
"acrylicOpacity" : 0.5,
"useAcrylic" : true,


然后还可以设置字体,字体大小等等,就不一一陈述。

0x03. Schemes设置

Schemes项中,主要是设置终端字体的颜色。打开设置时,能看到schemes中的一个默认配色scheme:

这里的foregroundbackground为终端的前景和背景颜色。colors中对应的是16-ANSI-color。虽然不同终端(如Xterm,Putty,Ubuntu等)可以显示至少256种颜色,但是大部分终端都会采取16种颜色来做不同处字体的显示颜色,这就是所谓的16-ANSI-color方案。以下图片显示了针对这16-ANSI-color,不同终端的自定义颜色:

Windows Terminal也是采用了这种方案。Schemes项中的colors项的顺序则对应以下的表格:

这个方案看似清楚,但是在网上未能找到这个16-ANSI-color的颜色具体对应到什么地方的资料。比如使用默认的方案时,命令的参数,类似--c,颜色非常的淡,根本看不清楚,此时就不知道要修改colors里的哪一项颜色,只能一项一项地去尝试。

其实对于Schemes,网上有许多成套的配色方案:iTerm2-Color-Schemes,可以一个一个去尝试这些配色方案,选择自己喜欢、适配终端背景的方案。这里我写了个脚本来协助完成这个事情:

  1. 先git clone iTerm2-Color-Schemes这个项目中的所有Windows Terminal方案,放到文件夹中。
  2. 找到自己ws的profiles.json的地址。常规地址是
    C:\Users\lenovo\AppData\Local\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\profiles.json
  3. 在脚本中写入保存所有ws schemes的文件夹和profiles.json的路径。
  4. 运行脚本,按键盘任意键切换schemes,按ESC退出。这个脚本结束时并不会修改profiles文件,在看到喜欢的scheme时可按ESC退出,并根据终端里输出的方案名自行修改profiles文件。


Python脚本:

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
# -*- coding:utf-8
# Author : Fanxs
# 2019-11-08

import json
import os
from pynput import keyboard

'''
This script enumerates all the schemes in the `scheme_directory and changes
the profiles.json when the computer user press any key. Press `ESC` to stop.
This script restores the original profile when finished.
'''

config = "C:\\Users\\lenovo\\AppData\\Local\\Packages\\Microsoft.WindowsTerminal_8wekyb3d8bbwe\\LocalState\\profiles.json"
schemes_directory = "C:\\Users\\lenovo\\Desktop\\windowsterminal"

def getScheme():
for _ in all_schemes:
with open(_, "r") as h:
option = json.loads(h.read().strip())
name = option["name"]
option["name"] = "Option"
yield (name, option)

def init():
# Get the original contents
with open(config, 'r+') as handle:
original_json = handle.read()
handle.seek(0)
content = ""
for _ in handle.readlines():
c = _.strip()
if c.startswith("//"):
continue
content += c
# Modify the profiles
# Set all colorSchemes to "Option"
configuration = json.loads(content)
profiles = configuration["profiles"]
for p in range(0, len(profiles), 1):
profiles[p]["colorScheme"] = "Option"
# Get all schemes
all_schemes = [os.path.join(schemes_directory, i) if i.endswith(".json") else None for i in
os.listdir(schemes_directory)]
return (original_json, configuration, all_schemes)

def process(jo):
try:
name, option = next(generator)
jo["schemes"].append(option)
# 关掉文件才能更新配色,所以需要重复开关文件
with open(config, 'r+') as handle:
handle.seek(0)
handle.write(json.dumps(jo))
handle.truncate()
handle.flush()
print("\r","%s --> Press key to Next ------------" % name, end="", flush=True)
except Exception as e:
ending(str(e))
return None

def ending(msg):
msg = "\n[*] Ending." if not msg else msg
with open(config, 'w') as handle:
handle.write(original_json)
print(msg)
exit()
return None

def on_press(key):
if key == keyboard.Key.esc:
# Stop listener
ending("\n[*] Finished by Key.esc")
jo = configuration
process(jo)
return None

if __name__ == '__main__':
original_json, configuration, all_schemes = init()
generator = getScheme()
keyboard_listener = keyboard.Listener(on_press=on_press)
keyboard_listener.start()
keyboard_listener.join()

0x04. Keybindings快捷键

在设置文件中,还可以在keybindings项中设置快捷键。具体参考Keybindings设置

设置keybindings的格式,可以参考Windows Terminal的defaults.json:

这是Windows Terminal的默认快捷键,可根据这个格式,按自己的喜好自定义快捷键。注意的是,现在Windwos Terminal是支持分屏的,但是并没有默认快捷键来进行支持。可以在keybindings选项中加入,比如我加的是:

1
2
{ "command": "splitVertical", "keys": ["alt+-"] },
{ "command": "splitHorizontal", "keys": ["alt+="] }

然后就可以用快捷键来进行分屏:

CATALOG
  1. 1. 0x00. Windows Terminal 配置
  2. 2. 0x01. Profiles设置
  3. 3. 0x02. Profiles例子
  4. 4. 0x03. Schemes设置
  5. 5. 0x04. Keybindings快捷键