『运维备忘录』之 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 |
| q | 停止录制宏 |
| @a | 执行宏 a |
| @@ | 重新执行上次执行的宏 |
实例说明:
假设文件包含以下内容:
Hello world
My name is Vim
I am an editor
先在你想在每行末尾添加“!”号。为此,可以使用宏来录制和重放该命令,对于多文本和内容较多的文本操作有很大的帮助。通过以下步骤录制宏:
- 将光标置于第一行末尾的单词
- 键入“qa”来启动录制宏,并按下“A!”向光标所在位置添加“!”号
- 按下“j”将光标移动到下一行
- 按下“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
更多小技巧欢迎大家在评论区分享,让我们一起努力,谢谢大家。
相关文章:
『运维备忘录』之 Vim 命令详解
运维人员不仅要熟悉操作系统、服务器、网络等只是,甚至对于开发相关的也要有所了解。很多运维工作者可能一时半会记不住那么多命令、代码、方法、原理或者用法等等。这里我将结合自身工作,持续给大家更新运维工作所需要接触到的知识点,希望大…...
Gcc多版本安装和切换
添加本地source sudo add-apt-repository ppa:ubuntu-toolchain-r/test sudo apt-get update安装 gcc9 和 g9(ubuntu18.04) sudo apt-get install gcc-9 gcc-9-multilib g-9 g-9-multilib安装 gcc13 和 g13(ubuntu22.04) sudo …...
【python】OpenCV—Tracking(10.1)
学习来自《Learning OpenCV 3 Computer Vision with Python》Second Edition by Joe Minichino and Joseph Howse 文章目录 检测移动的目标涉及到的 opencv 库cv2.GaussianBlurcv2.absdiffcv2.thresholdcv2.dilatecv2.getStructuringElementcv2.findContourscv2.contourAreacv2…...
计算机网络(复习资料)
1.互联网的两个重要基本特点 连通性和共享性 2.计算机网络由若干节点和连接这些节点的链路组成 3.有多个网络通过路由器相互连接起来,构成一个更大的计算机网络称为互联网 4.网络把许多计算机连接在一起,互联网把许多网络通过一些路由器连接在一起,与网络相连的计算机称为…...
AIGC技术讲解以及应用的落地
简介 近期,火爆的“AI绘画”、图片转AI图,智能聊天软件ChatGPT,引起了人们广泛关注。人工智能潜力再次被证明,而这三个概念均来自同一个领域:AIGC。AIGC到底是什么?为什么如此引人关注?AIGC能产…...
Unity_ShaderGraph示例项目启动
Unity_ShaderGraph示例项目启动 大前提不变:URP模板,Unity2023.1.19使用 Shader Graph - Unity 手册Shader Graph 是一个工具,能够让您直观地构建着色器。您可以在图形框架中创建并连接节点,而不必手写代码。Shader Graph 提供了能反映所作更改的即时反馈,对于不熟悉着色…...
【Eclipse平台】1Eclipse平台总体概览
Eclipse平台总览 欢迎来到【Eclipse平台系列】,本文介绍Eclipse平台的总体概览 文章目录 Eclipse平台总览1. 什么Eclipse开放的架构2. 如何下载Eclipse3. Eclipse的命名规则3. Eclipse的构成3.1 Workbench1. 什么Eclipse Eclipse是一个流行的集成开发环境(Integrated Devel…...
Dijkstra求最短路 I
题目 给定一个n个点m条边的有向图,图中可能存在重边和自环,所有边权均为正值。 请你求出1号点到n号点的最短距离,如果无法从1号点走到n号点,则输出−1。 输入格式: 第一行包含整数n和m。 接下来m行,每…...
复习单向,双向链表,并且实现两种链表的增加和删除功能。
单链表头插 Linklist insert_head(datatype element,Linklist head) {//创建新节点 Linklist screate_node();if(NULLs)return head; s->dataelement;//1,判断链表为空if(NULLhead){heads;}else //链表不为空{s->nexthead;heads;}return head; } 单链表尾插 Linklist …...
【webpack】技巧使用
webpack和TypeScript 安装webpack相关内容安装TS相关内容配置初始化数据初始化运行展示和目录展示报错解决(缺失文件配置) 安装前端必备神奇lodash测试一下entry配置index.html模板配置修改打包出来的index.html的titleinject注入chunks 属性多页面配置 …...
windows 谷歌浏览器Chrome 怎么禁止更新
1.首先把任务管理器里的谷歌浏览器程序结束: (鼠标在任务栏右击,出现任务管理器) 2.windowr,输入services.msc 带有Google Update的服务,选择禁用。 3.windowr,输入taskschd.msc 任务计划程序…...
力扣(leetcode)第349题两个数组的交集(Python)
349.两个数组的交集 题目链接:349.两个数组的交集 给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 示例 1: 输入:nums1 [1,2,2,1], nums2 [2,2] 输出…...
python Flask 写一个简易的 web 端程序(附demo)
python Flask 写一个简易的 web 端程序 (附demo) 介绍简单介绍装饰器 app.route("/") 进阶增加接口设置端口 静态网页核心代码完整代码 介绍 Flask 是一个用于构建 Web 应用程序的轻量级 Python Web 框架。它设计简单、易于学习和使用&#x…...
mysql问题
面试官:MySQL中,如何定位慢查询? 候选人: 嗯~,我们当时做压测的时候有的接口非常的慢,接口的响应时间超过了2秒以上,因为我们当时的系统部署了运维的监控系统Skywalking ,在展示的报表中可以看…...
iframe通信,window.postMessage父子项目数据通信
父 > 子 父项目 <iframe:src"cockpitUrl"id"cockpitIframe"load"handleLoad" ></iframe>// 向子系统传递数据(注意要再iframe的load中注册,保证iframe已经加载完成,这样子项目才能监听到&…...
ES6中新增Array.from()函数的用法详解
目录 Map对象的转换 Set对象的转换 字符串的转换 类数组对象的转换 Array.from可以接受三个参数 ES6为Array增加了from函数用来将其他对象转换成数组。当然,其他对象也是有要求,也不是所有的,可以将两种对象转换成数组。 1、部署了Iter…...
Camera2+OpenGL ES+MediaCodec+AudioRecord实现录制音视频写入H264 SEI数据
记录一下学习过程,得到一个需求是基于Camera2OpenGL ESMediaCodecAudioRecord实现录制音视频。 需求: 在每一帧视频数据中,写入SEI额外数据,方便后期解码时获得每一帧中的自定义数据。点击录制功能后,录制的是前N秒至…...
C语言笔试题之反转链表(头插法)
实例要求: 1、给定单链表的头节点 head ;2、请反转链表;3、最后返回反转后的链表; 案例展示: 实例分析: 1、入参合理性检查,即head ! NULL || head->next ! NULL;2、while循环…...
WEB3:互联网发展的新时代
随着科技的飞速发展,互联网已从最初的信息交流平台发展为涵盖了工作、生活、娱乐、教育等众多领域的复杂系统。我们将其称之为“WEB3”,这个名称是对互联网新时代的高度概括,标志着我们已经迈入了WEB3时代。 在WEB3时代,互联网将…...
c语言:贪吃蛇的实现
目录 贪吃蛇实现的技术前提: Win32 API介绍 控制台程序(console) 控制台屏幕上的坐标 GetStdHandle GetConsoleCursorInfo CONSOLE_CURSOR_INFO SetConsoleCursorInfo SetConsoleCursorPosition GetAsyncKeyState 宽字符的打印 …...
7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器
一、原理介绍 传统滑模观测器采用如下结构: 传统SMO中LPF会带来相位延迟和幅值衰减,并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF),可以去除高次谐波,并且不用相位补偿就可以获得一个误差较小的转子位…...
云原生周刊:k0s 成为 CNCF 沙箱项目
开源项目推荐 HAMi HAMi(原名 k8s‑vGPU‑scheduler)是一款 CNCF Sandbox 级别的开源 K8s 中间件,通过虚拟化 GPU/NPU 等异构设备并支持内存、计算核心时间片隔离及共享调度,为容器提供统一接口,实现细粒度资源配额…...
门静脉高压——表现
一、门静脉高压表现 00:01 1. 门静脉构成 00:13 组成结构:由肠系膜上静脉和脾静脉汇合构成,是肝脏血液供应的主要来源。淤血后果:门静脉淤血会同时导致脾静脉和肠系膜上静脉淤血,引发后续系列症状。 2. 脾大和脾功能亢进 00:46 …...
项目进度管理软件是什么?项目进度管理软件有哪些核心功能?
无论是建筑施工、软件开发,还是市场营销活动,项目往往涉及多个团队、大量资源和严格的时间表。如果没有一个系统化的工具来跟踪和管理这些元素,项目很容易陷入混乱,导致进度延误、成本超支,甚至失败。 项目进度管理软…...
