『运维备忘录』之 Vim 命令详解

运维人员不仅要熟悉操作系统、服务器、网络等只是,甚至对于开发相关的也要有所了解。很多运维工作者可能一时半会记不住那么多命令、代码、方法、原理或者用法等等。这里我将结合自身工作,持续给大家更新运维工作所需要接触到的知识点,希望大家喜欢。

今天我们要讲的是 Vim


一、简介

Vim文本编辑器,是由 vi 发展演变过来的文本编辑器,使用简单、功能强大、是 Linux众多发行版的默认文本编辑器。 

vi ( visual editor ) 编辑器通常被简称为vi,它是Linux和Unix系统上最基本的文本编辑器,类似于Windows系统下的notepad (记事本) 编辑器。Vim (Vi improved)是 vi 编辑器的加强版,比 vi 更容易使用。vi 的命令几乎全部都可以在vim上使用。

文章开头我先对 Vim 相关的一些基础词语做个解释,后面都会有详细的说明,方便大家理解。

官方网站:https://www.vim.org/

1.1. 动词理解

动词代表了我们打算对文本进行什么样的操作。

d  # 表示删除delete
r  # 表示替换replace
c  # 表示修改change
y  # 表示复制yank
v  # 表示选取visual select

1.2. 名词理解

名词代表了我们即将处理的文本。引号或者各种括号所包含的文本称作一个文本块。

w  # 表示一个单词word
s  # 表示一个句子sentence
p  # 表示一个段落paragraph
t  # 表示一个 HTML 标签tag

1.3. 介词理解

 介词界定了待编辑文本的范围或者位置。

i  # 表示在...之内 inside
a  # 表示环绕... around
t  # 表示到...位置前 to
f  # 表示到...位置上 forward

1.4. 数词理解

数词指定了待编辑文本对象的数量,从这个角度而言,数词也可以看作是一种介词。引入数词之后,文本编辑命令的语法就升级成了下面这样:

动词 介词/数词 名词

# 示例
c3w  # 修改三个单词:change three words
d2w  # 删除两个单词:delete two words

另外,数词也可以修饰动词,表示将操作执行 n 次。于是,我们又有了下面的语法:

数词 动词 名词 

# 示例
2dw # 两次删除单词(等价于删除两个单词): twice delete word
3x  # 三次删除字符(等价于删除三个字符): three times delete character

二、Vim 键位操作

按键说明
l        右移光标
gj       下移光标(折行文本)
gk       上移光标(折行文本)
H        移动到当前页面顶部
M        移动到当前页面中间
L        移动到当前页面底部
w        移动到下个单词开头
W        移动到下个单词开头(单词含标点)
e        移动到下个单词结尾
E        移动到下个单词结尾(单词含标点)
b        移动到上个单词开头
B        移动到上个单词开头(单词含标点)
ge       移动到上个单词结尾
gE       移动到上个单词结尾(单词含标点)
%        

跳转到配对的符号(默认支持的配对符号组: '()', '{}', '[]'

在vim中使用 :h matchpairs 获得更多信息)

0移动到行首
^        移动到行首的非空白符
$        移动到行尾
g_       移动到行内最后一个非空白符
gg       移动到文件第一行
G        移动到文件最后一行
5gg or 5G移动到第五行
gd       跳转到局部定义
gD       跳转到全局定义
fx       移动到字符 x 下次出现的位置
tx       移动到字符 x 下次出现的位置的前一个字符
Fx       移动到字符 x 上次出现的位置
Tx       移动到字符 x 上次出现的位置的后一个字符
;        重复之前的f、t、F、T操作
,        反向重复之前的f、t、F、T操作
}        移动到下一个段落 (当编辑代码时则为函数/代码块)
{        移动到上一个段落 (当编辑代码时则为函数/代码块)
zz       移动屏幕使光标居中
zt       移动屏幕使光标位于屏幕顶部
zb       移动屏幕使光标位于屏幕底部
Ctrl + e 向下移动屏幕一行(保持光标不动)
Ctrl + y 向上移动屏幕一行(保持光标不动)
Ctrl + b 向上滚动一屏
Ctrl + f 向下滚动一屏
Ctrl + d 向下滚动半屏
Ctrl + u 向上滚动半屏

 Tips:命令前追加数字表示命令的重复次数, 比如 4j 表示向下移动四行

三、Vim 基础编辑

按键说明
r       替换当前字符
R       在 ESC 按下之前,替换多个字符
J       将下一行合并到当前行, 并在两部分文本之间插入一个空格
gJ      将下一行合并到当前行, 两部分文本之间不含空格
gwip    重新调整段落
g~      大小写转换操作修饰符
gu      小写操作修饰符
gU      大写操作修饰符
cc      将光标所在的行删除, 然后进入插入模式
c$ or C 将光标处到行尾删除, 然后进入插入模式
ciw     将光标所在的单词删除, 然后进入插入模式
cw or ce从光标位置开始, 修改单词
s       删除当前字符, 然后进入插入模式
S       清空当前行, 然后进入插入模式 (同cc)
xp      当前字符后移
u       撤销
U       撤销上一次的改动行的操作
Ctrl + r重做(取消撤销)
.       再次执行上个命令

四、Vim 插入模式

按键说明
i              从光标前开始插入字符
I              从行首开始插入字符
a              从光标后开始插入字符
A              从行尾开始插入字符
o              在当前行之下另起一行, 开始插入字符
O              在当前行之上另起一行, 开始插入字符
ea             从当前单词末尾开始插入
Ctrl + h       在插入模式下,删除光标前的字符
Ctrl + w       在插入模式下,删除光标前的单词
Ctrl + j       在插入模式下,另起一行
Ctrl + t       在插入模式下,向右缩进,宽度由 shiftwidth 控制
Ctrl + d       在插入模式下,向左缩进,宽度由 shiftwidth 控制
Ctrl + n       在插入模式下,在光标之前插入自动补全的下一个匹配项
Ctrl + p       在插入模式下,在光标之前插入自动补全的上一个匹配项
Ctrl + rx      插入寄存器 x 的内容
Ctrl + ox      暂时进入正常模式以发出一个正常模式命令 x
Esc or Ctrl + c退出插入模式

五、Vim 可视化模式

按键说明
v              进入可视化模式, 移动光标高亮选择, 然后可以对选择的文本执行命令(比 y - 复制)
V              进入可视化模式(行粒度选择)
o              切换光标到选择区开头/结尾
Ctrl + v       进入可视化模式(矩阵选择)
O              切换光标到选择区的角
aw             选择当前单词
ab             选择被 () 包裹的区域(含括号)
aB             选择被 {} 包裹的区域(含花括号)
at             选择被 <> 标签包裹的区域(含<>标签)
ib             选择被 () 包裹的区域(不含括号)
iB             选择被 {} 包裹的区域(不含花括号)
it             选择被 <> 标签包裹的区域(不含<>标签)
Esc or Ctrl + c退出可视化模式
>              向右缩进
<              向左缩进
y              复制
d              剪切
~              大小写切换
u              将选中文本转换为小写
U              将选中文本转换为大写

Tips:也可以使用 ( 和 { 分别代替 b 和 B 。

六、Vim Ctrl-c + Ctrl v 神器

按键说明
yy     复制当前行
2yy    复制 2 行
yw     复制当前单词
yiw    复制光标处的单词
yaw    复制光标处的单词及其前后的空格
y$ or Y复制, 从光标位置到行末
p      在光标后粘贴
P      在光标前粘贴
gp     在光标后粘贴并把光标定位于粘贴的文本之后
gP     在光标前粘贴并把光标定位于粘贴的文本之后
dd     剪切当前行
2dd    剪切 2 行
dw     剪切当前单词
diw    删除光标处的单词
daw    删除光标处的单词及其前后的空格
:3,5d  删除 3 至 5 行
:g/{pattern}/d删除所有包含 pattern 的行
:g!/{pattern}/d删除所有不包含 pattern 的行
d$ or D剪切, 从光标位置到行末 (同 D )
x剪切当前字符

Tips:也可以使用以下字符来指定范围:
:.,$d - 从当前行到文件末尾
:.,1d - 从当前行到文件开头
:10,$d - 第 10 行到文件末尾 

七、Vim 保存和退出

按键说明
:w保存
:q关闭文件
:wq | :x | ZZ保存并退出
:wqa保存并退出所有文件
:q! | ZQ强制退出
:qa关闭所有文件
:qa!强制退出所有文件
:w new.txt写入new.txt
:sav new.txt保存并编辑new.txt
:w !sudo tee %写入只读文件

八、Vim 查找和替换

按键说明
/foo向前搜索
/foo\c向前搜索 (不区分大小写)
?foo向后搜索
/\v\d+使用 regex 搜索
n下一个匹配的搜索模式
N上一个匹配的搜索
*向前搜索当前单词
#向后搜索当前单词
%整个文件
’<,’>当前选择
5第 5 行
5,10第 5 行到第 10 行
$最后一行
2,$第 2 行到最后
.当前行
,3接下来的 3 行
-3,转发 3 行
& | \0替换为整个匹配的
\1...\9替换为 0-9 组
\u大写下一个字母
\U后面的大写字符
\l小写下一个字母
\L后面的字符小写
\e\u、\U、\l 和 \L 的结尾
\E\u、\U、\l 和 \L 的结尾
:s/old/new更换行:先更换
:s/old/new/g更换行:全部替换
:s/\vold/new/g更换行:全部替换为 regex
:s/old/new/gc更换行:全部替换_(确认)_
:s/old/new/i更换行:先忽略大小写替换
:2,6s/old/new/g更换行:在 2-6 行之间替换
:%s/old/new更换文件:先更换
:%s/old/new/g更换文件:全部替换
:%s/old/new/gc更换文件:全部替换 (确认)
:%s/old/new/gi更换文件:全部替换 (忽略大小写)
:%s/\vold/new/g更换文件:全部替换为 regex
:g/foo/d删除包含 foo 的行
:g!/foo/d删除不包含 foo 的行
:g/^\s*$/d删除所有空行
:g/foo/t$将包含 foo 的行复制到 EOF
:g/foo/m$将包含 foo 的行移动到 EOF
:g/^/m0反转文件
:g/^/t.复制每一行

实例说明:

:s/a\|b/xxx\0xxx/g               # 将 "a b"      修改为 "xxxaxxx xxxbxxx"
:s/test/\U& file/                # 将 "test"     修改为 "TEST FILE"
:s/\(test\)/\U\1\e file/         # 将 "test"     修改为 "TEST file"
:s/\v([abc])([efg])/\2\1/g       # 将 "af fa bg" 修改为 "fa fa gb"
:s/\v\w+/\u\0/g                  # 将 "bla bla"  修改为 "Bla Bla"
:s/\v([ab])|([cd])/\1x/g         # 将 "a b c d"  修改为 "ax bx x x"
:%s/.*/\L&/                      # 将 "HTML"     修改为 "html"
:s/\v<(.)(\w*)/\u\1\L\2/g        # 将单词的每个首字母大写
:%s/^\(.*\)\n\1/\1/              # 删除重复行
:%s/<\/\=\(\w\+\)\>/\U&/g        # 将 HTML 标记转换为大写
:g/^pattern/s/$/mytext           # 查找文本并将其附加到末尾
:g/pattern/norm! @i              # 在匹配行上运行宏
/^\(.*\)\(\r\?\n\1\)\+$          # 查看重复行
/\v^(.*)(\r?\n\1)+$              # 查看重复行(非常神奇)
:v/./,/./-j                      # 将空行压缩成空行
:g/<p1>/,/<p2>/d                 # 从 <p1> 到 <p2> 包含删除

九、Vim diff 文件比对

用法:

$ vimdiff file1 file2 [file3]
$ vim -d file1 file2 [file3]

按键说明:

按键说明
zf              定义折叠修饰符
zd              删除光标位置的折叠
za              展开 & 关闭光标位置的折叠
zo              展开光标位置的折叠
zc              关闭光标位置的折叠
zr              展开同级的所有折叠
zm              关闭同级的所有折叠
zi              开启 & 关闭折叠功能
]c              光标移至下一处差异
[c              光标移至上一处差异
do or :diffg[et]将另一缓冲区中的差异合并至当前缓冲区
dp or :diffpu[t]将当前缓冲区中的差异推送至另一缓冲区
:diffthis       令当前窗口成为 diff 模式的窗口之一
:dif[fupdate]   强制刷新 diff 的高亮与折叠
:diffo[ff]      令当前窗口退出 diff 模式

Tips:可以直接在终端运行 vimdiff 查看文件间的不同。也可以将该程序设为 git difftool 的选项之一。

十、Vim 标记

按键说明
`^插入模式下光标的最后位置
`.当前缓冲区的最后更改
`"最后退出的当前缓冲区
`0在上次编辑的文件中
''返回当前缓冲区中跳出的行
``返回当前缓冲区中跳转的位置
`[到先前更改或拉出的文本的开头
`]到之前更改或拉出的文本的结尾
`<到最后一个可视化选择的开始
`>到最后一个可视化选择的结尾
ma将此光标位置标记为a
`a跳转到光标位置a
'a跳转到位置为 a 的行首
d'a从当前行删除到标记 a 的行
d`a从当前位置删除到标记 a 的位置
c'a将文本从当前行更改为 a 行
y`a将文本从当前位置拉到 a 的位置
:marks列出所有当前标记
:delm a删除标记a
:delm a-d删除标记a、b、c、d
:delm abc删除标记a、b、c

Tips:可以使用反引号(`)或单引号(')跳转至标记位置。使用单引号会跳转至该标记所在行行首(首个非空白字符)。 

十一、Vim 标签

按键说明
:tabnew or :tabnew {page.words.file}在新标签中打开文件
Ctrl + wT                           将窗口变成标签
gt or :tabn[ext]                    切换到下一个标签
gT or :tabp[revious]                切换到上一个标签
#gt                                 切换到第 # 个标签
:tabm[ove] #                        移动标签到第 # 位(下标从 0 开始)
:tabc[lose]                         关闭当前标签
:tabo[nly]                          关闭其他标签
:tabdo command                      在所有标签中执行命令 (例如 :tabdo q 关闭所有标签)

十二、Vim 多文件编辑

按键说明
:e[dit] 文件名    新建缓冲区打开 filename
:bn[ext]          切换到下个缓冲区
:bp[revious]      切换到上个缓冲区
:bd[elete]        关闭缓冲区
:b[uffer]#        切换到第 # 个缓冲区
:b[uffer] file    用文件名切换缓冲区
:ls or :buffers   列出所有打开的缓冲区
:sp[lit] 文件名   新建缓冲区打开 filename 并水平分割窗口
:vs[plit] 文件名  新缓冲区打开 filename 并垂直分割窗口
:vert[ical] ba[ll]垂直分割窗口编辑所有缓冲区
:tab ba[ll]       标签页编辑所有缓冲区
Ctrl + ws         水平分割窗口
Ctrl + wv         垂直分割窗口
Ctrl + ww         在窗口间切换
Ctrl + wq         关闭窗口
Ctrl + wx         当前窗口与下一个窗口交换位置
Ctrl + w=         令所有窗口高 & 宽一致
Ctrl + wh         切换到左侧窗口
Ctrl + wl         切换到右侧窗口
Ctrl + wj         切换到下侧窗口
Ctrl + wk         切换到上侧窗口
Ctrl + wH         使游标所在视窗全高并移至最左 (最左垂直视窗)
Ctrl + wL         使游标所在视窗全高并移至最右 (最右垂直视窗)
Ctrl + wJ         使游标所在视窗全宽并移至最下 (最下水平视窗)
Ctrl + wK         使游标所在视窗全宽并移至最上 (最上水平视窗)

十三、Vim 宏

按键说明
qa录制宏 a
停止录制宏
@a执行宏 a
@@重新执行上次执行的宏

实例说明:

假设文件包含以下内容:

Hello world
My name is Vim
I am an editor

先在你想在每行末尾添加“!”号。为此,可以使用宏来录制和重放该命令,对于多文本和内容较多的文本操作有很大的帮助。通过以下步骤录制宏:

  1. 将光标置于第一行末尾的单词
  2. 键入“qa”来启动录制宏,并按下“A!”向光标所在位置添加“!”号
  3. 按下“j”将光标移动到下一行
  4. 按下“q”停止录制宏

录制完宏后执行以下命令执行宏:

:%norm!@a

 这将应用宏到整个文件,将“!”添加到每行的末尾。文件现在如下所示:

Hello world!
My name is Vim!
I am an editor!

十四、Vim 常用小技巧

14.1. 删除重复行

:sort | %!uniq -u

14.2. 对文件中的行进行编号

:%!cat -n

14.3. 将整个文档复制到剪贴板

:%w !xclip -i -sel c   # GNU/Linux
:%w !xsel -i -b        # GNU/Linux

14.4. 空格和制表符转换

:set noexpandtab  # 将所有空格转换为制表符
:set expandtab    # 将所有制表符转换为空格

14.5. 保存文件前显示差异

:w !diff % -

这个强烈推荐。

我们可能遇到过这样的情况:我修改了这个文件,但是忘记都做了哪些修改了,并且我担心其中有些地方可能修改错了。解决此问题的方法是查看缓冲区和文件之间的差异。上述命令可以查看。

14.6. 显示拼写错误

:set spell

更多小技巧欢迎大家在评论区分享,让我们一起努力,谢谢大家。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/372311.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

杨中科 ASP.NETCORE 高级14 SignalR

1、什么是websocket、SignalR 服务器向客户端发送数据 1、需求&#xff1a;Web聊天;站内沟通。 2、传统HTTP&#xff1a;只能客户端主动发送请求 3、传统方案&#xff1a;长轮询&#xff08;Long Polling&#xff09;。缺点是&#xff1f;&#xff08;1.客户端发送请求后&…

如何使用MCSM搭建我的世界Java版服务器并实现远程联机游戏

文章目录 1. 安装JAVA2. MCSManager安装3.局域网访问MCSM4.创建我的世界服务器5.局域网联机测试6.安装cpolar内网穿透7. 配置公网访问地址8.远程联机测试9. 配置固定远程联机端口地址9.1 保留一个固定tcp地址9.2 配置固定公网TCP地址9.3 使用固定公网地址远程联机 本教程主要介…

1802907-91-0,Methyltetrazine-PEG4-COOH,可以与多种不同的化学基团反应

您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;Methyltetrazine-PEG4-COOH&#xff0c;Methyltetrazine-PEG4-acid&#xff0c;甲基四嗪-四聚乙二醇-羧基&#xff0c;甲基四嗪-四聚乙二醇-羧酸&#xff0c;甲基四嗪PEG4羧酸&#xff0c;甲基四嗪-PEG4-羧酸 一、基…

基于Java医院管理系统设计与实现(源码+部署文档)

博主介绍&#xff1a; ✌至今服务客户已经1000、专注于Java技术领域、项目定制、技术答疑、开发工具、毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅 &#x1f447;&#x1f3fb; 不然下次找不到 Java项目精品实…

爱快安装和双宽带叠加

文章目录 一、爱快安装二、爱快使用1. 配置WAN12. 配置WAN23. 配置LAN14. 配置DHCP5. DNS设置6. 多线负载7. 基础设置 三、通过交换机拨号1. 交换机设置2. 配置WAN1 一、爱快安装 &#xff08;1&#xff09;下载爱快路由ISO版本 爱快路由系统下载 &#xff08;2&#xff09;IS…

群晖NAS开启FTP服务结合内网穿透实现公网远程访问本地服务

⛳️ 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 文章目录 ⛳️ 推荐1. 群晖安装Cpolar2. 创建FTP公网地址3. 开启群晖FTP服务4. 群晖FTP远程连接5. 固定FTP公网地址6. 固定FTP…

请问CTF是什么?请介绍一下关于隐水印的知识特点技术原理应用领域技术挑战

目录 请问CTF是什么&#xff1f; 请介绍一下关于隐水印的知识 特点 技术原理 应用领域 技术挑战 请问CTF是什么&#xff1f; CTF&#xff08;Capture The Flag&#xff0c;夺旗比赛&#xff09;是一种信息安全竞赛&#xff0c;常见于计算机安全领域。这种比赛模拟各种信…

Python中的HTTP代理服务器和客户端的区别与联系

在Python编程中&#xff0c;当我们涉及到网络通信&#xff0c;尤其是HTTP请求时&#xff0c;经常会听到“HTTP代理服务器”和“客户端”这两个词。它们在网络世界中扮演着不同的角色&#xff0c;但又有着紧密的联系。 区别 首先&#xff0c;我们来谈谈它们的区别。 HTTP代理…

Multisim14.0仿真(五十一)74LS42D应用设计

一、74LS42D简介&#xff1a; 74LS42D是4 线 BCD 至 10 线十进制解码器&#xff0c;用在数字电路与单片机控制系统中&#xff0c;以达到通过译码来扩展ip端口的功能。 二、74LS42D逻辑框图&#xff1a; 三、74LS42D功能表&#xff1a; 四、仿真原理图&#xff1a; 五、运行效果…

Rust 本地文档的使用:rustup doc

Rust 是一种系统级编程语言&#xff0c;以其安全性、速度和内存控制能力而闻名。为了方便开发者更好地了解并利用 Rust 标准库和工具链中的功能&#xff0c;Rust 提供了一种内置的文档浏览方式——通过 rustup doc 命令。 安装 rustup 在查阅 Rust 文档之前&#xff0c;确保你…

GCC编译器的使用以及使用Makefile语法进行操控

Makefile 这里使用的Makefile操控编译器 gcc 常见的组成部分 c&#xff1a; gcc 的一个版本&#xff0c;默认语言设置为 C&#xff0c;而且在链接的时候自动包含标准 C 库。这和 g 一样configure&#xff1a; GCC 源代码树根目录中的一个脚本。用于设置配置值和创建 GCC 编…

FPS游戏穿模最强解决方案!开发一款FPS游戏射击游戏真的太简单!

FPS游戏穿模最强解决方案&#xff01;开发一款FPS游戏射击游戏真的太简单&#xff01; 2001年&#xff0c;FPS游戏老大哥《CS》横空出世&#xff0c;迅速在国内外掀起了一波FPS游戏的热潮&#xff0c;随后《CF穿越火线》在国内上线&#xff0c;一举拿下“玩家最喜爱的十大网络…

Java设计模式大全:23种常见的设计模式详解(二)

本系列文章简介&#xff1a; 设计模式是在软件开发过程中&#xff0c;经过实践和总结得到的一套解决特定问题的可复用的模板。它是一种在特定情境中经过验证的经验和技巧的集合&#xff0c;可以帮助开发人员设计出高效、可维护、可扩展和可复用的软件系统。设计模式提供了一种在…

Ubuntu使用Docker部署Nginx并结合内网穿透实现公网远程访问

文章目录 1. 安装Docker2. 使用Docker拉取Nginx镜像3. 创建并启动Nginx容器4. 本地连接测试5. 公网远程访问本地Nginx5.1 内网穿透工具安装5.2 创建远程连接公网地址5.3 使用固定公网地址远程访问 在开发人员的工作中&#xff0c;公网远程访问内网是其必备的技术需求之一。对于…

鸿蒙内核框架

1 内核概述 内核简介 用户最常见到并与之交互的操作系统界面&#xff0c;其实只是操作系统最外面的一层。操作系统最重要的任务&#xff0c;包括管理硬件设备&#xff0c;分配系统资源等&#xff0c;我们称之为操作系统内在最重要的核心功能。而实现这些核心功能的操作系统模…

【LeetCode力扣】单调栈解决Next Greater Number(下一个更大值)问题

目录 1、题目介绍 2、解题思路 2.1、暴力破解法 2.2、经典Next Greater Number问题解法 1、题目介绍 原题链接&#xff1a;496. 下一个更大元素 I - 力扣&#xff08;LeetCode&#xff09; 示例1&#xff1a; 输入&#xff1a;nums1 [4,1,2], nums2 [1,3,4,2].输出&…

【计算机网络】Socket的SO_TIMEOUT与连接超时时间

SO_TIMEOUT选项是Socket的一个选项&#xff0c;用于设置读取数据的超时时间。它指定了在读取数据时等待的最长时间&#xff0c;如果在指定的时间内没有数据可读取&#xff0c;将抛出SocketTimeoutException异常。 SO_TIMEOUT的设置 默认情况下&#xff0c;SO_TIMEOUT选项的值…

引入echarts环形图及显示后端数据

实现效果&#xff1a; 1.下载echarts 并引用 npm install echarts --save 或 pnpm install -S echarts 项目中引用&#xff1a; 在项目main.ts中 import * as echarts from "echarts"; //引入echarts 3.页面中使用 <div id"main" class&quo…

近屿智能发布AIGC大模型工程师和产品经理学习路径图

近日&#xff0c;上海近屿智能科技有限公司&#xff08;下称“近屿智能”&#xff09;&#xff0c;基于其在大模型研发和产品设计领域深厚的专业积累&#xff0c;终于总结出AIGC大模型工程师与产品经理的学习路线图。该学习路线图不仅为追求专业发展的学习者提供了一条清晰明确…

从[redis:LinkedList]中学习链表

文章目录 adlistlistNodelistmacros[宏定义]listCreatelistInitNodelistEmptylistReleaselistAddNodeHeadlistLinkNodeHeadlistAddNodeTaillistLinkNodeTaillistInsertNodelistDelNodelistUlinkNodelistIndexredis3.2.100quicklistredis7.2.2quicklist redis的基本数据类型之一…