Linux软件包管理与Vim编辑器使用指南

目录

一、Linux软件包管理器yum

1.什么是软件包?

2.什么是软件包管理器?

3.查看软件包

4.安装软件

​编辑

 5.卸载软件

Linux开发工具:

二、Linux编辑器---vim

1.vim的基本概念

(1) 正常/普通模式(Normal mode)

(2) 插入模式(insert mode)

(3) 底行模式(last line mode)

(4) vim三种模式的相互关系

2.vim的简易执行范例

(1) 使用【vim filename】

(2) [正常模式]切换至[插入模式]

(3) [插入模式]切换至[正常模式]

(4) [正常模式]切换至[底行模式]

(5) 退出vim环境

3.vim编辑模式命令集

(1) 移动光标

(2) 查找与替换

(3) 删除、复制与粘贴 

4.普通模式切换到编辑模式命令集

5.vim底行模式命令集

6.可视化模式(Visual Mode)

7.总结

8.简单配置vim

(1) 配置文件的位置

(2) 常用配置选项用来测试

(3) 使用插件

9.参考资料


一、Linux软件包管理器yum

1.什么是软件包?

在Linux下安装软件:

(1) 通常的办法是下载到程序的源代码,并对其进行编译,得到可执行程序。

(2) 但是这样太麻烦,于是有人把一些常用的软件提前编译好,做成软件包---rpm(可以理解成Windows上安装程序)放在一个服务器上。(rpm是一种以数据库记录的方式将所需要的软件安装到Linux系统的一套软件管理机制 => 需要满足软件的依赖属性需求,满足版本兼容性需求)

(3) 通过包管理器 --- yum(Centos) / apt / apt-get(ubuntu)可以很方便的获取到这个编译好的软件包,直接进行安装(本质就是拷贝 => 必须使用root权限 => 安装到系统里,只要安装一次,所有人都能使用)。

2.什么是软件包管理器?

 yum是Linux下非常常用的一种包管理器。软件包和软件包管理器,就好比“App”和“应用商店”的关系。主要应用于Fedora,RedHat,Centos等发行版上。

由于Linux发行版必须要先发布软件,然后软件放置于yum服务器上,以提供客户端来安装与升级之用。因此我们要使用yum功能时,必须要先找到合适的yum服务器才行。而每个人yum服务器可能都会提供许多不同的软件功能,因此,我们必须要前往yum服务器查询到想换的软件源网址后,再继续处理后续的设置事宜。但Centos在发布软件时已经制作出多个镜像站(国内知名的有阿里云、清华大学、163),提供全世界的软件更新之用。所以理论上我们不需要处理任何设置值,只要能连上网就可以使用yum(操作系统内部内置链接)。也就是说包管理器会自动解决软件的依赖关系。 

3.查看软件包

通过yum list命令可以罗列出当前一共有哪些软件包。由于包的数目可能非常之多,这里我们需要使用grep命令只筛选出我们关注的包。 

yum list | grep sl

4.安装软件

用 yum 完成 sl 的安装,yum会自动找到都有哪些软件包需要下载,这是敲 "y" 确认安装,出现“complete”说明安装成功。

sudo yum install sl

注意:

• 关于yum的所有操作必须保证主机(虚拟机)网络畅通!!!可以用ping指令验证:如果能够收到响应,说明主机可以访问互联网。

ping www.baidu.com

• 安装软件时由于需要向系统目录中写入内容,一般需要sudo或者切到root用户下才能完成。

• yum安装软件只能一个装完了再装另外一个。正在yum安装一个软件的过程中,如果在尝试用yum安装另外一个软件,yum会报错。

• /etc/yum.repos.d/*里面的文件称之为yum源。也就是我们开头所提到的yum服务器。更新yum源也就是更新里面的文件。Base 是稳定软件源,epel 是扩展软件源(新软件)。

[zyt@iZ2vcf9wvlgcetfeub9f11Z ~]$ cd /etc/yum.repos.d/
[zyt@iZ2vcf9wvlgcetfeub9f11Z yum.repos.d]$ ll
total 16
-rw-r--r-- 1 root root  675 Nov 11 17:01 CentOS-Base.repo
-rw-r--r-- 1 root root  230 Nov 11 17:01 epel.repo
-rw-r--r-- 1 root root 1358 Sep  5  2021 epel.repo.rpmnew
-rw-r--r-- 1 root root 1457 Sep  5  2021 epel-testing.repo

 5.卸载软件

sudo yum remove sl

下面这些命令通常一起使用,以确保软件包管理器的缓存是最新的,并且软件包是最新版本的。首先移除软件包,然后清理缓存,接着更新缓存,最后重新安装软件包。 

sudo yum remove sl #移除软件包
sudo yum clean all #清除软件包缓存
sudo yum makecache #生成元数据缓存
sudo yum install sl #安装软件包

Linux开发工具:

二、Linux编辑器---vim

前面的学习,我们一直都是使用命令行模式来处理Linux系统的设置问题。但在Linux的系统中使用文本编辑器来编辑你的Linux参数配置文件,可是一件很重要的事情,也因此,系统管理员至少应该熟悉一种文本处理工具。在Linux命令行模式下的常听的文本编辑器就有emacs、pico、nano、joe和vim等。之前我们已经介绍的简单好用的nano,为什么还要学vim?

因为,所有的 UNIX-like 系统都会内置vi文本编译器,其他的文本编译器则不一定会存在;很多软件的编辑接口都是主动调用vi(之后会讲的crontab,visudo,edquota等命令)等优点。

那什么是vim?vi/vim的区别简单来说,它们都是多模式编译器,不同的是vim是vi的升级版本,它不仅兼容vi的所有指令,而且还有一些新的特性在里面。例如语法加亮,可视化操作不仅可以在终端运行,也可以运行于x windows、mac os、windows。

1.vim的基本概念

讲解vim的三种模式(其实有好多种模式,目前掌握这三种即可)分别是普通模式(command mode)、插入模式(insert mode)和 底行模式(last line mode)。

(1) 正常/普通模式(Normal mode

以vim打开一个文件就直接默认是普通模式。在这个模式中,可以控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入insert mode模式下,或者last line mode。(帮助我们快速编辑)

(2) 插入模式(insert mode)

在普通模式下可以进行删除、复制、粘贴等操作,但是却无法编辑文件的内容,作文字的输入。要等到按下【i,I,o,O,a,A,r,R】等任何一个字母才能后才能进入编辑模式。通常在Linux中,界面左下方会出现【INSERT】或【REPLACE】等字样,才可以进行编辑。而要回到普通模式要按下【Esc】。

(3) 底行模式(last line mode)

在命令模式中输入【:   /   ?】三个中的任何一个按钮,就可以将光标移动到最下面那一行。该模式下,文件保存(w)或退出(q),也可以进行文件替换,找字符串,列出行号等操作。

(4) vim三种模式的相互关系

2.vim的简易执行范例

(1) 使用【vim filename】

【vim filename】进入vim全屏幕编辑画面,进入后,是处于[普通模式],要切换到[插入模式]才能够输入内容。整个界面分为两部分,上半部分与最下面一行可以视为独立的。上半部分展示的是文件的实际内容,最下面一行则是状态显示行,或命令执行行。 

● 用vim创建一个新文件node.c

vim node.c

● 用vim打开一个已有文件

man printf > code.c
vim code.c

【vim filename + num】

执行命令时加上数字,进入vim后光标位置就在所输数字行。

●【!v】

自动匹配上次执行过的v开头的命令

●【ctrl + r】

输入要查找的历史命令

(2) [正常模式]切换至[插入模式]

按下a,i,o等字符就可以从普通模式进入插入模式,在插入模式中,左下角会出现-INSERT-字样,键盘上出来【ESC】按键之外其他的按键都可以视为一般的输入按键,所以你可以进行任何编辑。

(3) [插入模式]切换至[正常模式]

按左上角的【ESC】即可。

(4) [正常模式]切换至[底行模式]

「shift + ;」, 其实就是输入「:」

(5) 退出vim环境

在 [普通模式下] 按「:」进入底行模式后,再输入下面所需要的命令:

w:保存当前文件

wq:存盘并退出vim

q!:不存盘强制退出vim 

3.vim编辑模式命令集

(1) 移动光标

h 或 ←光标左移一个字符
j 或 ↓光标下移一个字符
k 或 ↑光标上移一个字符
l 或 →光标右移一个字符
[ctrl] + [f]屏幕【向下】移动一页,相当于【pgdn】按键(常用)
[ctrl] + [b]屏幕【向上】移动一页,相当于【pgup】按键(常用)
[ctrl] + [d]屏幕【向下】移动半页
[ctrl] + [u]屏幕【向上】移动半页
0 或 ^ 或 [Home]移动到这一行的最前字符串处(常用)
$ 或 [End]移动到这一行的最后字符(常用)
G移动到这个文件的最后一行(常用)
nGn为数字,移动到这个文件的第n行
gg移动到这个文件的第一行,相当于1G(常用)
w以单词为单位右移
b以单词为单位左移
n<Enter>n为数字,光标向下移动n行(常用)

(2) 查找与替换

~切换光标位置大小写
#选中单词
nn是英文按键,代表【重复上一个查找的操作】,向下查找
NN是英文按键,与n刚好相反,是【反向】查找
/word向光标之下找一个名为word的字符串
?word向光标之上找一个名为word的字符串

 #选中word(或/word)配合n及N是非常有帮助的,可重复的查找的关键单词

(3) 删除、复制与粘贴 

x 与 X在一行中,x为向后删除一个字符(相当于[del]),X为向后删除一个字符(相当于[Backspace])(常用)
nxn为数字,连续向后删除n个字符
dd剪切光标所在的那一整行(常用)
nddn为数字,剪切光标所在的向下n行(常用)
yy复制光标所在的那一行(常用)
nyyn为数字,复制光标所在的向下n行(常用)
p 与 Pp为将已复制的数据在光标下一行粘贴,P为粘贴在光标的上一行(常用)
u撤销历史操作(常用)
[Ctrl] + r撤销u的操作(常用)
.小数点,重复上一个操作的含义(常用)

 注意:u 和 [Ctrl] + r 这两个操作一旦退出文件编辑就无法再撤销,但如果只是保存过没有退出文件就还能使用。

4.普通模式切换到编辑模式命令集

i 与 I

进入插入模式(Insert mode)

i 为【从目前光标所在处插入】,I 为【在目前所在行的第一个非空空格符开始插入】(常用)

a 与 A

进入插入模式(Insert mode)

a 为【从目前光标所在的下一个字符处开始插入】,A 为【从光标所在行的最后一个字符处开始插入】(常用)

o 与 O

进入插入模式(Insert mode)

这是英文字母的小写o,o 为【在目前光标所在的下一行处插入新的一行】,O 为【在目前光标所在处的上一行插入新的一行】(常用)

r 与 R

进入替换模式(Replace mode)

r 会【替换光标所在的那一个字符一次】,R 会【一直替换光标所在的文字(可移动)】,直到按下[Esc]为止(常用)

[Ctrl] + v

进入可视化模式(Visual Block)

【可视区块,可以用矩形的方式选择数据】,光标移动过的位置就会反白(只能用hjkl移动光标)(常用)

[Esc]退出编辑模式,回到普通模式(常用)

可视化模式举例:批量注释:

先【Ctrl + r】进入可视化模式,移动光标选择要注释的部分,再按【Ctrl + i】也就是【I】进入插入模式,输入【//】注释符,最后按【Esc】退出插入模式就实现了。

批量去掉注释:【Ctrl + r】进入可视化模式,选中注释符【//】,再按 d(删除)就完成去注释。

使用上面这些按键,再vim界面的左下角会出现【--INSERT--】,【--REPLACE--】,【--VISUAL-BLOCK--】的字样。

5.vim底行模式命令集

:w将编辑的数据写入硬盘文件中
:w!若文件属性是【只读】时,强制写入该文件。到底能不能写入,跟你对该文件的文件权限有关
:q退出vim(常用)
:q!若曾修改过文件,又不想保存使用 ! 为强制退出不保存
:wq保存后退出,若为 :wq! 则为强制保存后退出(常用)
ZZ快捷键,若文件没有被修改,则不保存退出;若文件已经被修改过,则保存退出
:!command执行command命令,显示结果。
:%s/x/y/用 x 批量化替换 y
:vs dst.c纵向屏幕创建一个新窗口,打开的是名为dst.c的文件(可能是新建的)。([Ctrl] + ww 可以切换窗口)
:set nu显示行号,设置之后会在每一行的前缀显示该行的行号
:set nonu与 set nu 相反,为取消行号

6.可视化模式(Visual Mode)

当我们按下v或V或[Ctrl] + v时,光标移动过的地方会反白

v

进入字符可视化模式(Character Visual Mode)

字符选择,会将光标经过过的地方会反白选择

V

进入行可视化模式(Line Visual Mode)

会将光标经过过的地方会反白选择

[Ctrl] + v

进入区块可视化模式(Block Visual Mode)

可以用矩形的方式选择数据(只能用hjkl控制移动)

y将反白的部分复制
d将反白的地方删除
p将刚刚复制的区块,在光标所在处粘贴

7.总结

8.简单配置vim

(1) 配置文件的位置

• 在目录 /etc/ 下面,有个名为vimrc的文件,这是系统中公共的vim配置文件,对所有用户都有效。
• 而在每个用户的主目录下,都可以自己建立私有的配置文件,命名为:“.vimrc”。例如 /root目录下,通常已经存在一个.vimrc文件,如果不存在,则创建之。

 下面是Vim 编辑器的配置文件和相关路径,这些文件和变量共同定义了 Vim 的行为和外观。用户可以通过修改 .vimrc.exrc 文件来定制自己的 Vim 环境,而系统管理员可以通过修改 /etc/vimrc 文件来为所有用户提供统一的配置。

系统 vimrc 文件: "/etc/vimrc"
     用户 vimrc 文件: "$HOME/.vimrc"
 第二用户 vimrc 文件: "~/.vim/vimrc"
      用户 exrc 文件: "$HOME/.exrc"
       defaults file: "$VIMRUNTIME/defaults.vim"
         $VIM 预设值: "/etc"
  $VIMRUNTIME 预设值: "/usr/share/vim/vim81"
• 切换用户成为自己执行 su ,进入自己的主工作目录,执行 cd ~
• 打开自己目录下的.vimrc文件,执行 vim .vimrc(此时还是空文件)

(2) 常用配置选项用来测试

我们写入常用配置项,测试一下:

set nu             "显示行号
syntax on      "语法检验,颜色显示
set shiftwidth=4   "缩进空格数为4
set tabstop=4
set expandtab

set autoindent     "自动缩进
set showmode       "显示左下角那一行状态

(3) 使用插件

要配置好看的vim,原生的配置可能功能不全,可以选择安装插件来完成配置,保证用户是你要配置的用户,然后:

安装 TagList 插件

  1. 下载 taglist_xx.zip 文件。
  2. 解压该文件。
  3. 将解压出来的 doc 目录下的内容放到 ~/.vim/doc 目录中。
  4. 将解压出来的 plugin 目录下的内容拷贝到 ~/.vim/plugin 目录中。
  5. 在 ~/.vimrc 文件中添加以下配置:vim
    let Tlist_Show_One_File=1
    let Tlist_Exit_OnlyWindow=1
    let Tlist_Use_Right_Window=1
  6. 重启 Vim。

安装 WinManager 插件

  1. 下载 winmanager.zip 文件,确保是 2.X 版本以上。
  2. 解压该文件。
  3. 将解压出来的 doc 目录下的内容放到 ~/.vim/doc 目录中。
  4. 将解压出来的 plugin 目录下的内容拷贝到 ~/.vim/plugin 目录中。
  5. 在 ~/.vimrc 文件中添加以下配置:vim
    let g:winManagerWindowLayout=‘FileExplorer|TagList'
    nmap wm :WMToggle<cr>
  6. 重启 Vim。

使用方法

  • 打开 ~/XXX.c 或 ~/XXX.cpp 文件。
  • 在普通模式(Normal mode)下输入 wm,你将看到下面文件浏览器和标签列表的效果。
  • 手把手教你把Vim改装成一个IDE编程环境(图文)_vim 打造成 ide-CSDN博客

其他手册

  • 要查看更多手册信息,请执行 vimtutor 命令。

请注意,上述步骤假设你已经有一定的 Vim 插件安装经验,并且你的 Vim 环境已经配置好了相应的路径。如果你在执行这些步骤时遇到任何问题,可能需要检查文件路径和权限设置是否正确。

(4) 一键式配置vim

目前只支持 Centos7 x86_64. 具体操作查看文档

VimForCpp: 快速将vim打造成c++ IDE

9.参考资料

GitHub - wsdjeg/vim-galore-zh_cn: Vim 从入门到精通

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

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

相关文章

嵌入式硬件实战基础篇(一)-STM32+DAC0832 可调信号发生器-产生方波-三角波-正弦波

引言&#xff1a;本内容主要用作于学习巩固嵌入式硬件内容知识&#xff0c;用于想提升下述能力&#xff0c;针对学习STM32与DAC0832产生波形以及波形转换&#xff0c;对于硬件的降压和对于前面硬件篇的实际运用&#xff0c;针对仿真的使用&#xff0c;具体如下&#xff1a; 设…

怎么样绑定域名到AWS(亚马逊云)服务器

1&#xff0c;拿着你买的域名去亚马逊申请一个证书。申请证书分两种&#xff0c;一种是去亚马逊后台填域名手动申请 &#xff0c;另一种是通过API来申请&#xff0c;类似如下代码&#xff1a; 2、证验证书。有两种方式&#xff1a;一种是通过邮件&#xff0c;另一种去到域名提供…

【网络安全】公钥基础设施

1. PKI 定义 1.1 公钥基础设施的概念 公钥基础设施&#xff08;Public Key Infrastructure&#xff0c;简称PKI&#xff09;是一种基于公钥密码学的系统&#xff0c;它提供了一套完整的解决方案&#xff0c;用于管理和保护通过互联网传输的信息。PKI的核心功能包括密钥管理、…

【计算机网络】UDP网络程序

一、服务端 1.udpServer.hpp 此文件负责实现一个udp服务器 #pragma once#include <iostream> #include <string> #include <cstdlib> #include <cstring> #include <functional> #include <strings.h> #include <unistd.h> #incl…

定时器简介

TIM(Timer定时器)简介 在第一部分,我们主要讲的是定时器基本定时的功能&#xff0c;也就是定一个时间&#xff0c;然后让定时器每隔这个时间产生一个中断&#xff0c;来实现每隔一个固定时间执行一段程序的目的&#xff0c;比如你要做个时钟、秒表&#xff0c;或者使用一些程序…

【论文阅读】HITS: High-coverage LLM-based Unit Test Generation via Method Slicing

HITS: High-coverage LLM-based Unit Test Generation via Method Slicing 1. 来源出处 本文是发表在2024年39th IEEE/ACM International Conference on Automated Software Engineering (ASE)上的论文。作者包括Zejun Wang, Kaiibo Liu, Ge Li和Zhi Jin,他们来自北京的PKU …

多模态大模型开启AI社交新纪元,Soul App创始人张璐团队亮相2024 GITEX GLOBAL

随着AI在全球范围内的加速发展和广泛应用,各行业纷纷在此领域发力。作为全球最大的科技盛会之一,2024年的GITEX GLOBAL将目光再次聚焦于人工智能的飞速发展,吸引了超过6700家来自各个领域的企业参与。在这样的背景下,Soul App作为国内较早将AI技术应用于社交领域的平台,首次亮相…

爬虫开发工具与环境搭建——使用Postman和浏览器开发者工具

第三节&#xff1a;使用Postman和浏览器开发者工具 在网络爬虫开发过程中&#xff0c;我们经常需要对HTTP请求进行测试、分析和调试。Postman和浏览器开发者工具&#xff08;特别是Network面板和Console面板&#xff09;是两种最常用的工具&#xff0c;能够帮助开发者有效地捕…

Zabbix中文监控指标数据乱码

1&#xff09;点击主机&#xff0c;选择Zabbix server 中的 图形 一项&#xff0c;可以看到当前显示的为乱码 2&#xff09; 下载字体文件&#xff1a; https://gitcode.com/open-source-toolkit/4a3db/blob/main/SimHei.zip 解压unzip -x SimHei.zip 3&#xff09; 替换字体文…

HBase理论_HBase架构组件介绍

近来有些空闲时间&#xff0c;正好最近也在开发HBase相关内容&#xff0c;借此整理一下学习和对HBase组件的架构的记录和个人感受&#xff0c;付出了老夫不少心血啊&#xff0c;主要介绍的就是HBase的架构设计以及我的拓展内容。内容如有不当或有其他理解 matirx70163.com HB…

微信小程序自定义顶部导航栏(适配各种机型)

效果图 1.pages.js&#xff0c;需要自定义导航栏的页面设置"navigationStyle": "custom" 2.App.vue,获取设备高度及胶囊位置 onLaunch: function () {// 系统信息const systemInfo uni.getSystemInfoSync()// 胶囊按钮位置信息const menuButtonInfo uni.…

ArkTs简单入门案例:简单的图片切换应用界面

在鸿蒙 OS 应用开发的过程中&#xff0c;我们常常需要通过组合各种组件和编写相应的逻辑来实现丰富多样的功能。今天&#xff0c;我就来和大家详细解析一段实现简单图片切换功能的代码&#xff0c;希望能帮助到那些刚接触鸿蒙 OS 应用开发的朋友们。 一、代码导入部分 Entry …

【项目组件】第三方库——websocketpp

目录 第三方协议&#xff1a;websocket websocket简介 websocket特点 websocket协议切换 websocket协议格式段 websocketpp库介绍 endpoint server connection websocketpp库搭建服务器流程 基本框架实现 业务处理回调函数的实现 http_callback open_callback …

【手撕 Spring】 -- Bean 的创建以及获取

&#x1f308;手写简化版 Spring 框架&#xff1a;通过构建一个精简版的 Spring 框架&#xff0c;深入理解 Spring 的核心机制&#xff0c;掌握其设计思想&#xff0c;进一步提升编程能力 &#x1f308;项目代码地址&#xff1a;https://github.com/YYYUUU42/mini-Spring 如果该…

Jdbc学习笔记(四)--PreparedStatement对象、sql攻击(安全问题)

目录 &#xff08;一&#xff09;使用PreparedStatement对象的原因&#xff1a; 使用Statement对象编写sql语句会遇到的问题 ​编辑 &#xff08;二&#xff09;sql攻击 1.什么是sql攻击 2.演示sql攻击 &#xff08;三&#xff09;防止SQL攻击 1.PreparedStatement是什么 …

Jmeter中的定时器(二)

5--JSR223 Timmer 功能特点 自定义延迟逻辑&#xff1a;使用脚本语言动态计算请求之间的延迟时间。灵活控制&#xff1a;可以根据测试数据和条件动态调整延迟时间。支持多种脚本语言&#xff1a;支持 Groovy、JavaScript、BeanShell 等多种脚本语言。 支持的脚本语言 Groov…

【Istio】Istio原理

第一章 Istio原理 一、服务网格(servicemesh)1、六个时代2、服务网格定义及优缺点二、Istio1、Istio定义2、Istio安装3、Istio架构1.5版本之前1.5版本之后4、bookinfo案例架构部署5、CRD一、服务网格(servicemesh) 微服务:架构风格,职责单一,api通信 服务网格:微服务时代的…

4.远程访问及控制

SSH 简介&#xff1a; SSH&#xff08;Secure Shell&#xff09;协议是一种安全通道协议&#xff0c;对通信数据进行了加密处理&#xff0c;用于远程管理。 OpenSSH简介 OpenSSH 服务名称&#xff1a;sshd 服务端主程序&#xff1a;/usr/sbin/sshd 服务端配置文件&#xf…

精通rust宏系列教程-入门篇

Rust最令人敬畏和强大的特性之一是它使用和创建宏的能力。不幸的是&#xff0c;用于创建宏的语法可能相当令人生畏&#xff0c;并且对于新开发人员来说&#xff0c;这些示例可能会令人不知所措。我向你保证Rust宏非常容易理解&#xff0c;本文将为你介绍如何创建自己的宏。 什么…

设计模式之装饰器模式(SSO单点登录功能扩展,增加拦截用户访问方法范围场景)

前言&#xff1a; 两个本想描述一样的意思的词&#xff0c;只因一字只差就让人觉得一个是好牛&#xff0c;一个好搞笑。往往我们去开发编程写代码时也经常将一些不恰当的用法用于业务需求实现中&#xff0c;但却不能意识到。一方面是由于编码不多缺少较大型项目的实践&#xff…