0%

Win10配置过程记录

简介

由于原来的系统出了一些问题,今日重装了Windows10系统,下面简要记录一下各种基本设定以及开发环境的配置过程,供今后参考。

系统安装

如何让Win10在系统盘重建ESP分区?

系统安装基本没什么好说的,只是需要注意如果有多块磁盘,并且其中一个磁盘存在ESP分区(Fat32),则在重装Win10时,即使选择安装到另一块未分区的磁盘,似乎Win10安装器也不会在另一块磁盘重建ESP分区,而会使用已有的ESP分区,如果想要Win10安装器在操作系统所在磁盘重建ESP分区,可以把另一块磁盘的ESP分区删掉。

对于无洁癖用户大可不必这样操作,不过给Win10预留一个未分区磁盘,还是比分好一个NTFS分区给它用要好的, 这样Win10安装器似乎会建立好几个分区,也许多余的分区是用于系统恢复的。

UEFI启动项管理软件

  • *nix系统建议直接使用 efibootmgr,至少Arch系、Debian系的系统都自带这个工具。
  • Windows系统可以用 EasyUEFI,不过试用版过期后就没法用了,即使重装、删除注册表项,也难以重新试用,可以用pj版。

指定用户名

如果按照Win10默认的引导进行配置,它会诱导用户登录微软账户,并自动把微软账户名的前缀(邮箱前缀)作为系统用户名,作为一个经常使用终端的CSer,是无法容忍奇奇怪怪的用户名的。

如果想要自定义用户名,需要先以本地账户登录,自己起一个用户名,之后再切换到微软账户登录即可。

初始配置

卸载自带应用

卸载一系列自带的无用软件。

Onedrive同步

登录Onedrive并开启个人文件夹同步,打开 文档 文件夹的同步功能,这样应该可以实现微信和QQ聊天记录的同步,写此文时尚未安装QQ和微信,所以不是特别确定。

WSL2配置

本次重装彻底删掉了Ubuntu系统,打算迁移到WSL2,毕竟双系统切换太麻烦了。

WSL2安装

按照官方教程配置即可,主要步骤大概如下:

  • 开启两项可选功能: Linux子系统 和 虚拟化平台
  • 下载安装最新的 WSL2 Linux内核升级包
  • 设置wsl默认版本为wsl2
  • 安装所需发行版

如何从主机访问WSL2?

由于wsl2的ip地址是动态配置的,而自动端口映射功能也并不稳定,为了便捷地从win10访问wsl2,一种可靠的方案是动态获取wsl2的ip地址并在win10的hosts文件中为其设置域名。

go-wsl2-host 项目实现了这个功能,参照项目说明进行配置,使用时可能会遇到一些问题:

  • 服务启动失败:检查用户名和密码,用户名基本就是个人文件夹的名字,密码为微软账户密码
  • 账号密码正确仍无法登录:开始->Windows管理工具->本地安全策略->本地策略->用户权限分配->作为服务登录->添加用户或组,把相应用户添加进去
  • 服务启动成功,但hosts文件却没变:可以使用 wsl2host debug 命令查看程序输出,如果程序提示无法写入hosts,检查hosts文件是否为只读,把只读属性取消即可。hosts路径为 C:\Windows\System32\drivers\etc\hosts

自动启动WSL2,以及其中的一些服务

WSL2不支持systemd,也就无法通过systemctl配置自启服务,可以在 /etc/init.wsl 中写入一些启动服务的命令,并在Windows中配置开机执行 wsl -u root /etc/init.wsl。可以利用Win10的 任务计划程序 配置执行上述命令。

我导出的任务计划程序配置(wsl2-init.xml)如下:

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
<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
<RegistrationInfo>
<Date>2021-07-01T20:23:06.8672886</Date>
<Author>OMEN\lpyhe</Author>
<Description>Windows开机时自动运行WSL2并且运行 /etc/init.wsl</Description>
<URI>\Custom\WSL-INIT</URI>
</RegistrationInfo>
<Triggers>
<BootTrigger>
<Enabled>true</Enabled>
</BootTrigger>
</Triggers>
<Principals>
<Principal id="Author">
<UserId>S-1-5-21-226882884-566579671-1051654333-1001</UserId>
<LogonType>Password</LogonType>
<RunLevel>LeastPrivilege</RunLevel>
</Principal>
</Principals>
<Settings>
<MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
<DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries>
<StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
<AllowHardTerminate>true</AllowHardTerminate>
<StartWhenAvailable>false</StartWhenAvailable>
<RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
<IdleSettings>
<StopOnIdleEnd>true</StopOnIdleEnd>
<RestartOnIdle>false</RestartOnIdle>
</IdleSettings>
<AllowStartOnDemand>true</AllowStartOnDemand>
<Enabled>true</Enabled>
<Hidden>false</Hidden>
<RunOnlyIfIdle>false</RunOnlyIfIdle>
<WakeToRun>false</WakeToRun>
<ExecutionTimeLimit>PT72H</ExecutionTimeLimit>
<Priority>7</Priority>
</Settings>
<Actions Context="Author">
<Exec>
<Command>wsl</Command>
<Arguments>-u root /etc/init.wsl</Arguments>
</Exec>
</Actions>
</Task>

Windows Terminal 中 wsl自动进入 ~

在windows terminal中配置wsl的启动目录为 //wsl$/Ubuntu-20.04/home/用户名/,可能需要根据实际情况修改wsl名称和用户名。

Win10 实用软件

WinSW: 设置守护服务

Win10配置守护服务不像Debian、Arch的systemd那样方便,可以借助第三方程序实现,比如 WinSW

下面是一个将frpc配置为服务的配置示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<service>

<!-- ID of the service. It should be unique across the Windows system-->
<id>frpc</id>
<!-- Display name of the service -->
<name>frpc</name>
<!-- Service description -->
<description>frpc</description>

<!-- Path to the executable, which should be started -->
<executable>C:\Programs\Frpc\frpc.exe</executable>

<arguments>-c C:\Programs\Frpc\frpc.ini</arguments>

<onfailure action="restart" />

</service>

AutohotKey: 配置快捷键

可用于配置快捷键,下面的脚本将 Ctrl + Alt + T 配置为启动Windows Terminal的快捷键。将写好的ahk脚本放到 C:\Users\用户名\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup 中即可开机自启。

1
2
3
^!t::
Run, wt.exe
return

WSL2子系统环境配置

使用python3作为默认python

推荐使用 update-alternatives 进行配置,这样便于管理。为python3添加alternatives的命令为:

1
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 30

vim配置

首先安装 vim-plug,然后准备好vim配置文件 ~/.config/nvim/init.vim, 接下来启动 vim 等待各种插件安装完成,其中Coc插件需要高版本的node,官方源版本过低,参考下一条进行node的安装。

我的Vim配置文件:

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
 " setting
" setting - basic
set nocompatible
set encoding=utf8
set showcmd
set hls
set relativenumber
set number
syntax on
" setting - tab & indent
set tabstop=4
set softtabstop=0
set shiftwidth=4
set expandtab
set autoindent
set smartindent

" keymap
let mapleader=","
nmap <Leader>t :NERDTreeToggle<CR>
nmap <Leader>w :w<CR>
nmap <Leader>q :q<CR>
" nmap <Leader>, 10<C-w><
" nmap <Leader>. 10<C-w>>
nmap <Leader>- 5<C-w>-
nmap <Leader>= 5<C-w>+
" nmap <Leader>i :bn<CR>
" nmap <Leader>o :bN<CR>

inoremap <C-L> <Del>

" tnoremap <A-h> <C-\><C-N><C-w>h
" tnoremap <A-j> <C-\><C-N><C-w>j
" tnoremap <A-k> <C-\><C-N><C-w>k
" tnoremap <A-l> <C-\><C-N><C-w>l
" inoremap <A-h> <C-\><C-N><C-w>h
" inoremap <A-j> <C-\><C-N><C-w>j
" inoremap <A-k> <C-\><C-N><C-w>k
" inoremap <A-l> <C-\><C-N><C-w>l
" nnoremap <A-h> <C-w>h
" nnoremap <A-j> <C-w>j
" nnoremap <A-k> <C-w>k
" nnoremap <A-l> <C-w>l

" use h,i,j,k move cursor in insert mode
inoremap <A-h> <C-o>h
inoremap <A-j> <C-o>j
inoremap <A-k> <C-o>k
inoremap <A-l> <C-o>l

" use h,i,j,k switch window in normal mode
nnoremap <A-h> <C-w>h
nnoremap <A-j> <C-w>j
nnoremap <A-k> <C-w>k
nnoremap <A-l> <C-w>l

" 在使用CTRL-U 和 CTRL-H时开启新的undo
" 防止意外删除字符却不可undo
inoremap <C-H> <C-G>u<C-H>
inoremap <C-U> <C-G>u<C-U>

tnoremap <Esc> <C-\><C-N>

tnoremap <A-n> <C-\><C-N>gt
tnoremap <A-p> <C-\><C-N>gT
inoremap <A-n> <C-\><C-N>gt
inoremap <A-p> <C-\><C-N>gT
nnoremap <A-n> gt
nnoremap <A-p> gT

augroup terminal
autocmd!
autocmd TermOpen * setlocal nonumber
autocmd TermOpen * setlocal norelativenumber
autocmd TermOpen * setlocal signcolumn=no
augroup end

" for cpp
function! CompileAndRun()
write
execute printf("!g++ -std=c++11 -Wall %s -o %s && %s", expand("%:p"), expand("%:p:r"), expand("%:p:r"))
endfunction
autocmd filetype cpp command! CompileAndRun call CompileAndRun()
autocmd filetype cpp nnoremap <Leader>r :CompileAndRun<CR>

" vim-plug
call plug#begin(stdpath('data') . '/plugged')

" Make sure you are using single quotes
Plug 'neoclide/coc.nvim', {'branch': 'release'}
Plug 'vim-airline/vim-airline'
Plug 'vim-airline/vim-airline-themes'
Plug 'Yggdroot/LeaderF'
Plug 'wakatime/vim-wakatime'

" On-demand loading
Plug 'scrooloose/nerdtree', { 'on': 'NERDTreeToggle' }

" Always load the vim-devicons as th very last one
Plug 'ryanoasis/vim-devicons'
call plug#end()

let g:airline_powerline_fonts = 1
let g:airline_theme='bubblegum'

" >>> FOR COC >>>
" TextEdit might fail if hidden is not set
set hidden

" Some servers have issue with backup files, see #649
set nobackup
set nowritebackup

" Give more space for display messages
set cmdheight=2

" Having longer updatetime (default is 4000 ms = 4 s) leads to noticeable"
" delays and poor user experience
set updatetime=300

" Don't pass messages to |ins-completion-menu|
set shortmess+=c

" Always show the signcolumn, otherwise it would shift the text each time
" diagnostics appear/become resolved.
if has("patch-8.1.1564")
" Recently vim can merge signcolumn and number column into one
set signcolumn=number
else
set signcolumn=yes
endif

" Use tab for trigger completion with characters ahead and navigate.
" NOTE: Use command ':verbose imap <tab>' to make sure tab is not mapped by
" other plugin before putting this into your config.
inoremap <silent><expr> <TAB>
\ pumvisible() ? "\<C-n>" :
\ <SID>check_back_space() ? "\<TAB>" :
\ coc#refresh()
inoremap <expr><S-TAB> pumvisible() ? "\<C-p>" : "\<C-h>"

function! s:check_back_space() abort
let col = col('.') - 1
return !col || getline('.')[col - 1] =~# '\s'
endfunction

" Use <c-space> to trigger completion.
if has('nvim')
inoremap <silent><expr> <c-space> coc#refresh()
else
inoremap <silent><expr> <c-@> coc#refresh()
endif

" Use [g and ]g to navigate diagnostics
" use :CocDiagnostics to get all diagnostics of current buffer in location list
nmap <silent> [g <Plug>(coc-diagnostic-prev)
nmap <silent> ]g <Plug>(coc-diagnostic-next)

" GoTo code navigation.
nmap <silent> gd <Plug>(coc-definition)
nmap <silent> gy <Plug>(coc-type-definition)
nmap <silent> gi <Plug>(coc-implementation)
nmap <silent> gr <Plug>(coc-references)

" Use K to show documentation in preview window.
nnoremap <silent> K :call <SID>show_documentation()<CR>

function! s:show_documentation()
if (index(['vim','help'], &filetype) >= 0)
execute 'h '.expand('<cword>')
else
call CocActionAsync('doHover')
endif
endfunction

" Highlight the symbol and its references when holding the cursor.
autocmd CursorHold * silent call CocActionAsync('highlight')

" Symbol renaming.
nmap <leader>rn <Plug>(coc-rename)

" Formatting selected code.
" xmap <leader>f <Plug>(coc-format)
" nmap <leader>f <Plug>(coc-format)

augroup mygroup
autocmd!
" Setup formatexpr specified filetype(s).
autocmd FileType typescript,json setl formatexpr=CocAction('formatSelected')
" Update signature help on jump placeholder.
autocmd User CocJumpPlaceholder call CocActionAsync('showSignatureHelp')
augroup end

" Applying codeAction to the selected region.
" Example: `<leader>aap` for current paragraph
xmap <leader>a <Plug>(coc-codeaction-selected)
nmap <leader>a <Plug>(coc-codeaction-selected)

" Remap keys for applying codeAction to the current buffer.
nmap <leader>ac <Plug>(coc-codeaction)
" Apply AutoFix to problem on the current line.
nmap <leader>qf <Plug>(coc-fix-current)

" Map function and class text objects
" NOTE: Requires 'textDocument.documentSymbol' support from the language server.
xmap if <Plug>(coc-funcobj-i)
omap if <Plug>(coc-funcobj-i)
xmap af <Plug>(coc-funcobj-a)
omap af <Plug>(coc-funcobj-a)
xmap ic <Plug>(coc-classobj-i)
omap ic <Plug>(coc-classobj-i)
xmap ac <Plug>(coc-classobj-a)
omap ac <Plug>(coc-classobj-a)

" Remap <C-f> and <C-b> for scroll float windows/popups.
" Note coc#float#scroll works on neovim >= 0.4.0 or vim >= 8.2.0750
nnoremap <nowait><expr> <C-f> coc#float#has_scroll() ? coc#float#scroll(1) : "\<C-f>"
nnoremap <nowait><expr> <C-b> coc#float#has_scroll() ? coc#float#scroll(0) : "\<C-b>"
inoremap <nowait><expr> <C-f> coc#float#has_scroll() ? "\<c-r>=coc#float#scroll(1)\<cr>" : "\<Right>"
inoremap <nowait><expr> <C-b> coc#float#has_scroll() ? "\<c-r>=coc#float#scroll(0)\<cr>" : "\<Left>"

" NeoVim-only mapping for visual mode scroll
" Useful on signatureHelp after jump placeholder of snippet expansion
if has('nvim')
vnoremap <nowait><expr> <C-f> coc#float#has_scroll() ? coc#float#nvim_scroll(1, 1) : "\<C-f>"
vnoremap <nowait><expr> <C-b> coc#float#has_scroll() ? coc#float#nvim_scroll(0, 1) : "\<C-b>"
endif

" Use CTRL-S for selections ranges.
" Requires 'textDocument/selectionRange' support of language server.
nmap <silent> <C-s> <Plug>(coc-range-select)
xmap <silent> <C-s> <Plug>(coc-range-select)

" Add `:Format` command to format current buffer.
command! -nargs=0 Format :call CocAction('format')

" Add `:Fold` command to fold current buffer.
command! -nargs=? Fold :call CocAction('fold', <f-args>)

" Add `:OR` command for organize imports of the current buffer.
command! -nargs=0 OR :call CocAction('runCommand', 'editor.action.organizeImport')

" >>> config for coc >>>
let g:coc_global_extensions = ['coc-tsserver', 'coc-html', 'coc-css', 'coc-json',
\ 'coc-python', 'coc-xml', 'coc-yaml', 'coc-markdownlint', 'coc-highlight',
\ 'coc-clangd', 'coc-pairs', 'coc-git', 'coc-go', 'coc-rust-analyzer']
inoremap <silent><expr> <cr> pumvisible() ? coc#_select_confirm() : "\<C-g>u\<CR>"
" <<< config for coc <<<


node安装

官方源中版本过低,很多软件都要求更高版本的node,建议使用nodesource维护的软件源安装,具体参考项目主页。写此文时,安装长期维护版node的具体命令为:

1
2
3
# Using Ubuntu
curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash -
sudo apt-get install -y nodejs