Linux:编辑器Vim和Makefile

 

✨✨所属专栏:Linux✨✨

✨✨作者主页:嶔某✨✨

vim的三种常用模式

分别是命令模式(command mode)、插入模式(Insert mode)和底行模式(last line mode)

各模式的功能区分如下:

  1. 正常/普通/命令模式(Normal mode) 控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode。
  2. 插入模式(Insert mode) 只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式。该模式是我们后面用的最频繁的编辑模式。
  3. 末行模式(last line mode) 文件保存或退出,也可以进行文件替换,找字符串,列出行号等操作。 在命令模式下,shift+: 即可进入该模式。要查看你的所有模式:打开vim,底行模式直接输入
:help vim-modes

vim的基本操作

进入vim

输入vim+文件名  进入vim的命令模式

vim code.c

正常模式切换为插入模式

  • 输入a:在当前字符的下一个字符进入插入模式
  • 输入i:在当前字符进入插入模式
  • 输入o:另起一行进入插入模式

 插入模式切换为正常模式

目前处于插入模式,就只能一直输入文字,如果发现输错了字,想用光标键往回移动,将该字删除,可以先按一下「ESC」键转到正常模式再删除文字。当然,也可以直接删除。

正常模式切换到末行模式

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

 退出vim及保存文件

在正常模式下,先进入末行模式输入:

  • w:保存文件,但不退出
  • q:退出
  • wq!:强制保存并退出

vim正常模式命令集

移动光标

  • vim可以用键盘上的上下左右键来控制光标,但正规的vim是用小写的字母「h」、「j」、「k」、 「l」、分别控制光标左、下、上、右移动一格
  • 按「G」:移动到文章最后
  • 按「gg」:移动到文章开头
  • 按「$」:移动到所在行的行尾
  • 按「^」:移动到所在行的行首
  • 按「w」:光标跳到下一个字符串的开头
  • 按「b」:光标回到上个字符串的开头

 删除文字

  • 「x」:每按一次删除光标所在位置的一个字符
  • 「# x」:删除光标所在位置后面(包含自己)的 # 个字符
  • 「dd」:删除光标所在行
  • 「#dd」:从光标位置开始删除 # 行

复制

  • 「yy」:复制光标所在行到缓冲区
  • 「yw」:复制光标所在位置到所在字符串末尾的字符到缓冲区
  • 「#yw」:复制#个字到缓冲区
  • 「p」:将缓冲区内的字符贴到光标所在位置。注意:所有与“y”有关的复制命令都必须与“p”配合才能完成复制与粘贴功能

替换

  • 「r」:替换光标所在处的字符
  • 「R」:替换光标所到之处的字符,直到按下「ESC」键为止。

 撤销上一次操作

  • 「u」:如果您误执行一个命令,可以马上按下「u」,回到上一个操作。按多次“u”可以执行多次回复。
  • 「ctrl + r」: 撤销的恢复(撤销你的撤销)

 更改

  • 「cw」:更改光标所在处的字符到字符串尾部,并进入插入模式

 跳至指定行

  • 「ctrl」+「g」:列出光标所在行的行号。
  • 「#G」:光标移动至第 # 行行首,例如,「15G」,表示移动光标至文章的第15行行首。

 vim末行模式命令集

在使用末行模式之前,请记住先按「ESC」键确定已经处于正常模式,再按「:」冒号即可进入末行模式。

列出行号

  • 「set nu」: 输入「set nu」后,会在文件中的每一行前面列出行号

 跳到文件中的某一行

  • 「#」:「#」号表示一个数字,在冒号后输入一个数字,再按回车键就会跳到该行行首

 查找字符

  • 「/关键字」: 先按「/」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按 「n」会往后寻找到您要的关键字为止。
  • 「?关键字」:先按「?」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直 按「n」会往前寻找到您要的关键字为止。

保存文件

  •  「w」: 在冒号输入字母「w」就可以将文件保存起来

 离开vim

  • 「q」:按「q」就是退出,如果无法离开vim,可以在「q」后跟一个「!」强制离开vim。
  • 「wq」:一般建议离开时,搭配「w」一起使用,这样在退出的时候还可以保存文件。

Linux项目自动化构建工具make/Makefile

  1. 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作
  2. makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
  3. make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一 种在工程方面的编译方法。
  4. make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建

实例 

 比如我们有一个code.c文件要将它预处理、编译、汇编为 .o文件可以在Makefile里输入:

code:code.o
    gcc -o code code.o
code.o:code.s
    gcc -c code.o code.s
code.s:code.i
    gcc -S code.s code.i
code.i:code.c
    gcc -E code.i code.c

上面的意思就是将code.c文件处理成可执行文件,code依赖code.o这是依赖关系,第二行的命令就是依赖方法

make是如何工作的,在默认的方式下,也就是我们只输入make命令。

  1. make会在当前目录下找名字叫“Makefile”或“makefile”的文件。
  2. 如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“code”这个文件, 并把这个文件作为最终的目标文件。
  3. 如果code文件不存在,或是code所依赖的后面的code.o文件的文件修改时间要比code这个文件新(可以用 touch 测试),那么,他就会执行后面所定义的命令来生成hello这个文件。
  4. 如果code所依赖的code.o文件不存在,那么make会在当前文件中找目标为code.o文件的依赖性,如果找到则再根据那一个规则生成code.o文件。(这有点像一个堆栈的过程)
  5. 当然,你的C文件和H文件是存在的啦,于是make会生成 code.o 文件,然后再用 code.o 文件声明make的终极任务,也就是执行文件code了。
  6. 这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。
  7. 在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错, 而对于所定义的命令的错误,或是编译不成功,make根本不管。
  8. make只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起, 我就不工作啦。

项目清理 

  • 像clean这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行, 不过,我们可以显示要make执行。即命令——“make clean”,以此来清除所有的目标文件,以便重新编译。
  • 但是一般我们这种clean的目标文件,我们将它设置为伪目标,用 .PHONY 修饰,伪目标的特性是,总是被执行的。
  • 由于伪目标不对应实际文件,make 在处理伪目标时不会根据文件的存在与否、时间戳等来判断是否需要执行相关操作,而是只要在命令行中指定了要执行该伪目标,make 就会执行与之关联的命令序列。
.PHONY:
clean:
    @rm -f *.i *.s *.o
    @echo "remove"

 ps:命令前面加@在执行的时候就不会回显

 进度条小程序

第一版:没有和网络联系起来

#include "process.h"
#include <string.h>
#include <unistd.h>
#define style '#'

void process_v1()
{
	char buff[101] = { '0' };
	const char* stat = "|/-\\";
	int len = strlen(stat);
	for(int i = 0; i < 101; i++)
	{
		printf("[%-100s][%d%][%c]\r",buff,i,stat[i%len]);
		fflush(stdout);
		buff[i] = style;
		usleep(50000);
		
	}
	printf("\n");
}

第二版:

#include<stdio.h>

void process_v2(double total, double cur)
{
	char buff[101] = { '0' };
	const char* lable = "|/-\\";
	int len = strlen(lable);

	int num =(int)(cur*100/total);
	for(int i = 0; i < num; i++)
	{
		buff[i] = '#';
	}
	double rate = (cur*100)/total;
	static count = 0;
	printf("\033[32m[%-100s][%.1f%%][%c]\033[0m\r",buff,rate,lable[count%len]);

	count++;	
	fflush(stdout);
}


int main()
{
	int t = 1024;
	int ad = 0;
	while(ad <= 1024)
	{
		process_v2(t,ad);
		ad++;
		usleep(5000);// 模拟网络下载
	}
	printf("\033[32m\n\rcomplete!!!\033[0m\n");
	return 0;
}

 本期博客到这里就结束了,如果有什么错误,欢迎指出,如果对你有帮助,请点个赞,谢谢!

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

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

相关文章

使用C#学习Office文件的处理(pptx docx xlsx)

Office文件 是指PPT 、word、Excel 这些常用工具生成的文件 &#xff0c;例如 pptx docx xlsx。 这些文件的读取和生成有很多很多库 例如 NOPI 、DevExpress、C1、Aspose、Teleric 等等&#xff0c;各有各的优缺点。俺今天不讲这个&#xff0c;俺只是讲讲如何了解Office文件的…

xtu Euler‘s Totient Function+欧拉函数

Eulers Totient Function 样例输入 3 1 6 1 100 1 1000000样例输出 12 3044 303963552392 解题思路&#xff1a; 不管是素数还是合数&#xff0c;初始值都是它本身。 j为素数&#xff0c;f[j]j-1&#xff0c;相当于f[j]j/i*(i-1),ij 埃筛&#xff0c;ji,i为j的…

基于微信小程序实现信阳毛尖茶叶商城系统设计与实现

作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验&#xff0c;被多个学校常年聘为校外企业导师&#xff0c;指导学生毕业设计并参与学生毕业答辩指导&#xff0c;…

利用这五项网络安全措施安全地扩展您的数据中心

由于大量行业使用这些设施&#xff0c;数据中心网络安全至关重要。医疗保健、金融、教育和其他行业都依赖此存储解决方案来保护记录和敏感信息。 公司可能会根据需求调整存储需求&#xff0c;因此了解网络安全协议至关重要。以下是如何在保护数据中心免受外部攻击的同时扩展数…

C++stack和queue的模拟实现

1.stack的模拟实现 在这一部分嘞&#xff0c;我们不再用传统的模拟实现来实现今天要实现的内容&#xff0c;我们使用一种设计模式来实现今天的内容 设计模式 目前接触到的设计模式一共有两种&#xff1a;一种是适配器模式&#xff0c;一种是迭代器模式 迭代器设计模式 迭代…

linux内核的原子操作与用户态的原子操作差别

Linux内核的原子操作与用户态的C语言原子操作主要在以下几个方面存在区别&#xff1a; 实现层级&#xff1a; 内核原子操作&#xff1a; 直接依赖于硬件提供的原子指令&#xff08;如CAS、原子加等&#xff09;&#xff0c;通过内核提供的函数&#xff08;如atomic_add()、at…

多目标优化求解的内涵主要方法

多目标优化问题 定义如下多目标优化问题&#xff1a; min ⁡ f ( x ) [ f 1 ( x ) , f 2 ( x ) , ⋯ , f n ( x ) ] ( 1 ) \min\quad f(x)[f_1(x),f_2(x),\cdots,f_n(x)]\quad(1) minf(x)[f1​(x),f2​(x),⋯,fn​(x)](1) 其中&#xff0c; f i ( x ) , ∀ i 1 , ⋯ , n f_…

TS中forEach与map,filter的简单事例及简单的说明

1、先上一张效果图&#xff1a; 2、再上一个代码&#xff1a; <template><div><h1>Array Test</h1><ul><li v-for"item in items" :key"item.id">{{ item.name }}</li></ul><div style"display:…

攻防世界的新手web题解

攻防世界引导模式 1、disabled_button 好&#xff0c;给了一个按钮&#xff0c;第一道题目就不会做 看的wp<input disabled class"btn btn-default" style"height:50px;width:200px;" type"submit" value"flag" name"auth&q…

嵌入式软开——八股文——学习引导和资料网址

1、找工作期间整理的相关八股资料&#xff0c;可以帮助初学者按此流程快速学习入门&#xff0c;帮助有基础的同学快速复习、查缺补漏&#xff0c;帮助找工作面试的同学&#xff0c;快速复习知识点。 2、前13个文件夹为单独模块的相关学习内容&#xff0c;里面涵盖相关模块的主…

【C++复习】第二弹-内存管理

目录 前言 1.结合地址空间来理解不同对象的存储区域 2.malloc和free以及new和delete的区别 3.什么是内存泄漏&#xff1f; 前言 对于一个程序来说&#xff0c;我们必须知道他的各个位置的变量存放在哪里的&#xff0c;所以我们必须要清楚C的内存分布。其实内存管理是衡量一个…

使用Python计算相对强弱指数(RSI)进阶

使用Python计算相对强弱指数&#xff08;RSI&#xff09;进阶 废话不多说&#xff0c;直接上主题&#xff1a;> 代码实现 以下是实现RSI计算的完整代码&#xff1a; # 创建一个DataFramedata {DATE: date_list, # 日期CLOSE: close_px_list, # 收盘价格 }df pd.DataF…

CodeQL学习笔记(1)-QL语法(逻辑连接词、量词、聚合词、谓词和类)

最近在学习CodeQL&#xff0c;对于CodeQL就不介绍了&#xff0c;目前网上一搜一大把。本系列是学习CodeQL的个人学习笔记&#xff0c;根据个人知识库笔记修改整理而来的&#xff0c;分享出来共同学习。个人觉得QL的语法比较反人类&#xff0c;至少与目前主流的这些OOP语言相比&…

小白投资理财 - 看懂 K 线形态下

小白投资理财 - 看懂 K 线形态下 熊势吞噬牛势吞噬孕育线牛市孕育线熊市孕育线 早晨之星黄昏之星总结 前一篇《 小白投资理财 - 看懂 K 线形态上》介绍了 6 种 K 线形态&#xff0c;有天气预报的&#xff0c;又有灭霸&#xff0c;小叮当&#xff0c;今天介绍另外 6 种在股市上…

认识CSS语法

CSS&#xff08;网页美容&#xff09; 重点&#xff1a;选择器、盒子模型、浮动、定位、动画&#xff0c;伸缩布局 Css的作用&#xff1a; 美化网页&#xff1a;CSS控制标签的样式 网页布局&#xff1a;CSS控制标签的位置 概念&#xff1a;层叠样式表&#xff08;级联样式表…

Linux | Rsync 命令:16 个实际示例(下)

引言 Rsync&#xff08;远程同步&#xff09;是Linux/Unix系统中用于远程和本地复制及同步文件和目录的常用工具。 利用rsync命令&#xff0c;您可以轻松地在不同目录、硬盘和网络之间进行数据的远程和本地复制与同步&#xff0c;进行数据备份&#xff0c;以及在两台Linux系统间…

【正点原子K210连载】第四十八章 自学习分类实验 摘自【正点原子】DNK210使用指南-CanMV版指南

第四十八章 自学习分类实验 在上一章节中&#xff0c;介绍了利用maix.KPU模块实现了MNIST的手写数据识别&#xff0c;本章将继续介绍利用maix.KPU模块实现的自学习分类。通过本章的学习&#xff0c;读者将学习到自学习分类应用在CanMV上的实现。 本章分为如下几个小节&#xf…

维乐Senso Edge坐垫,自然并不远,向往就前往

嘿&#xff0c;是不是已经厌倦了城市的钢筋森林&#xff0c;渴望一场说走就走的自然之旅&#xff1f;别急&#xff0c;维乐Senso Edge坐垫带你飞&#xff0c;让我们的车轮一起碾过每一寸向往的土地&#xff01;    追逐风&#xff0c;拥抱自然。你还记得第一次骑行时的那份…

【功能安全】 独立于环境的安全要素SEooC

目录 01 SEooC定义 02 SEooC开发步骤 03 SEooC开发示例 04 SEooC问答 01 SEooC定义 缩写: SEooC:Safety Element out of Context独立于环境的安全要素 SEooC出处:GB/T34590.10—2022,第9章节 SEooC与相关项什么关系? SEooC可以是系统、系统组合、子系统、软件组件、…

Linux 系统中,将网络配置从 DHCP 改为静态 IP的几种方法

Linux 系统中&#xff0c;将网络配置从 DHCP 改为静态 IP 可以通过几种不同的方法来实现&#xff0c;下面是几种常见的方式&#xff1a; 方法一&#xff1a;使用 connman&#xff08;Connection Manager&#xff09; 如果你已经在使用 connman 管理网络&#xff0c;可以通过修…