【Linux】【Vim】vim编辑器的用法
一、vim简介
Vim是一款功能强大且高度可定制的文本编辑器,广泛应用于Linux 和 Unix系统中。
它不仅继承了vi编辑器的所有特性,还增加了许多新的功能,如语法高亮、代码折叠、多级撤销等。
Vim有三种主要的工作模式:
- 命令模式(
Command Mode) - 插入模式(
Insert Mode) - 底线命令模式(
Command-Line Mode)
每种模式下可以执行不同的操作。
二、启动与退出
-
启动
启动Vim可以通过在终端输入vim或vim 文件名来实现。
如果文件不存在,Vim将创建一个新文件。 -
退出
退出Vim时,根据是否需要保存更改,可以选择以下命令之一:- 正常退出
:q:当文件没有被修改时,可以直接使用此命令退出 Vim。如果文件已经被修改但未保存,则会提示错误信息,不允许直接退出。:x或:wq:这两个命令是等价的,表示保存当前文件并退出。其中:w表示写入(保存),而:q表示退出。ZZ:这是另一种保存并退出的方式,相当于:wq,但是不需要输入冒号进入命令模式,而是直接按两次大写的Z键即可。
- 不保存退出
::q!:强制退出而不保存任何更改。这对于那些想要放弃所有未保存更改的情况非常有用。:ZQ:类似于:q! `的效果,即不保存变更强行退出。注意,这不是标准的 Vim 命令,但在某些版本中可用。
- 强制操作
::w!:当权限不足或其他原因导致无法正常保存时,可以尝试使用:w!来强制保存文件。::wq!或:x!:在遇到类似问题时,也可以通过这些命令来强制保存并退出19。::qa!:当在一个多窗口环境中工作时,可以使用该命令关闭所有窗口并且不保存任何更改地退出 Vim。
- 其他特殊情况
::e!:如果你打开了一个文件并进行了修改,但又想回到上一次保存的状态继续编辑,可以使用此命令重新加载未修改过的文件内容。::cq或:cquit:这将使 Vim 在退出时返回非零状态码,通常用于脚本编程中,以指示程序遇到了错误。
- 正常退出
三、模式切换
-
命令模式:这是启动Vim后的默认模式,在这里可以输入各种命令来导航、编辑文本。
-
插入模式:通过按i键进入此模式,在这里可以输入文本内容。要返回命令模式,只需按下
Esc键。 -
底线命令模式:在命令模式下按
:进入,用于输入更复杂的命令,如保存文件、退出等。
四、基本命令
4.1 光标移动
-
使用 方向键 或者
k(上)、j(下)、h(左)、l(右)来逐字符移动光标。 -
0或Home:移动到当前行的第一个非空白字符。 -
$或End:移动到当前行的最后一个字符。 -
gg:移动到文件的第一行; -
G:移动到最后一行; -
nG:移动到第n行。 -
[Ctrl] + f:向下翻页;[Ctrl] + b:向上翻页。
4.1 编辑文本
-
插入文本:
i、I、a、A、o、O分别表示在不同位置开始插入文本。 -
删除文本:
- 删除单个字符
x:删除光标所在字符X:删除光标前一个字符
- 删除单词或部分行
dw:删除从光标位置到下一个单词开头之间的所有内容。注意:不一定是删除整个单词db:删除从光标位置到上一个单词开头之间的所有内容。de:删除从光标位置到当前单词结尾的所有内容。dE:删除从光标位置到当前大写字母开头单词结尾的所有内容。d$:删除从光标位置到当前行末尾的所有内容。
- 删除整行或多行
dd:删除当前行。ndd:删除从当前行开始的n行(例如,5dd会删除接下来的五行)。dG:删除从当前行到文件最后一行的所有内容。d1G:删除从当前行到文件第一行的所有内容。:start,end d:删除指定范围内的行,其中start和end是起始和结束行号。例如,:3,7d将删除第3至第7行。
- 删除所有内容
ggdG:这是另一种快速删除整个文件内容的方法,首先将光标移动到文件顶部(gg),然后删除直到文件末尾(dG)。:%d:在底行模式下输入此命令也会删除文件中的所有行。:%s/./ /g或:%s/^.*$//g:使用替换命令将每一行的内容替换成空字符串
- 删除特定模式匹配的行
:g/pattern/d:删除所有包含pattern的行。这里pattern可以是一个正则表达式。:g!/pattern/d:删除所有不包含pattern的行。
- 其他删除操作
J:合并当前行与下一行,即删除两行间的换行符。D:删除光标后到行尾的所有内容,等同于d$。C:删除光标后的所有内容并进入插入模式,类似于c$。
- 使用可视模式进行删除
v:进入字符级别可视化模式,选择文本后按d删除。V:进入行级别可视化模式,选择多行后按d删除。Ctrl-v:进入块级别可视化模式,选择矩形区域后按d删除。
- 特殊情况下的删除
:g/^$/d:删除所有空行。:g/^#.*$/d:删除以#开头的所有行(通常为注释行)。
- 删除单个字符
-
复制粘贴:
yy:复制一行;p:粘贴到光标之后;P:粘贴到光标之前。
4.1 搜索替换
-
寻找字符串
/pattern:向光标之下寻找字符串pattern;?pattern:向光标之上查找。
-
重复搜索
n:重复前一次搜索;N:反向重复。
-
替换命令
- 格式为:
s/old/new/[g],其中g表示全局替换整个文件中的所有匹配项。
- 格式为:
五、高级功能
- 分屏操作:
:split:水平分割窗口;:vsplit: 垂直分割Ctrl+w:加 方向键 在多个窗口间切换。
- 宏录制:
qa:开始录制宏至寄存器a- 再次按
q:结束录制 @a:播放宏
- 配置文件:
.vimrc位于用户目录下,用于自定义Vim的行为设置及加载插件。
六、实用技巧
- 快速定位:
gg:跳转到文件开头G:跳转到结尾:n:跳转到第n行
- 代码折叠:
za:折叠/展开当前块zc:折叠zo:展开zR:展开所有zM:折叠所有
- 快速注释代码:
安装NERD Commenter插件后,- 使用
,+ci注释选中区域; ,+cu取消注释
- 使用
七、配置与定制(自定义配置)
每个用户都可以根据自己的需求创建或修改.vimrc文件(位于用户的主目录下),以实现个性化的设置。
例如,可以通过添加以下命令来自定义行号显示、启用语法高亮、设置缩进等:
set nu:显示行号set cursorline:突出显示当前行syntax on:开启语法高亮set tabstop=4 shiftwidth=4 expandtab:将Tab键替换为四个空格
此外,还可以安装各种插件来扩展Vim的功能,如自动补全工具YouCompleteMe、项目管理器NERDTree等。
八、插件管理
随着社区的发展,出现了许多优秀的Vim插件,它们可以帮助开发者更高效地完成任务。
为了方便管理和加载这些插件,推荐使用Vundle或者Plug等插件管理器。
安装后只需在.vimrc中列出所需的插件列表,并运行相应的安装命令即可快速安装并启用所需插件。
九、可视化模式(Visual Mode)
可视化模式是Vim的一个重要特性,它允许用户通过键盘选择文本,并对选定的文本块进行各种操作,如复制、剪切、删除、格式化等。
这一模式极大地提高了编辑效率,特别是对于需要频繁处理文本块的用户来说。
-
可视化模式概述
-
在
Vim中,可以通过如下命令进入可视化模式- 按下
v键:进入字符可视化模式(Characterwise visual mode), - 按下
V键:进入行可视化模式(Linewise visual mode), - 按住
Ctrl键并按下v键:进入块可视化模式(Blockwise visual mode)。
- 按下
-
进入了可视化模式,屏幕底部会显示相应的标识符以指示当前所处的模式:
--VISUAL--表示字符可视化模式--VISUAL LINE--表示行可视化模式--VISUAL BLOCK--则表示块可视化模式
-
-
字符可视化模式
字符可视化模式允许用户逐个字符地选择文本。
这对于选择短语、单词或句子非常有用。
用户可以使用 方向键 或 Vim中的导航命令(如w、b、e等)来扩展选择范围。
一旦选择了所需的文本,就可以应用各种编辑命令d:用于删除选中的文本y:用于复制选中的文本到寄存器中c:用于更改选中的文本
-
行可视化模式
行可视化模式是以行为单位选择文本的方式。
当用户想要移动、复制或删除整个行时,这种模式特别有用。
进入行可视化模式后,用户可以通过上下箭头或其他导航命令来选择多行文本。d命令:删除选中的行,y命令:复制选中的行,>和<命令:来增加或减少选中行的缩进
-
块可视化模式
块可视化模式允许用户选择矩形区域内的文本。
这对于表格数据的操作非常有用,比如同时编辑多列内容。
在块可视化模式下,用户可以选择一个矩形区域,然后执行诸如插入文本、删除文本或改变大小写等操作。
此外,还可以利用I命令在每行的相同位置插入文本,这对于批量编辑具有固定格式的数据非常方便。 -
其他有用的命令
除了基本的选择和编辑命令外,可视化模式还支持更多高级操作。:命令:可以在选中的文本范围内执行Ex命令,如排序、搜索替换等;J命令:可以将选中的行合并成一行;g?命令:可以对选中的文本应用ROT13编码/解码。gv命令:如果用户希望重新选择上一次高亮的文本区域,可以使用gv命令。
-
总之,
Vim的可视化模式为用户提供了一种直观且高效的方式来处理文本。
通过熟练掌握这些模式及其相关命令,用户可以在不需要离开键盘的情况下完成复杂的文本编辑任务,从而提高工作效率。
十一、多文件处理
Vim支持同时打开多个文件,并可以在不同文件之间轻松切换。
使用:split 或 :vsplit命令创建新的水平或垂直分割窗口来显示其他文件。
此外,还可以利用标签页(Tab Pages)管理多个文件,例如:tabnew filename用于在新标签中打开文件。
为了方便导航,可以通过:tabs查看所有打开的标签,或者使用gt/gT向前/向后切换标签。
在Linux环境下,Vim编辑器不仅支持对单个文件的编辑,还提供了强大的多文件处理功能。
通过使用缓冲区(buffer)、窗口(window)和标签页(tab),用户可以在同一个Vim会话中同时打开并编辑多个文件,极大地提高了工作效率。
以下是关于如何在Vim中进行多文件处理的具体介绍。
-
启动时打开多个文件
当您想要一次性打开多个文件时,可以直接在命令行中启动Vim,并将所有要编辑的文件名作为参数传递给它。例如:
- Vim启动并将这些文件加载到不同的缓冲区中,但默认情况下只会显示第一个文件的内容。
vim file1 file2 file3 - 如果您希望以分屏的方式同时查看多个文件,则可以使用-o或-O选项来分别实现水平或垂直分割窗口的效果:
vim -o file1 file2# 水平分屏
vim -O file1 file2# 垂直分屏 - 此外,还可以直接在命令行上使用
vimdiff命令来比较两个文件之间的差异,这对于代码审查或文档对比非常有用。
- Vim启动并将这些文件加载到不同的缓冲区中,但默认情况下只会显示第一个文件的内容。
-
在已启动的Vim中打开新文件
如果已经在Vim内部工作并且需要打开新的文件,可以通过以下几种方式之一完成::e filename命令:替换当前缓冲区中的内容为指定的新文件。:sp filename或:vsp filename命令:创建一个新的水平或垂直分割窗口,并在其中加载指定的文件。:tabedit filename命令:在一个新的标签页中打开文件。
-
文件间的切换与管理
一旦有多个文件被加载到了Vim中,可以利用一系列命令来进行快速切换和管理::ls:列出所有已经加载到内存中的缓冲区及其状态。:b<number>或:buffer <number>:根据编号选择特定的缓冲区进行编辑。Ctrl+^或:e#:在最近访问过的两个文件之间切换。:bn或:bp:向前或向后切换到下一个/前一个文件。Ctrl+w w:循环切换各个窗口。gt:切换到下一个标签页;gT: 则用于返回至上一个标签页。
-
缓冲区、窗口与标签页的关系
理解缓冲区、窗口以及标签页之间的关系对于有效利用Vim的多文件处理能力至关重要。简单来说:- 缓冲区是指Vim为每个打开的文件分配的一块内存空间,即使该文件没有显示在任何窗口中也存在相应的缓冲区。
- 窗口是屏幕上用来展示某个特定缓冲区内容的一个区域,同一时间可以有多个窗口显示不同或者相同的缓冲区。
- 标签页则是包含一组窗口的集合,允许用户在同一Vim实例内组织多个独立的工作环境。
十二、集成开发环境(IDE)特性
虽然Vim本身不是IDE,但它可以通过各种方式模拟IDE的行为。例如,结合ctags生成索引文件,以便快速查找函数定义;
或者使用cscope进行更复杂的源码分析。
另外,还有专门为特定编程语言设计的插件,如Python-mode、YouCompleteMe 等,它们为开发者提供了诸如智能感知、调试支持等功能。
十三、自定义与自动化
每个用户的编辑习惯都不尽相同,因此Vim允许高度个性化配置。
除了前面提到的.vimrc文件外,还可以设置快捷键映射、颜色主题、状态栏信息等内容。更重要的是,Vim脚本语言使得编写复杂任务变得可能,比如批量重命名变量、格式化代码等。对于经常重复的任务,可以编写宏录制下来,以便日后一键完成。
十四、搜索历史与命令行补全
14.1 搜索历史
Linux的Vim编辑器中,搜索历史命令是一个非常有用的功能,它允许用户回顾并重新使用以前执行过的搜索模式。
Vim提供了多种方式来访问和管理这些历史记录。
以下是关于如何查看、管理和使用Vim中的所有类型搜索历史命令的详细说明。
-
查看所有类型的搜索历史
:history all: 在命令行模式下输入此命令会列出所有的历史条目,包括命令行历史、搜索历史等。:history+ 类型: 在命令行模式下输入此命令只查看特定类型的历史记录:history c: 只查看命令行历史记录:history s: 只查看搜索历史记录
-
浏览和重复使用搜索历史
- 当您想要浏览之前执行过的搜索时,可以在普通模式下按
q/(向前搜索)或q?(向后搜索)来打开一个包含所有搜索历史的小窗口。
选择一项历史记录后按下回车键即可再次执行该搜索。 - 此外,在命令行模式中,您可以直接输入
/或?,然后通过上下箭头键来浏览搜索历史记录,并可以选择其中一个来执行。 - 如果您只是想快速地重复上一次的搜索,可以在普通模式下输入
n(查找下一个匹配项)或N(反向查找下一个匹配项)。
如果需要从命令行模式开始一个新的搜索但又不想丢失当前光标位置,可以先输入/或?再按回车键,然后使用上下箭头键选择之前的搜索模式。
- 当您想要浏览之前执行过的搜索时,可以在普通模式下按
-
使用快捷键访问历史
对于更高效的搜索历史访问,可以利用一些快捷键组合。-
例如,在命令行模式下,您可以按
Ctrl-P(向上导航)或Ctrl-N(向下导航)来滚动浏览历史命令列表。
这种方法特别适合于那些经常重复相同或相似命令的场景。 -
另外,如果您正在寻找特定的命令或搜索模式,可以在命令行模式下输入部分字符串,然后按
Ctrl-R以启动增量式搜索,这将帮助您更快地定位到所需的命令或搜索模式。
-
-
配置历史选项
- 为了更好地控制历史记录的行为,可以通过设置history选项来调整保存的历史条目数量。
默认情况下,Vim会记住最近50个命令和搜索历史条目。
如果您希望增加这个数目,可以在.vimrc文件中添加如下配置:
set history=1000 " 保持1000个命令和搜索的历史记录 - 此外,还可以通过修改
viminfo文件中的相应参数来持久化历史记录,即使关闭了Vim之后也能保留下来。 - 请注意,更改
.viminfo文件的内容可能会影响其他与历史相关的功能,因此建议谨慎操作。
- 为了更好地控制历史记录的行为,可以通过设置history选项来调整保存的历史条目数量。
14.2 命令行补全
Vim提供了多种命令行补全的功能,可以极大地提高用户的编辑效率。
Vim的命令行补全不仅限于简单的文件名或路径补全,还包括关键字、字典、标签等多种类型的补全。
以下是关于Vim命令行补全的一些详细介绍:
-
基本命令行补全
在Vim的命令行模式下(即输入:后),用户可以通过按下Tab键来实现基本的命令补全。
这种补全方式适用于命令、文件名和目录名等。
如果当前输入的部分有多个可能的匹配项,连续按两次Tab键将会列出所有可能的匹配项。
然而,默认情况下,这种方式不会显示所有匹配的命令或文件名。
为了改进这一点,可以在$HOME/.vimrc配置文件中添加一行设定:
set wildmode=list:longest
这将使得当用户输入部分命令或文件名并按下Tab键时,Vim会尝试列出所有可能的匹配项,并展示最长的公共前缀。 -
更高级的命令行补全
除了基本的补全外,Vim还支持更复杂的命令行补全,比如整行补全、根据当前文件中的关键字补全、字典补全、同义词字典补全等。
这些补全可以通过特定的快捷键组合触发,例如:- 整行补全:
Ctrl-X Ctrl-L用于查找并补全与当前行相似的其他行。 - 关键字补全:
Ctrl-X Ctrl-N用于从当前文件中查找匹配的关键字;而Ctrl-X Ctrl-P则是向前查找关键字。 - 字典补全:
Ctrl-X Ctrl-K允许用户定义一个字典文件,从中查找匹配的单词。 - 同义词字典补全:
Ctrl-X Ctrl-T用于基于用户提供的同义词库进行补全。 - 文件名补全:
Ctrl-X Ctrl-F用于补全文件路径和文件名。
- 整行补全:
-
自定义补全设置
- 为了更好地适应个人的工作流程,用户还可以自定义Vim的补全行为。
例如,通过修改
.vimrc文件中的选项,如complete、dictionary、thesaurus等,以指定不同的补全来源。 - 此外,还可以利用插件如
YouCompleteMe来增强代码补全的能力,特别是对于编程语言的支持。
- 为了更好地适应个人的工作流程,用户还可以自定义Vim的补全行为。
-
配合Zsh使用
- 值得注意的是,在某些情况下,Vim的命令行补全可能会与
shell环境下的命令补全混淆。
例如,在Zsh环境下,用户可以通过安装zsh-autosuggestions插件来获得更加智能的命令建议,包括对Vim命令的支持。
这意味着即使是在终端外部,用户也能享受到类似于Vim内部的高效命令补全体验。
- 值得注意的是,在某些情况下,Vim的命令行补全可能会与
-
综上所述
- Vim提供了丰富的命令行补全机制,无论是简单的文件名补全还是复杂的代码片段补全,都能满足不同场景下的需求。
通过适当的配置和工具集成,用户可以显著提升在Vim中的工作流效率。
- Vim提供了丰富的命令行补全机制,无论是简单的文件名补全还是复杂的代码片段补全,都能满足不同场景下的需求。
14.3 与Shell交互
有时需要在不离开Vim的情况下运行外部命令。
- 这时可以使用
!command的形式直接调用shell命令,结果将被显示在屏幕上。
如果想要把输出插入到当前缓冲区,则可以在命令前加上r,如:r !ls会将当前目录下的文件列表插入光标位置。 - 另一个有用的特性是能够在后台启动进程而不阻塞Vim界面,这对于长时间运行的任务特别有用。
Vim编辑器与Shell之间的交互是Linux系统管理员和开发者日常工作中非常重要的技能之一。
这种交互可以通过多种方式实现,不仅提高了工作效率,还能简化复杂的任务处理流程。
下面我们将深入探讨几种常见的Vim与Shell交互的方式。
-
在Vim中执行Shell命令
-
在Vim中可以直接执行Shell命令而无需退出编辑器。
这可以通过使用!字符来完成,它允许你在不离开Vim的情况下运行外部命令。例如,如果你想检查当前的时间或日期,可以在命令模式下输入如下命令:
:!date
执行后,屏幕上会显示当前的日期和时间;按回车键即可返回到原来的编辑位置继续工作。 -
此外,你还可以创建一个临时的shell会话,在其中连续运行多个Unix命令,而不必每次都回到Vim编辑状态。
要创建这样的shell会话,可以使用:sh或者:shell命令。
当你完成所有需要的操作并准备返回Vim时,只需按下Ctrl-D或 输入exit命令即可。
-
-
将Shell命令输出插入到文件中
-
有时候我们可能希望将某个命令的结果直接插入到正在编辑的文件里。
为此,Vim提供了:r !command语法,用于读取命令的标准输出并将结果追加到当前行之后。比如,要获取目录列表并将其添加到文档末尾,可以这样做:
:r !ls -l -
同样地,如果想要对特定范围内的行应用某些过滤器(如排序),你可以指定行号范围加上!符号后跟上相应的命令。
例如,要对第96至99行的内容进行排序,可以使用以下命令:
:96,99!sort
-
-
** 使用Ctrl-Z挂起Vim进程**
- 另一种方便的方法是在编辑过程中暂时将Vim放到后台,以便能够快速切换到shell环境中执行其他任务。
要做到这一点,只需要在普通模式下按Ctrl-Z组合键即可。
之后就可以自由地在shell提示符下操作了。
当再次需要恢复Vim会话时,只要简单地输入fg命令就能让Vim重新回到前台
- 另一种方便的方法是在编辑过程中暂时将Vim放到后台,以便能够快速切换到shell环境中执行其他任务。
-
Shell脚本变量的编辑
-
对于编写Shell脚本来说,利用Vim的强大功能来进行文本编辑是非常有帮助的。
由于Shell脚本本质上就是一系列命令组成的文本文件,因此我们可以像对待普通文本那样对其进行修改。例如,当我们需要批量替换某个变量名时,可以使用Vim内置的搜索替换功能,即
:%s/old_variable/new_variable/g命令。
这将在整个文件范围内查找并替换所有的匹配项。 -
另外,如果你经常需要处理类似的变更,还可以考虑为Vim配置一些自定义映射或宏,以加速重复性工作的完成。
例如,设置一个快捷键专门用来插入常用的环境变量声明等。
-
综上所述,通过上述几种方法,我们可以看到Vim不仅仅是一个简单的文本编辑工具,更是一个强大的集成开发环境,尤其是在结合Shell编程时展现出了极大的灵活性和实用性。
十六、文档帮助
最后但同样重要的是,Vim内置了一个详尽的帮助系统。
只需输入:help topic就能获取关于几乎任何主题的帮助文档。
这个内嵌的帮助不仅涵盖了基本命令,还包括了对插件的支持说明和其他高级话题。
十七、总结
综上所述,Vim不仅仅是一个简单的文本编辑器,它更像是一个可以根据个人需求灵活调整的工作平台。
随着经验的增长,你会发现越来越多的方法来优化你的工作流程,无论是通过学习新的快捷键组合还是探索社区提供的丰富资源。
相关文章:
【Linux】【Vim】vim编辑器的用法
一、vim简介 Vim是一款功能强大且高度可定制的文本编辑器,广泛应用于Linux 和 Unix系统中。 它不仅继承了vi编辑器的所有特性,还增加了许多新的功能,如语法高亮、代码折叠、多级撤销等。 Vim有三种主要的工作模式: 命令模式&am…...
Golang Gin系列-3:Gin Framework的项目结构
在Gin教程的第3篇,我们将讨论如何设置你的项目。这不仅仅是把文件扔得到处都是,而是要对所有东西的位置做出明智的选择。相信我,这些东西很重要。如果你做得对,你的项目会更容易处理。当你以后不再为了找东西或添加新功能而绞尽脑…...
LabVIEW实车四轮轮速信号再现系统
开发了一个基于LabVIEW的实车四轮轮速信号再现系统。该系统解决现有电机驱动传感器成本高、重复性差、真实性差和精度低等问题,提供一种高精度、低成本的轮速信号再现解决方案。 项目背景 ABS轮速传感器在现代汽车安全系统中发挥着至关重要的作用。为保证其准确性和…...
2025.1.16——六、BabySQL 双写绕过|联合注入
题目来源:buuctf [极客大挑战 2019]BabySQL 1 目录 一、打开靶机,分析已知信息 二、手工注入解题 step 1:万能密码 step 2:正常注入,判断字段数 step 3:绕过 step 4:查数据库 step 5&am…...
Spring Boot 下的Swagger 3.0 与 Swagger 2.0 的详细对比
先说结论: Swgger 3.0 与Swagger 2.0 区别很大,Swagger3.0用了最新的注释实现更强大的功能,同时使得代码更优雅。 就个人而言,如果新项目推荐使用Swgger 3.0,对于工具而言新的一定比旧的好;对接于旧项目原…...
【已解决】git clone报错:Failed to connect to github.com port 443: Timed out
1.问题原因1 报错信息1: fatal: unable to access https://github.com/microsoft/xxx/: Failed to connect to github.com port 443: Timed out 报错信息2: fatal: unable to access https://github.com/xxx/xx/: OpenSSL SSL_read: Connection was …...
Qt 程序 DPI 适配方法归纳
方案1:通过 Windows api 处理 缺点:放大之后界面会模糊。 通过调用api实现 #include <ShellScalingAPI.h> #pragma comment(lib, "Shcore.lib")HRESULT hr SetProcessDpiAwareness(PROCESS_SYSTEM_DPI_AWARE);或者使用qt.conf 实现 在…...
AI刷题-小R的随机播放顺序、不同整数的计数问题
目录 一、小R的随机播放顺序 问题描述 测试样例 解题思路: 问题理解 数据结构选择 算法步骤 最终代码: 运行结果: 二、 不同整数的计数问题 问题描述 测试样例 解题思路: 问题理解 数据结构选择 算法步骤 最终…...
windows 极速安装 Linux (Ubuntu)-- 无需虚拟机
1. 安装 WSL 和 Ubuntu 打开命令行,执行 WSL --install -d ubuntu若报错,则先执行 WSL --update2. 重启电脑 因安装了子系统,需重启电脑才生效 3. 配置 Ubuntu 的账号密码 打开 Ubuntu 的命令行 按提示,输入账号,密…...
【影刀_常规任务计划_API调用】
影刀_常规任务计划 1、在常规任务计划被关闭或者设置了定时任务的情况下(非手动执行),通过API的方式启动任务,任务仍然可以被正常执行。 2、如果在常规任务计划里面应用中填写的参数的话, 如果通过api执行ÿ…...
参数校验 Spring Validation框架
后端参数校验 解决:校验前端传入的参数是否符合预期 1、引入依赖 使用Spring Validation框架 <!-- validation参数校验框架--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validatio…...
Spring Boot 基础入门指南
Spring Boot 基础入门指南 引言 在当今快速发展的软件行业中,开发者们一直在寻找简化应用程序开发的方法。Spring Boot 应运而生,它旨在帮助开发者快速构建基于Spring框架的应用程序,同时尽可能减少配置工作。本文将带您了解Spring Boot的基…...
doc、pdf转markdown
国外的一个网站可以: Convert A File Word, PDF, JPG Online 这个网站免费的,算是非常厚道了,但是大文件上传多了之后会扛不住 国内的一个网站也不错: TextIn-AI智能文档处理-图像处理技术-大模型加速器-在线免费体验 https://…...
基于 HTML5 Canvas 制作一个精美的 2048 小游戏--day 1
基于 HTML5 Canvas 制作一个精美的 2048 小游戏 在这个快节奏的生活中,简单而富有挑战性的游戏总能给我们带来乐趣。2048 是一款受欢迎的益智游戏,不仅考验智力,还能让人回味无穷。今天,我带领大家将一起学习如何使用 HTML5 Canv…...
知识图谱入门(一)
最近在研究Graph RAG项目,因此对相关内容做个总结,首先从知识图谱开始,供大家参考。 知识图谱是结构化知识表示的一种形式,它将知识组织成一个多关系图,其中节点表示实体,边表示实体之间的关 系。知识图谱…...
springboot项目-基础数据回显
一.基础数据回显说明 微服务项目中由于从服务独立的角度考虑,对数据库做了分库的处理。对于基础数据表来说,各个服务都是需要的。项目中在使用基础数据时,往往是在sql中写连接然后获取基础数据的名称。例: select wi.name,bc.ci…...
LabVIEW实现油浸式变压器自主监测与实时报告
油浸式变压器广泛应用于电力系统中,尤其是在电力传输和分配领域。为了确保变压器的安全、稳定运行,及时监测其工作状态至关重要。传统的变压器监测方法通常依赖人工巡检和定期检查,但这不能及时发现潜在的故障隐患,且效率较低。随…...
K8S 亲和性与反亲和性 深度好文
今天我们来实验 pod 亲和性。官网描述如下: 假设有如下三个节点的 K8S 集群: k8s31master 是控制节点 k8s31node1、k8s31node2 是工作节点 容器运行时是 containerd 一、镜像准备 1.1、镜像拉取 docker pull tomcat:8.5-jre8-alpine docker pull nginx…...
关于php语言api接口开发的流程
确定接口需求:首先明确接口的功能和需求,包括输入参数、输出结果以及接口的业务逻辑。 设计接口路由:根据接口需求,设计具体的接口路由,即URL路径,用于访问接口。 搭建PHP环境:确保你的服务器上…...
医疗集群系统中基于超融合数据库架构的应用与前景探析
一、引言 1.1 研究背景与意义 随着医疗信息化的飞速发展,医疗数据呈爆炸式增长。从日常诊疗记录、患者病历,到各类医疗影像、检查检验数据等,海量信息不断涌现。据统计,医疗数据的年增长率高达 30% 以上 ,2025 年,全球医疗数据量将达到 2314 艾字节(EB)。如此庞大的数…...
(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...
LRU 缓存机制详解与实现(Java版) + 力扣解决
📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...
人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent
安全大模型训练计划:基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标:为安全大模型创建高质量、去偏、符合伦理的训练数据集,涵盖安全相关任务(如有害内容检测、隐私保护、道德推理等)。 1.1 数据收集 描…...
解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...
Vue ③-生命周期 || 脚手架
生命周期 思考:什么时候可以发送初始化渲染请求?(越早越好) 什么时候可以开始操作dom?(至少dom得渲染出来) Vue生命周期: 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...
十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建
【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...
