vimtutor学习笔记
简介
vimtutor是vim这款知名的文本编辑器的学习工具/指南。语法如下。
vimtutor [-g] [language]
gvimtutor
-g选项和gvimtutor是启动GUI版本的指南,需要系统支持,一般来说我们只需要键入这2种命令形式。
# vimtutor
# vimtutor zh
一种启用英文,一种启用中文,建议阅读英文指南。
当我们运行vimtutor的时候,看到是有点类似于man手册的帮助文档,但是它和man不同,man使用的是less命令来阅读帮助文档。
而vimtutor是调用了vim命令来打开文本类型的帮助文档。这些文档位于。
/usr/share/vim/vim74/tutor/tutor[.language]
其中的“.language”就是对应的语言,用户可以根据自己的需求选择。
并且vimtutor也不是直接编辑这些文档,而是将对应的tutor文档复制到临时目录下,再打开的,诸如“/tmp/tutorh6FaK0”。
而后即便你在文档中任意修改并且保存退出了,这个临时文件也会自动被清理掉,下次打开再复制一份新的。
因此,千万不要直接使用vim命令去编辑vim的tutor文件,而是直接运行vimtutor这个命令即可!
vimtutor还有一个配置文件,有兴趣的朋友可以看下。
/usr/share/vim/vim74/tutor/tutor.vim
vimtutor一共7个lesson,近1000行英文,推荐的阅读时间是半小时,不过一般都不止,每隔一阵子就可以拿出来练练手。
一定要边看边练,最好写个笔记或者博文,这样子才好记忆,只看不练绝对不行!只看不练绝对不行!只看不练绝对不行!
Lesson 1
Lesson 1.1 移动光标
hjkl,四个命令用于移动光标。
h:最左边的h表示光标向左移动一个字符。
l:最右边的l表示光标向右移动一个字符。
j:由于形似向下的箭头,所以它表示光标移动到下一行。
k:表示光标移动到上一行。
注意
当光标进行上下行切换的时候,它会尽可能保证光标所在位置不改动,例如原本在该行的第五个字符,那么移动至下一行,也会尽量保证处于第五个字符处。
如果不小心敲了一个未知的命令,担心出错的话,可以按一次或者多次<ESC>来返回正常模式(normal mode),然后再重新键入正确的命令。
键盘上的上下左右箭头按键也可以使用,但是如果你习惯的话,hjkl会更快。
Lesson 1.2 退出vim
1、键入<ESC>保证自己处于正常模式。
2、键入“:q! <ENTER>”,这样可以退出vim编辑器并且不保存修改。
3、看到shell提示符的时候,再次键入“vimtutor <ENTER>”回到指南。
注意
“:q! <ENTER>”是不保存退出,后面会教如何保存退出。
Lesson 1.3 文本编辑-删除
将光标移动到重复的字符上,然后键入x命令,它用于删除单个字符。
---> The ccow jumpedd ovverr thhe mooon.
Lesson 1.4 文本编辑-插入
---> There is text misng this .
---> There is some text missing from this line.
为了使得这两行的文本内容一致,将光标移动到短的那行第一个需要插入的位置,然后键入i命令。
键入i命令后,左下角会出现如下,表示在光标所在处进入插入模式(insert mode)。
-- INSERT --
进入插入模式后可自行输入文本,输入完毕后,键入<ESC>返回正常模式,再移动光标至需要补充的字符位置,重复上面那几步,直到这两行文本完全一致。
Lesson 1.5 文本编辑-附加
---> There is some text missing from th
There is some text missing from this line.
---> There is also some text miss
There is also some text missing here.
将光标移动至带有“--->”标记的行,然后键入A命令。
它表示在光标所在行的行尾进入插入模式。
在插入模式中补全剩余的字符,同样是按<ESC>返回正常模式。
Lesson 1.6 编辑文件
重新打开一个ssh会话。尝试使用vim编辑一个文件。
# vim test.txt
在vim编辑器中,使用刚才所学习到的插入和删除指令进行任意操作,然后使用以下命令保存并退出。
:wq <ENTER>
然后重新回到vimtutor,进入总结环节。
Lesson 1 总结
1、hjkl,左下右上移动字符。
2、如何使用vim编辑一个文件。
# vim FILENAME <ENTER>
3、如何退出vim。
:q! <ENTER> 不保存退出
:wq <ENTER> 保存退出
4、删除一个字符命令:x。
5、光标处进入插入模式命令:i。行尾进入插入模式命令:A。
6、<ESC>可以返回正常模式,并且可以取消任何误操作的/不想要的完成一半的指令。
Lesson 2
Lesson 2.1 删除命令
---> There are a some words fun that don't belong paper in this sentence.
删除这行文本中,多余的单词。
将光标移动至需要删除的单词的首字母处,然后按下dw,它会删除当前光标处至下一个单词的词首(不包含)之间的字符。
即,如果光标在单词首字母处,那么命令dw可用于删除整个单词。重复使用dw直至文本如下。
---> There are some words that don't belong in this sentence.
Lesson 2.2 更多删除命令
---> Somebody typed the end of this line twice. end of this line twice.
将光标移动至该行文本多余的位置,即第一个点号后面的空格字符。按下d$,可以删除当前光标处至行尾的所有字符。
结果如下。
---> Somebody typed the end of this line twice.
Lesson 2.3 operator和motion
许多改变文本的命令都是由operator和motion所组成的。
operator motion
例如,一个删除命令的结构是这样的。
d motion
d:在这里就是一个operator,可以理解为一种操作。
motion:表示operator的作用点/范围,可以理解为作用域。
motion还有这些:
w:直到下一个单词的词首,不包含下一个单词的首字母。
e:到达当前单词的词尾,包含词尾字母。
$:到达行尾,包含行尾字母。
motion可以单独使用,此时可以理解为移动,类似hjkl,只不过移动的范围比较广泛。
Lesson 2.4 motion计数
operator number motion
在使用motion的时候,可以为其增加一个计数,表示重复几次之意。
例如2w表示下两个单词的词首。
先位于这行的行首,然后键入2w,3e和0试试看效果。
---> This is just a line with words you can move around in.
0:表示行首之意。
Lesson 2.5 使用计数来删除
将光标移动至第一个大写字母处,然后键入d2w,查看效果。
---> this ABC DE line FGHI JK LMN OP of words is Q RS TUV cleaned up.
operator number motion
的结合,操作更加方便快捷。
也可以将number写在前面。
number operator motion
Lesson 2.6 在行上操作
由于经常需要遇到删除整行的操作,因此设计者设计了dd命令用于删除整行。
---> ) Roses are red,
---> ) Mud is fun,
---> ) Violets are blue,
---> ) I have a car,
---> ) Clocks tell time,
---> ) Sugar is sweet
---> ) And so are you.
基于上面的文本,移动至第2行使用dd命令,然后移动至新的第3行使用2dd命令。
正确操作的话,文本会变为如下。
---> ) Roses are red,
---> ) Violets are blue,
---> ) Sugar is sweet
---> ) And so are you.
Lesson 2.7 撤销
---> Fiix the errors oon thhis line and reeplace them witth undo.
使用x命令删除这行文本中多余的字符,使其变为如下。
---> Fix the errors on this line and replace them with undo.
删除完毕后,按一下u,可用于撤销刚才的1次命令,观察效果。
再按U,这个表示整行撤销,观察效果。
如果不小心撤销错了,也可以通过CTRL-R撤销掉撤销。
注:CTRL-R表示按住Ctrl键,然后在按一下(然后放开)字母r,大小写r都可以。下同。
Lesson 2 总结
dw:删除当前字符至下一个单词的词首,不包含下一个单词的词首字母。
d$:删除当前字符至行尾。
dd:删除整行。
number+motion:在motion前加上数字表示重复次数,例如2w表示移动至下两个单词的词首。
命令的一般格式如下。
operator [number] motion
operator:表示操作,做什么之意。
number:表示重复的次数。
motion:结合operator使用的时候表示操作的作用域,单独使用的时候表示移动的范围。
0:移动至行首。
u:撤销上一次操作。
U:撤销整行的操作。
CTRL-R:恢复撤销。
Lesson 3
Lesson 3.1 PUT命令
---> d) Can you learn too?
---> b) Violets are blue,
---> c) Intelligence is learned,
---> a) Roses are red,
将光标移动到d那行,然后按dd删除掉。
vim的删除不会真正地删除,而是将被删除的内容放入vim内部的寄存器(register)中。
将光标移动到c那行,然后按p。可以看到被删除的行出现在了光标的下一行。整个功能类似Windows的剪切粘贴。
---> b) Violets are blue,
---> c) Intelligence is learned,
---> d) Can you learn too?
---> a) Roses are red,
重复上面的行为,直到文本按照abcd正确排序。
---> a) Roses are red,
---> b) Violets are blue,
---> c) Intelligence is learned,
---> d) Can you learn too?
Lesson 3.2 替换(replace)命令
---> Whan this lime was tuoed in, someone presswd some wrojg keys!
---> When this line was typed in, someone pressed some wrong keys!
我们要让第一行的内容和第二行保持一致,第一行存在错误。
将光标移动至第一行第一个错误的位置,即“Whan”中的"a"的位置,键入r命令,再输入需要替换的字符“e”。
r命令用于替换单个字符,它只会替换单个字符。重复刚才的行为,使得第一行和第二行完全一致。
Lesson 3.3 THE CHANGE OPERATOR
---> This lubw has a few wptfd that mrrf changing usf the change operator.
---> This line has a few words that need changing using the change operator.
将光标至第一行第一个错误的位置,即lubw中的u字符,键入ce。
键入之后会进入插入模式,键入所需要的正确字符即可。
ce表示删除当前光标处至词尾的字符然后进入插入模式。
change和replace的区别在于,前者会进入插入模式,而后者不会。
Lesson 3.4 更多的change
c number motion
和删除一样,可以结合重复次数来change更多的文本。
将光标移动至第一行的some的首字母,然后试一下c$或者c8e。
---> The end of this line needs some help to make it like the second.
---> The end of this line needs to be corrected using the c$ command.
Lesson 3 总结
p:可以将刚才删除掉的存在于register中的内容再粘贴在光标的下一行处。如果删除掉的内容不是整行,则放在光标的后面。
r:替换光标所在处的字符,不进入插入模式。
c:c+number+motion,change所需要修改的字符范围的内容,会进入插入模式。
Lesson 4
Lesson 4.1 光标位置与文件状态
在正常模式下,键入CTRL-G,会显示出光标的位置和文件的状态信息,类似如下。
"/tmp/tutor0Iryp7" line of --%-- col -
"/tmp/tutor0Iryp7":表示当前编辑的文件的文件名。
line 485 of 970:表示当前光标所在的行号以及文件的行数。
--50%--:表示当前光标所在的文件的百分比位置。
col 10-24:表示光标在本行所处的位置,如果行存在制表符的话,那么会出现这个例子中的两个数字,我想应该是数字小的将制表符理解为一个字符,数字大的将制表符理解为8个字符(默认)。
如果想要实时看到这些信息的话,可以通过set命令设置。
:set noruler
设置完成后,在窗口的右下角就可以实时显示信息了。
, %
记住这个行号,485行。我们按G,可以跳转至最后一行。再按gg,可以跳转至第一行。
然后按485G,可以跳转至第485行。
Lesson 4.2 搜索命令
键入“/PHRASE”,表示从光标处向下搜索PHRASE字符串。
/PHRASE
它会出现在窗口的底部,就像“:”命令那样。
想要顺着搜索方向搜索下一个PHRASE,键入n。
想要逆着搜索方向搜索下一个PHRASE,键入N。
如果是“?PHRASE”,表示从光标处向上搜索PHRASE字符串。
?PHRASE
当我们键入多次n之后,想回到刚才所搜索的字符串的位置,可以使用CTRL-O回去。
如果我们回去的时候回过头了,即键入的CTRL-O次数过多,可以使用CTRL-I再往下一级,它是CTRL-O的反义词。
这个需要自己亲自使用一下才知道。
另外,CTRL-O和CTRL-I是基于行的。拿CTRL-O来举例说明。
按一下CTRL-O是回到上一次光标所在行。如果上一次和上两次光标是在同一行,即便该行的不同位置的话,多次使用CTRL-O也只会回到该行1次。
当搜索到文件底部的时候,如果再按一次n,那么搜索命令会从头开始搜索,并在窗口底行打印一条信息。
search hit BOTTOM, continuing at TOP
如果我们不希望搜索命令自动从头开始的话,可以设置该选项。
:set nowrapscan
再次搜索至底部就会有报错信息了,并且不会从头开始。
E385: search hit BOTTOM without match for: errroor
Lesson 4.3 括号匹配搜索
%:用于匹配对应的另一半括号。
---> This ( is a test line with ('s, ['s ] and {'s } in it. ))
将光标放至上面文本中的任意一个括号所在处,无论是以下哪一个。也无论是左括号还是右括号。
()[]{}
键入%命令观察效果。
如果我们把光标放置括号内部的话,那么键入%,它会去寻找当前所在处对应的左括号的位置。
Lesson 4.4 替换命令
---> thee best time to see thee flowers is in thee spring.
将光标移动至该行,无论该行的哪个位置,然后键入如下。
:s/thee/the
会将该行的第一个“thee”字符串替换为“the”,而后续的“thee”字符串则不会被修改。如果想要该行所有的“thee”都被替换的话,则使用该命令。
:s/thee/the/g
g表示global,全局之意。
还有其他几种替换用法,如下。
:#,#s/old/new/g 这里的#是数字,表示在第#行至第#行之间,执行行间全局替换。
:%s/old/new/g %是全文的意思,表示全文全局替换。
:%s/old/new/gc 多了一个c,表示每次替换都会咨询用户是否替换,应该是check之意。
Lesson 4 总结
CTRL-G:显示光标位置和文件状态。
G:移动至行尾。
number+G:移动至具体的某一行。
gg:移动至首行。
/phrase:向下搜索phrase字符串。
?phrase:向上搜索phrase字符串。
n:顺着搜索方向查找下一个phrase。
N:逆着搜索方向查找下一个phrase。
CTRL-O:回到刚才的位置。
CTRL-I:去往下一个新位置。
%:跳转至另一半括号或者光标所在处最近的左括号。
:s/old/new:当前光标所在行第一个old替换成new。
:s/old/new/g:当前光标所在行所有的old替换成new。(全局,global)
:#,#s/old/new/g:行间全局替换。
:%s/old/new/g:全文全局替换。
:%s/old/new/gc:全文全局确认式替换。
Lesson 5
Lesson 5.1 如何执行一个外部命令
“:”允许用户执行命令行命令(command-line command),例如“:set”系列命令。
而,“:!”则允许用户执行外部shell环境的命令,并且还可以带命令参数。
在vim中执行外部命令时使用tab可以实现类似bash中的命令补全和路径补全,不同点在于,它有点类似于轮询补全(个人叫法)的样子。
Lesson 5.2 更多写文件的方式
在vim中执行该命令,可以将文件目前编辑的样子保存至另一个文件中,有点类似于另存为的操作。
:w /PATH/TO/TEST.txt
Lesson 5.3 选取文本写入
有时候我们要操作的motion,并不是一个规则的部分。
比如,一个字符、单词、句子、行、段落或者全文等。
如果想选取一部分不规则的内容用于操作的话,可以使用v命令。
键入v后,就进入了visual模式(个人叫法),底行会有一行提示。
-- VISUAL --
此时可以使用各种motion(hjklweb0$^等等)来选取用户所需要的文本。
选取好之后键入“:”。此时底行显示为。
:'<,'>
接下来就可以将选取的文本保存至某个文件了。
:'<,'>w TEST
如果TEST文件已存在的话,则需要使用“!”来强制覆盖。
:'<,'>w! TEST
通过visual模式选择完毕后,除了可以使用w命令另存为以外,还可以使用别的operator,例如d删除,y复制等。
Lesson 5.4 检索与合并文件
:r FILENAME
此命令可以在光标所在行的下方插入所读取的文件的内容。
“:r”还可以用于读取外部命令的输出。
:r !ls
Lesson 5 总结
:!command
执行外部shell命令。
:w FILE
将当前在编辑的vim文件状态另存为其他文件。
使用v命令进入visual模式,可以选择不规则的文本区域,再结合其他的operator使用。
:r FILENAME
:r COMMAND-OUTPUT
将外部文件的内容或者外部命令的输出结果插入当前光标所在行的下面。
Lesson 6
Lesson 6.1 open命令
o:在光标所在行的下方打开一个新行并进入插入模式。
O:在光标所在行的上方打开一个新行并进入插入模式。
Lesson 6.2 append命令
---> This li will allow you to pract appendi text to a line.
---> This line will allow you to practice appending text to a line.
a:在光标所在字符的后方进入插入模式。
注意:i、I、a和A都可以进入插入模式,区别在于进入插入模式的位置不同罢了。
Lesson 6.3 另一种替换(replace)方式
---> Adding to xxx gives you xxx.
---> Adding to gives you .
R:进入连续的替换模式(replace mode),直到<ESC>。
将光标移动至第一个xxx的首字母处,键入R。此时底行会有替换模式的显示。
-- REPLACE --
而后键入我们需要的正确字符,输入完毕后<ESC>退回正常模式。
PS:要亲自体会一下,和r不同。
反复执行直到两行文本内容一致。
替换模式类似于插入模式,不同之处在于没键入一个字符就会删除当前光标所在字符并且将光标后移一位。
Lesson 6.4 复制粘贴
y:复制文本,复制完的内容和d一样进入vim的register。
p:粘贴register中的内容。
---> a) this is the first item.
b)
结合上述文本,快速将其变为如下。
可以通过visual模式复制,也可以通过y+number+motion复制。
---> a) this is the first item.
b) this is the second item.
Lesson 6.5 设置选项
当我们在搜索某个字符串的时候,默认是区分大小写的。例如。
/ignore
则只会搜索全小写的ignore,如果我们想同时搜索出Ignore和IGNORE的话,就需要设置忽略大小写的选项。
:set ignorecase
它有对应的简写模式。
:set ic
除了忽略大小写以外,还有高亮搜索和增量搜索。
:set hlsearch
:set incsearch
或者
:set hls is
设置完之后,再重新进行一次搜索,查看效果。
如果想关闭刚才的设置,在其前面加上no即可。
:set noic
如果只是希望本次搜索的时候忽略大小写,那么可以加上“\c”。
/ignore\c
Lesson 6 总结
iIoOaA:不同方式进入插入模式。
e:移动至词尾,如果结合operator的话,包含词尾字符。
y:yank,复制。
p:paste,粘贴。
R:进入替换模式,直到遇到<ESC>才退出,不同于r。
:set [no]OPTIONS:设置各种选项,no表示关闭,选项有简写模式。
Lesson 7
Lesson 7.1 获取在线帮助
进入vim之后,它支持灵活的在线帮助,可以通过一下方式进入。
按下<HELP>或者<F1>按键。或者键入。
:help
此时就会打开帮助文档,窗口被分为上下2个。
使用CTRL-WW可以切换窗口。想要退出帮助的话,和退出vim是一样的。
:q
但是要确保自己是位于帮助窗口中。
可以在:help后加参数,查看对应的subject的帮助。
:help w
:help c_CTRL-D
:help insert-index
:help user-manual
注意,在vimtutor中键入会报错,可以自己vim一个临时文件,来测试这个功能。
Lesson 7.2 创建一个启动脚本
vim相对于vi,拥有更多的新特性,但是其中的大部分,默认是禁用的。
如果想启用的话,需要用户自己编辑“~/.vimrc”配置文件。
:e ~/.vimrc
然后读取模板配置文件。
:r $VIMRUNTIME/vimrc_example.vim
然后保存退出。
详见:
:help vimrc-intro
Lesson 7.3 补全
首先确保vim没有处于兼容模式下。
:set nocp
而后使用外部命令查看当前文件列表。
:!ls
键入“:e”,按CTRL-D
通过<TAB>切换至edit,然后输入后续的文件名,文件名也可以通过<TAB>补全。
Lesson 7 总结
键入<F1>、<HELP>或者“:help”进入帮助模式。
“:help subject”:查看指定内容的帮助。
CTRL-WW:切换窗口,退出帮助要确保自己位于帮助窗口。
创建“~/.vimrc”启动脚本,即配置文件。
CTRL-D:命令补全。
vimtutor学习笔记的更多相关文章
- 【9-20】vimtutor学习笔记
第一节 ghjk移动光标 :q!:强制退出vim x:删除光标处的字符 i:在光标处插入 A:附加文本 :wq:保存文档并退出 第二节 dw:删除一个单词 d$:删除至行尾 de:删除光标处到该单词结 ...
- Linux 学习笔记
Linux学习笔记 请切换web视图查看,表格比较大,方法:视图>>web板式视图 博客园不能粘贴图片吗 http://wenku.baidu.com/view/bda1c3067fd53 ...
- 红帽学习笔记[RHCSA] 第一周
目录 红帽学习笔记[RHCSA] 环境 第一课 关于Shell 命令的基础知识 在终端中敲命令的快捷键 本次课程涉及的命令 第二课 常用的目录结构与用途 本次课程涉及到的命令 第三课 关于Linux的 ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
- PHP-会员登录与注册例子解析-学习笔记
1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...
- 2014年暑假c#学习笔记目录
2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...
- JAVA GUI编程学习笔记目录
2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...
- seaJs学习笔记2 – seaJs组建库的使用
原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...
随机推荐
- JS获取今天和上个月的今天
function getLastMonth(){ var now=new Date(); var year = now.getFullYear();//getYear()+1900=getFullYe ...
- Kaggle Titanic补充篇
1.关于年龄Age 除了利用平均数来填充,还可以利用正态分布得到一些随机数来填充,首先得到已知年龄的平均数mean和方差std,然后生成[ mean-std, mean+std ]之间的随机数,然后 ...
- Linux相关指令和操作
环境:Ubuntu16.04 1.安装ipython notebook 安装这个软件,必须安装anaconda: 注意几点:1.添加环境变量在安装的时候会自动询问你是否添加: 2.bash命令中应该和 ...
- High level GPU programming in C++
https://github.com/prem30488/C2CUDATranslator http://www.training.prace-ri.eu/uploads/tx_pracetmo/GP ...
- GCC选项_-Wl,-soname 及 DT_NEEDED 的解释
-Wl选项告诉编译器将后面的参数传递给链接器. -soname则指定了动态库的soname(简单共享名,Short for shared object name) soname的关键功能是它提供了兼容 ...
- 半自动代码生成--方式C#
寻找半自动代码生成方式基于C#的GUI或者其它: 1. (推荐)Millennials - A Custom Source Code Generator https://www.codeprojec ...
- 通过全备+主从同步恢复被drop的库或表
MySQL 中drop 等高危误操作后恢复方法 实验目的: 本次实验以恢复drop操作为例,使用不同方法进行误操作的数据恢复. 方法: 利用master同步(本文)] 伪master+Binlog+同 ...
- zabbix3.0.4导入中文模板后乱码问题处理
通过yum安装方式部署了zabbix3.0.4监控服务器,配置过程中发现当导入的模板中有中文时,图中的中文会变成方块 如下图所示: 这个问题是由于zabbix的web端没有中文字库,我们最需要把中文字 ...
- Expm 9_2 有向图的强连通分量问题
[问题描述] 给定一个有向图,设计一个算法,求解并输出该图的各个强连通分量. package org.xiu68.exp.exp9; import java.util.ArrayList; imp ...
- 使用 IIS 在 Windows 上托管 ASP.NET Core
参考微软文档: https://docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/iis/index?tabs=aspnetcore2x 将as ...