# **1. 编辑器** ## **1.1 图形编辑器** 平时常见的编辑器都是图形编辑器,比如记事本、notepad、office、wps等,图形编辑器的意思就是这些编辑器带有图形界面,有菜单选项。比如最简单的Windows的记事本: ![](images/WEBRESOURCEaf43058e62b1433f8f86ddae338e1a9a截图.png) 记事本 当然,编程时不可能使用记事本来写代码,常用的专业编程IDE有vsCode、qtCreator等,常用的专业编辑器有sumlime、notepad++、vim等,它们各有所长。其中,在嵌入式开发领域,vim是不可或缺的一款字符界面型的高效编辑器,下面着重来介绍vim的安装和使用。 ## **1.2 字符编辑器vi** 字符编辑器的意思是这种编辑器没有提供图形界面,因此也不需要用鼠标去点击菜单栏,字符编辑器的所有操作都是只需键盘就能达到的,这种设定可以让人在编程时注意力专注于代码,将程序思维直接流向键盘,行云流水,无需任何多余的菜单、鼠标的干扰,极大提高效率。在字符编辑器中,vi就是其中的典型代表。 ![](images/WEBRESOURCE166fbcc666024e3c83bcb4a876265bfc截图.png) ### **vim的安装** 编辑器vi是Ubuntu系统默认已经安装好了的,但vi的初始版本功能各方面都较弱,一般都需要升级到vim版本,下载安装vim版本的命令是: ```shell gec@ubuntu:~$ sudo apt install vim ``` 安装完毕之后,还可以在vim的配置文件中设置一些常用的选项: ```c gec@ubuntu:~$ sudo gedit /etc/vim/vimrc ... 49 "set showmatch " Show matching brackets. 50 "set ignorecase " Do case insensitive matching 51 "set smartcase " Do smart case matching 52 "set incsearch " Incremental search 53 "set autowrite " Automatically save 54 "set hidden " Hide buffers 55 set mouse=a " Enable mouse usage (all modes) 56 set cindent 57 set number 58 59 " Source a global configuration file if available 60 if filereadable("/etc/vim/vimrc.local") 61 source /etc/vim/vimrc.local 62 endif ``` - 注意: > set mouse=a 代表开启鼠标追踪 > set cindent 代表开启自动缩进 > set number 代表显示行号 这个没有菜单的编辑器,当我们需要执行诸如保存、查找、替换、剪切等等动作的时候怎么办呢?答案是将键盘的输入分成两种模式:一种模式下键盘敲入的就是编辑的内容,另一种模式下键盘敲入的是要编辑器完成的动作。简而言之,vim需要两个操作模式: - 一个模式下键入的信息,作为文本本身的内容,称之为编辑模式. - 一个模式下键入的信息,作为执行的动作,称之为命令模式。 这两种模式的转换: - 默认打开 vi 的时候,进入了命令模式 - 从命令模式,进入编辑模式:按i、a、o、I、O…… - 从编辑模式,进入命令模式:按Esc 编辑模式没什么好研究的,主要是命令模式,熟练使用vi/vim实际上指的是熟练掌握命令模式中,vi所能支持的命令都有哪些?答案如下。 ### **vim常用指令** | vim命令 | 含义 | | -- | -- | | :w | 保存当前文件 | | :w filename | 另存为 filename | | :q | 退出当前正在编辑的文件 | | :q! | 强制退出当前正在编辑的文件并放弃最近一次保存到现在的所有操作 | | :wq | 保存文件并退出 | | u | 撤销最近一次操作。 | | ctrl+r | 前进一步,恢复撤销掉的操作 | | i | 在光标所在的位置前面插入字符 | | a | 在光标所在的位置后面插入字符 | | o | 在光标所在行的下一行插入新的一行 | | O | 在光标所在行的上一行插入新的一行 | | x | 剪切光标处所在的字符。(x前可先按一个数字,则剪切若干个字符) | | dd | 剪切光标处所在的一行。(dd前可先按一个数字,则剪切若干行) | | yy | 复制光标处所在的一行。(yy前可先按一个数字,则复制若干行) | | d$ | 剪切从光标处(含)开始到该行行末的所有字符 | | d^ | 剪切从光标处(不含)开始到该行行首的所有字符 | | y$ | 复制从光标处(含)开始到该行行末的所有字符 | | y^ | 复制从光标处(不含)开始到该行行首的所有字符 | | p | 将剪切板中的资料粘贴到光标所在下一行 | | r | 修改光标所在的字符,r之后接跟你要修正的字符(比如你要把fox中的o改成i,只需将光标停在o上,接着连续按下r和i) | | h | 将光标向前移动一个字符 | | j | 将光标向下移动一个字符 | | k | 将光标向上移动一个字符 | | l(小写L) | 将光标向后移动一个字符 | | gg | 跳到文本的最初一行 | | G | 跳到文本的最末一行 | | Ctrl + u | 向上(up)翻页 | | Ctrl + d | 向下(down)翻页 | | :%s/old/new | 将文件中所有的old字符串替换成new | | /string | 从光标处往下查找字符串string,注意在输完你要查找的字符串string之后要按回车键。如果你要找的字符串string有多个,你可以按n将光标跳到下一个位置,按N将光标跳到上一个位置 | | ?string | 跟上面的是一样的,区别是它从光标处往上查找 | # 「课堂练习2」 使用 vi 创建一个最简单C语言程序。练习诸如剪切、粘贴、复制、保存、撤销、恢复撤销、替换等技巧,熟练切换 vi 模式和普通模式。 ![](images/WEBRESOURCE778e6bbd547a49f7a27408810d3e357d截图.png) # **2. 编译器gcc** ![](images/WEBRESOURCEab3791f6ea2d4ee1a800caaf9d9c809a截图.png) 名称:GNU Compiler Collection(gcc),即GNU编译器套件。 简介:gcc是一套由 GNU 开发的编程语言编译器。它是一套以 GPL 及 LGPL 许可证所发行的自由软件,也是 GNU计划的关键部分,亦是自由的类Unix 及苹果 MacOS 操作系统的标准编译器,主要用与完成C语言的编译功能。 ![](images/WEBRESOURCE483559e02d97418681caca2ce4ce7003image.png) 用法: ``` // 安装最新的版本: gec@ubuntu:~$ sudo apt install gcc -y // 查看编译器的版本: gec@ubuntu:~$ gcc -v // 将源码 a.c 编译生成程序 a gec@ubuntu:~$ gcc a.c -o a gec@ubuntu:~$ gcc -o a a.c // 编译源码的时候打开所有的警告 gec@ubuntu:~$ gcc a.c -o a -Wall // 将源码 a.c 编译生成默认名称的程序 a.out gec@ubuntu:~$ gcc a.c //默认生成a.out文件,所有的源文件默认生成文件名称都是a.out ``` 释义: -v:查看编译器版本 -o:指定编译后生成的程序名 -Wall:打开所有警告,注意W是大写的,意为 all Warning ## C语言程序由源代码到可执行程序的过程: 预处理-->编译-->汇编-->链接 选项:-E -S -c -o 文件后缀:.i .s .o .elf 预处理阶段主要完成预处理工作:处理以#开头的代码,如将头文件(#include)展开,将宏定义(#define)进行替换,将预处理指令(#if)按条件进行增删代码。 编译阶段主要完成代码的编译工作:检查代码中的语法问题 汇编阶段主完成汇编编译代码工作:将代码编译为汇编编译程序(二进制文件) 链接阶段主要完成程序文件的链接工作:将程序中所使用的库文件进行连接,此时所产生的文件即是最终的可执行程序 ![](images/WEBRESOURCE90052f7e84d296350dc684c5f8d9fe79image.png)