当前位置: 首页 > news >正文

【Linux】【Vim】vim编辑器的用法

一、vim简介

Vim是一款功能强大且高度可定制的文本编辑器,广泛应用于LinuxUnix系统中。
它不仅继承了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(右)来逐字符移动光标。

  • 0Home:移动到当前行的第一个非空白字符。

  • $End:移动到当前行的最后一个字符。

  • gg:移动到文件的第一行;

  • G:移动到最后一行;

  • nG:移动到第n行。

  • [Ctrl] + f:向下翻页;[Ctrl] + b:向上翻页。

4.1 编辑文本

  • 插入文本iIaAoO分别表示在不同位置开始插入文本。

  • 删除文本

    • 删除单个字符
      • 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内部工作并且需要打开新的文件,可以通过以下几种方式之一完成:

    • :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文件的内容可能会影响其他与历史相关的功能,因此建议谨慎操作。

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文件中的选项,如completedictionarythesaurus等,以指定不同的补全来源。

    • 此外,还可以利用插件如YouCompleteMe来增强代码补全的能力,特别是对于编程语言的支持。
  • 配合Zsh使用

    • 值得注意的是,在某些情况下,Vim的命令行补全可能会与shell环境下的命令补全混淆。
      例如,在Zsh环境下,用户可以通过安装zsh-autosuggestions插件来获得更加智能的命令建议,包括对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重新回到前台
  • Shell脚本变量的编辑

    • 对于编写Shell脚本来说,利用Vim的强大功能来进行文本编辑是非常有帮助的。
      由于Shell脚本本质上就是一系列命令组成的文本文件,因此我们可以像对待普通文本那样对其进行修改。

      例如,当我们需要批量替换某个变量名时,可以使用Vim内置的搜索替换功能,即 :%s/old_variable/new_variable/g 命令。
      这将在整个文件范围内查找并替换所有的匹配项。

    • 另外,如果你经常需要处理类似的变更,还可以考虑为Vim配置一些自定义映射或宏,以加速重复性工作的完成。

      例如,设置一个快捷键专门用来插入常用的环境变量声明等。

综上所述,通过上述几种方法,我们可以看到Vim不仅仅是一个简单的文本编辑工具,更是一个强大的集成开发环境,尤其是在结合Shell编程时展现出了极大的灵活性和实用性。

十六、文档帮助

最后但同样重要的是,Vim内置了一个详尽的帮助系统。
只需输入:help topic就能获取关于几乎任何主题的帮助文档。
这个内嵌的帮助不仅涵盖了基本命令,还包括了对插件的支持说明和其他高级话题。

十七、总结

综上所述,Vim不仅仅是一个简单的文本编辑器,它更像是一个可以根据个人需求灵活调整的工作平台。
随着经验的增长,你会发现越来越多的方法来优化你的工作流程,无论是通过学习新的快捷键组合还是探索社区提供的丰富资源。

相关文章:

【Linux】【Vim】vim编辑器的用法

一、vim简介 Vim是一款功能强大且高度可定制的文本编辑器&#xff0c;广泛应用于Linux 和 Unix系统中。 它不仅继承了vi编辑器的所有特性&#xff0c;还增加了许多新的功能&#xff0c;如语法高亮、代码折叠、多级撤销等。 Vim有三种主要的工作模式&#xff1a; 命令模式&am…...

RabbitMQ实现延迟消息发送——实战篇

在项目中&#xff0c;我们经常需要使用消息队列来实现延迟任务&#xff0c;本篇文章就向各位介绍使用RabbitMQ如何实现延迟消息发送&#xff0c;由于是实战篇&#xff0c;所以不会讲太多理论的知识&#xff0c;还不太理解的可以先看看MQ的延迟消息的一个实现原理再来看这篇文章…...

《leetcode-runner》【图解】【源码】如何手搓一个debug调试器——架构

前文&#xff1a; 《leetcode-runner》如何手搓一个debug调试器——引言 文章目录 设计引入为什么这么设计存在难点1. 环境准备2. 调试程序 仓库地址&#xff1a;leetcode-runner 本文主要聚焦leetcode-runner对于debug功能的整体设计&#xff0c;并讲述设计原因以及存在的难点…...

G1原理—10.如何优化G1中的FGC

大纲 1.G1的FGC可以优化的点 2.一个bug导致的FGC(Kafka发送重试 subList导致List越来越大) 3.为什么G1的FGC比ParNew CMS要更严重 4.FGC的一些参数及优化思路 1.G1的FGC可以优化的点 (1)FGC的基本原理 (2)遇到FGC应该怎么处理 (3)应该如何操作来规避FGC (4)应该如何操…...

【专题一 递归】21. 合并两个有序链表

1.题目解析 2.讲解算法原理 解法:递归-> 重复的子问题 重复子问题 ->函数头的设计 合并两个有序链表--->Node dfs(l1&#xff0c;l2) 只关心某一个子问题在做什么事情 ->函数体的设计 比大小l1→next dfs( l1.next, l2)return l1 递归的出口 if(l1null)return l2…...

WebSocket——推送方案选型

一、前言&#xff1a;为何需要服务端主动推送&#xff1f; 在现代应用中&#xff0c;很多功能都依赖于“消息推送”。比如&#xff1a; 小红点提醒&#xff1a;我们经常在手机应用里看到的一个小红点提示&#xff0c;表示有新的消息或任务需要我们关注。新消息提醒&#xff1…...

Openresty 安装

1&#xff0e; 依赖包安装&#xff1a; # yum install readline-devel pcre-devel openssl-devel 2. 在系统中添加openresty的仓库&#xff1a; # sudo yum install yum-utils # sudo yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo …...

回归预测 | MATLAB实TCN时间卷积神经网络多输入单输出回归预测

效果一览 基本介绍 回归预测 | MATLAB实TCN时间卷积神经网络多输入单输出回归预测 …………训练集误差指标………… 1.均方差(MSE)&#xff1a;166116.6814 2.根均方差(RMSE)&#xff1a;407.5741 3.平均绝对误差&#xff08;MAE&#xff09;&#xff1a;302.5888 4.平均相对…...

TikTok专线服务器助力品牌营销新高度

在这个信息爆炸的时代&#xff0c;短视频平台如雨后春笋般涌现&#xff0c;TikTok便是其中的佼佼者。众多品牌纷纷涌入这个平台&#xff0c;试图借助其强大的用户基础和传播能力来提升知名度。而在这其中&#xff0c;IPIPGO直播专线的出现&#xff0c;为品牌在TikTok上的营销提…...

flutter VoidCallBack ValueChange<T> 的函数定义

在 Flutter 中,VoidCallback 和 ValueChanged<T> 是两种常用的回调函数类型,它们通常用于处理事件或传递数据。下面是它们的详细定义及使用方式。 1. VoidCallback 函数类型 VoidCallback 是一个没有参数也没有返回值的回调函数类型。它通常用于简单的事件处理,比如…...

pyspark连接clickhouse数据库的方式(其它数据库同样适用)

目录 一、背景简记二、pyspark连接clickhouse方式记录三、结语参考学习博文 一、背景简记 实际工作中&#xff0c;大部分所用的数据存储地址都是在数据库中&#xff0c;如我司现在常用的数据库是clickhouse&#xff0c;相关数据的统计分析都在此上操作。如果想用pyspark连接cl…...

当父级元素设置了flex 布局 ,两个子元素都设置了flex :1, 但是当子元素放不下的时候会溢出父元素怎么解决 (css 样式问题)

一、问题 遇到个样式问题&#xff0c;当父级元素设置了flex 布局 &#xff0c;两个子元素都设置了flex :1, 但是当子元素放不下的时候会溢出父元素怎么解决 &#xff08;拖拽浏览器 使页面变小&#xff09; 二、解决方法 .father{min-height: 600px;width: 100%;display: flex…...

软件方法论--课程笔记(整理中)

C1&#xff1a;概览Introduction &#xff08;1&#xff09;软件的4个特性 一致性&#xff08;Conformity&#xff09;&#xff1a;软件必须符合严格的规格和要求&#xff0c;包括与其他组件的接口和环境的连接&#xff0c;避免因为不一致导致无法复用或开发问题。 不可见性…...

从 0 开始实现一个 SpringBoot + Vue 项目

从 0 开始实现一个 SpringBoot Vue 项目 从 0 开始实现一个 SpringBoot Vue 项目 软件和工具创建 SpringBoot 后端项目创建 MySQL 数据库配置文件实现增删改查接口 Model 层mapper 层service 层controller 层测试 实现项目功能接口 代码测试 创建 Vue 前端 安装 Node.js配置…...

怎么修复损坏的U盘?而且不用格式化的方式!

当你插入U盘时&#xff0c;若电脑弹出“需要格式化才能使用”提示&#xff0c;且无法打开或读取其中的数据&#xff0c;说明U盘极有可能已经损坏。除此之外&#xff0c;若电脑在连接U盘后显示以下信息&#xff0c;也可能意味着U盘出现问题&#xff0c;需要修复损坏的U盘&#x…...

使用redis-cli命令实现redis crud操作

项目场景&#xff1a; 线上环境上redis中的key影响数据展示&#xff0c;需要删除。但环境特殊没办法通过 redis客户端工具直连。只能使用redis-cli命令来实现。 操作步骤&#xff1a; 1、确定redis安装的服务器&#xff1b; 2、找到redis的安装目录下 ##找到redis安装目…...

Kibana 控制台中提供语义、向量和混合搜索

作者&#xff1a;来自 Elastic Mark_Laney 想要将常规 Elasticsearch 查询与新的 AI 搜索功能结合起来吗&#xff1f;那么&#xff0c;你不需要连接到某个第三方的大型语言模型&#xff08;LLM&#xff09;吗&#xff1f;不。你可以使用 Elastic 的 ELSER 模型来改进现有搜索&a…...

设计模式-结构型-装饰器模式

装饰器模式&#xff08;Decorator Pattern&#xff09;是结构型设计模式中的一种&#xff0c;它允许你通过将对象封装在一个新的对象中&#xff0c;来动态地添加新的功能&#xff0c;而无需改变原对象的结构。装饰器模式的核心思想是“将功能附加到对象上”&#xff0c;它是一种…...

CAP:Serverless + AI 让应用开发更简单

AI 已被广泛视为推动行业进步的关键力量&#xff0c;其在各行业的落地步伐加快。企业在构建 AI 应用开发过程中经常会面临 AI 技术门槛过高、试错周期过长、GPU 资源昂贵且弹性能力不足、缺乏配套工具、业务与模型的开发运维过于割裂、缺乏定制化能力等挑战&#xff0c;成为企业…...

Redis超详细入门教程(基础篇)

目录 一、什么是Redis 二、安装Redis 1、Windows系统安装 2、Linux系统安装 三、Redis通用命令 四、Redis基本命令 五、五种数据结构类型 5.1、String类型 5.2、List集合类型 5.3、Set集合类型 5.4、Hash集合类型 5.5、Zset有序集合类型 六、总结 一、什么是Redi…...

对话 TDengine 解决方案中心总经理陈肃:构建技术与市场的桥梁

TD 小T导读 他是大数据领域的杰出专家&#xff0c;拥有超过十项一作发明专利&#xff0c;是中国通信行业标准《大数据 消息中间件技术要求与测试方法》的重要编写者&#xff0c;并凭借数据中间件领域的突出成就荣获 2019 年“CJK OSS Award”。他是腾讯云 TVP 专家和 TGO 鲲鹏会…...

Formality:参考设计/实现设计以及顶层设计

相关阅读 Formalityhttps://blog.csdn.net/weixin_45791458/category_12841971.html?spm1001.2014.3001.5482​​​ Formality存在两个重要的概念&#xff1a;参考设计/实现设计和顶层设计&#xff0c;本文就将对此进行详细阐述。参考设计/实现设计是中两个重要的全局概念&am…...

通过内核模块按fd强制tcp的quickack方法

一、背景 tcp的quickack功能是为了让ack迅速回发&#xff0c;快速响应&#xff0c;减少网络通讯时延&#xff0c;属于一个优化项&#xff0c;但是tcp的quickack是有配额限制的&#xff0c;配置是16个quick&#xff0c;也就是短时间内quickack了16次以后&#xff0c;这个配额为…...

Wi-Fi 7、Wi-Fi 6 与 5G、4G 的全方位对比

随着无线通信技术的飞速发展&#xff0c;Wi-Fi 7、Wi-Fi 6&#xff0c;以及5G、4G 已经成为人们生活和工作中不可或缺的网络技术。无论是家庭网络、高速移动通信&#xff0c;还是工业物联网&#xff0c;这些技术都在发挥各自的作用。那么&#xff0c;它们之间有什么区别&#x…...

【例43.3】 转二进制

目录 描述 输入描述 输出描述 用例输入 1 用例输出 1 来源 类型 知识补充站 代码 C Python3 C 描述 请你把一个整数n转化为二进制并从低位到高位输出。 输入描述 一行&#xff0c;仅含一个正整数 n (1≤n≤109)。 输出描述 从低位到高位输出一个二进制数&a…...

qt vs ios开发应用环境搭建和上架商店的记录

qt 下载链接如下 https://download.qt.io/new_archive/qt/5.14/5.14.2/qt-opensource-mac-x64-5.14.2.dmg 安装选项全勾选就行&#xff0c;这里特别说明下qt5.14.2/qml qt5.14.2对qml支持还算成熟&#xff0c;但很多特性还得qt6才行&#xff0c;这里用qt5.14.2主要是考虑到服…...

安全测评主要标准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 安全测评的主要标准‌包括多个国际和国内的标准&#xff0c;这些标准为信息系统和产品的安全评估提供了基础和指导。 一、安全测评的主要标准 1.1、国际标准 ‌可信计算机系统评估准则&#xff08;TC…...

如何学习数学 | 数学家如何思考

学习数学的关键在哪里&#xff1f; 原创 遇见数学 不少人面对数学都会觉得高深莫测&#xff0c;甚至非常枯燥乏味。 只有当你真正走入它的世界&#xff0c;才会发现里面蕴含着无尽的智慧和美感。要想推开这座数学的大门&#xff0c;需要的不仅仅是背公式&#xff0c;或者做一…...

职场沟通与行为

职场沟通与行为 引言 在职场上&#xff0c;你是否曾遇到过困惑的沟通&#xff1f;是否对同事的行为有过疑虑&#xff1f;这不仅是个别现象&#xff0c;而是我们这个时代工作文化中的普遍问题。许多职场的摩擦&#xff0c;来自沟通不畅或是行为不当。那么&#xff0c;如何才能…...

IIO(Industrial I/O)驱动介绍

文章目录 IIO&#xff08;Industrial I/O&#xff09;驱动是Linux内核中用于工业I/O设备的子系统&#xff0c;主要用于处理传感器数据采集和转换。以下是其关键点&#xff1a; 功能 数据采集&#xff1a;从传感器读取数据。数据处理&#xff1a;对原始数据进行滤波、校准等操作…...

关于vite+vue3+ts项目中env.d.ts 文件详解

env.d.ts 文件是 Vite 项目中用于定义全局类型声明的 TypeScript 文件。它帮助开发者向 TypeScript提供全局的类型提示&#xff0c;特别是在使用一些特定于 Vite 的功能时&#xff08;如 import.meta.env&#xff09;。以下是详细讲解及代码示例 文章目录 **1. env.d.ts 文件的…...

32单片机综合应用案例——物联网(IoT)环境监测站(四)(内附详细代码讲解!!!)

无论你身处何种困境&#xff0c;都要坚持下去&#xff0c;因为勇气和毅力是成功的基石。不要害怕失败&#xff0c;因为失败并不代表终结&#xff0c;而是为了成长和进步。相信自己的能力&#xff0c;相信自己的潜力&#xff0c;相信自己可以克服一切困难。成功需要付出努力和坚…...

【Flink系列】6. Flink中的时间和窗口

6. Flink中的时间和窗口 在批处理统计中&#xff0c;我们可以等待一批数据都到齐后&#xff0c;统一处理。但是在实时处理统计中&#xff0c;我们是来一条就得处理一条&#xff0c;那么我们怎么统计最近一段时间内的数据呢&#xff1f;引入“窗口”。 所谓的“窗口”&#xff…...

代码随想录算法训练营第三十五天-动态规划-01背包(二维)

动规五部曲 dp数组的含义&#xff0c;注意这是一个二维数组。dp[i][j] 第一维度代表“从0到第i个物品&#xff0c;而且包括选或不选的情况&#xff0c;即这一维度代表物品编号第二维度代表代表背包容量合在一起的意思是当背包容量是j时&#xff0c;从0到i个物品中选择任意物品…...

快速开发:用AI构造AI —— 打造属于个人的Copilot(M-聪明AI)

作品简介&#xff1a; 当今快速发展的AI时代&#xff0c;学会使用AI的同时&#xff0c;也可以融入AI&#xff0c;来打造自己的产品&#xff0c;我给我这个取名M-聪明&#xff0c; 是基于VUE 3 Spring Boot -Redis ChatGML RxJava SSE 的AI 服务平台。然后这款工具旨在为用户…...

Elasticsearch容器启动报错:AccessDeniedException[/usr/share/elasticsearch/data/nodes];

AccessDeniedException 表明 Elasticsearch 容器无法访问或写入数据目录 /usr/share/elasticsearch/data/nodes。这是一个权限问题。 问题原因&#xff1a; 1、宿主机目录权限不足&#xff1a;映射到容器的数据目录 /data/es/data 在宿主机上可能没有足够的权限供容器访问。 …...

用公网服务器实现内网穿透

首先需要一个公网服务器 下载frp 搜索github下载到frp&#xff0c;服务端frps/客户端frpc。。下载的时候要注意自己本地内网机的cpu版本和服务端cpu架构 我的电脑是mac M1PRO版本 下载的是&#xff1a;darwinarm64 比如 服务端一般是Linux&#xff08;Intel 64位CPU&#xf…...

Jmeter如何进行多服务器远程测试

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 JMeter是Apache软件基金会的开源项目&#xff0c;主要来做功能和性能测试&#xff0c;用Java编写。 我们一般都会用JMeter在本地进行测试&#xff0c;但是受到单…...

前端实习第二个月小结

时间飞快&#xff0c;第一次实习已经过去两个多月&#xff0c;作一些简单的总结和分享。 注&#xff1a;文章整体会比较轻松&#xff0c;提及的经历、经验仅作参考。 一、关于实习/工作内容 1、工作内容 近期做的是管理后台方面的业务&#xff0c;技术栈&#xff1a;前端re…...

C# 并发和并行的区别--16

目录 并发和并行 一.并发 定义 特点 代码示例 代码解释 二.并行 定义 特点 在C#中的体现 代码示例 代码解释 三.并发和并行的区别 四 .如何在C#中选择并发还是并行 1.考虑任务类型 2.代码示例 3.注意事项 五.总结 并发和并行 在编程领域,并发和并行是两个密切…...

Python编程与在线医疗平台数据挖掘与数据应用交互性研究

一、引言 1.1 研究背景与意义 在互联网技术飞速发展的当下,在线医疗平台如雨后春笋般涌现,为人们的就医方式带来了重大变革。这些平台打破了传统医疗服务在时间和空间上的限制,使患者能够更加便捷地获取医疗资源。据相关报告显示,中国基于互联网的医疗保健行业已进入新的…...

HBase实训:纸币冠字号查询任务

一、实验目的 1. 理解分布式数据存储系统HBase的架构和工作原理。 2. 掌握HBase表的设计原则&#xff0c;能够根据实际业务需求设计合理的表结构。 3. 学习使用HBase Java API进行数据的插入、查询和管理。 4. 实践分布式数据存储系统在大数据环境下的应用&#xff0c;…...

Java 读取 Windows 设备的唯一性标识及定位

在 Windows 系统中&#xff0c;获取设备唯一性标识及定位信息对设备管理、安全监控等场景意义重大。本文介绍 Java 中几种实现方法&#xff0c;如 JNA 库、WMI4Java 库及通过 JNI 结合 Windows API。 1. 使用 JNA 库读取 DEVPKEY_Device_ContainerId 在 Windows 系统中&…...

UE控件学习

ListView&#xff1a; item设置&#xff1a;使能在list设置为Entry类 Grid Panel&#xff1a; 常用作背包&#xff0c;每个格子大小可不相同 WidgetSwitcher&#xff1a; 用于切换页签 Wrap_Box&#xff1a; 自动横向排版子节点&#xff0c;超过一定范围则自动换行…...

1.Spring AI 从入门到实践

​Spring AI 从入门到实践 1.什么是Spring AI 2.使用Spring Boot&Spring AI快速构建AI应用程序 3.ChatClient&Chat Model简化与AI模型的交互 4.Spring AI Prompt:与大模型进行有效沟通 5.结构化输出大模型响应 6.实战:AI聊天机器人 Ben技术站关注Java技术&#x…...

2025年01月蓝桥杯Scratch1月stema选拔赛真题—美丽的图形

美丽的图形 编程实现美丽的图形具体要求: 1)点击绿旗&#xff0c;角色在舞台中心&#xff0c;如图所示&#xff1b; 2)1秒后&#xff0c;绘制一个边长为 140的红色大正方形&#xff0c;线条粗细为 3&#xff0c;正方形的中心为舞台中心&#xff0c;如图所示; 完整题目可点击下…...

FLASK创建下载

html用a标签 <!-- Button to download the image --> <a href"{{ url_for(download_file, filenameimage.png) }}"><button>Download Image</button> </a> 后端&#xff1a;url_for双大括号即是用来插入变量到模板中的语法。也就是绑…...

LDD3学习7--硬件接口I/O端口(以short为例)

1 理论 1.1 基本概念 目前对外设的操作&#xff0c;都是通过寄存器。寄存器的概念&#xff0c;其实就是接口&#xff0c;访问硬件接口&#xff0c;有I/O端口通信和内存映射I/O (Memory-Mapped I/O)&#xff0c;I/O端口通信是比较老的那种&#xff0c;都是老的串口并口设备&am…...

MySQL(高级特性篇) 06 章——索引的数据结构

一、为什么使用索引 索引是存储引擎用于快速找到数据记录的一种数据结构&#xff0c;就好比一本教科书的目录部分&#xff0c;通过目录找到对应文章的页码&#xff0c;便可快速定位到需要的文章。MySQL中也是一样的道理&#xff0c;进行数据查找时&#xff0c;首先查看查询条件…...

【FlutterDart】MVVM(Model-View-ViewModel)架构模式例子-http版本(30 /100)

动图更精彩 MVVM&#xff08;Model-View-ViewModel&#xff09; 特点 Model&#xff1a;负责数据管理和业务逻辑。 View&#xff1a;负责显示数据&#xff0c;通常是一个UI组件。 ViewModel&#xff1a;负责处理用户交互&#xff0c;更新Model&#xff0c;并将数据转换为View可…...