Linux 系统中的 vim 是一款具有多模式的文本编辑器,它有三种主要模式:命令模式、插入模式和底行模式,还有一些特定模式如:替换模式、可视模式(V-BLOCK)。
语法:vim [选项] [文件名]
功能:选择 vim 的打开方式
常用选项:
vim -d [文件名1] [文件名2]
:对比两个文件(进入 diff 模式)vim -c "oldfiles
:显示最近打开的文件列表其它操作:
vim [文件名1] [文件名2] [文件名3] ...
同时打开多个文件进入 vim 时的模式默认是命令模式,在命令模式下可以快速编辑如光标移动、内容操作等命令,并且输入大多数命令之前都可以加上数字进行批量或更精确的操作。
vim 插入模式用于编写文件,在命令模式下按住下面其中一个功能键可以进入该模式:
返回命令模式只需按一下 Esc 键即可。
vim 底行模式可用于与 shell 交互、整体界面操作等等,在命令模式下使用 shift+;
即 :
可进入,使用 Esc 返回命令模式。
/[关键字]
(可在命令模式下使用):向下搜索(n 下找,N 上找)
?[关键词]
(可在命令模式下使用):向上搜索(n 上找,N 下找)
:s/旧内容/新内容
:替换当前行第一个匹配
:s/旧内容/新内容/g
:替换当前行所有匹配
:%s/旧内容/新内容/g
:全局替换(末尾加 c 进入细分替换)
:vs [文件名]
:添加可操作的文件,使其多文件操作
Ctrl + w + w
:循环切换窗口
:e [文件名]
:打开新文件(不关闭当前文件)
:split
或 :sp
:水平分割分屏
:vsplit
或 :vsp
:垂直分割分屏
Ctrl + w + h/j/k/l
:向左/下/上/右切换窗口
:w
:保存文件:q
:退出文件:%!xxd
:将文件以十六进制和 ASCII 字符混合的形式显示:%!xxd -r
:在 :%!xxd
格式后恢复原始格式在 vim 中直接执行 shell 命令:
:![命令]
:执行 shell 命令(如 :!ls -l
):r ![命令]
:将命令输出插入到当前光标位置(如 :r !date
):w !sudo tee %
:用 sudo 权限保存当前文件(无写权限时常用):ls
:列出所有已打开的文件缓冲区:b [编号]
或 :b [文件名]
:切换到指定缓冲区(通过 :ls 查看编号):bn
:切换到下一个缓冲区:bp
:切换到上一个缓冲区:wq
或 :x
:保存并退出:q!
:不保存强制退出:wa
+ :qa
:保存所有文件并退出可视模式允许玩家批量选择操作文件,在命令模式下使用不同命令进入不同类型的可视模式:
Ctrl + v:进入块可视模式
v:进入字符可视模式
V:进入行可视模式
在可视模式中,选中对应区域后可用 y(复制)、d(删除)、p(粘贴) 等操作,Esc 可以返回命令模式。
如果想要按照行批量插入字符,只允许在块可视模式下先选择区域,使用 shift+i
进入插入模式编写后,再 Esc 返回到命令模式才能生效。
在命令模式中使用 shift + r
可以进入替换模式,批量化替换光标位置字符,Esc 返回。
要配置好看的 vim,原生的配置可能功能不全,可以选择安装插件来完善配置,但要保证用户是自己需要配置的用户。
想了解 vim 更多的读者可以看看这些大佬的文章:
Vim配置和使用
Vim 从入门到精通
手把手教你把Vim改装成一个IDE编程环境(图文)
Linux系列讲解 —— VIM配置与美化
vim配置工具 vimplus 下载地址:vimplus
gcc 和 g++ 都是 GNU 编译器集合(GCC)中的重要工具,可以编译 C(gcc) 和 C++(g++) 代码,但两者之间存在一些明显的区别。
语法:
gcc [选项] [源文件] ... -o [输出文件]
g++ [选项] [源文件] ... -o [输出文件]
功能:gcc 将 .c 文件编译成可执行文件,g++ 将 .cpp 文件编译成可执行文件。
常用选项:
预处理选项:
编译选项:
优化选项:
调试选项:
链接选项:
警告选项:
语言标准选项:
其它选项:
在使用 gcc/g++ 编译代码时,选项部分加上 -E
即可生成预编译后的代码,此时文件后缀一般规定(在 Linux 下)为 .i
。
在预编译期间,gcc/g++ 会处理基础性任务,如:条件编译、宏替换、移除注释等等,生成一个干净的代码文本。
条件编译的用途:
在使用 gcc/g++ 编译代码时,选项部分加上 -S
即可生成汇编代码,此时文件后缀一般规定(在 Linux 下)为 .s
。
为什么 gcc/g++ 要先编译成汇编代码? 因为需要减少编译成本,如果直接编译成二进制执行的命令,需要自己处理表达的二进制可能出现的 bug, 而编译成汇编代码(汇编代码比二进制代码更易读)可以更容易的排错并使用已经成熟的方法来减少成本。
在使用 gcc/g++ 编译代码时,选项部分加上 -c
即可生成二进制代码,此时文件后缀一般规定(在 Linux 下)为 .o
。
此时生成的文件内容已经可以被系统识别(目标文件)。但是一般情况下,文件中的有些执行方法是不全的,文件只给了方法的链接地址,编译器还需要通过链接将执行方法找到并将链接地址替换为具体的找到方法执行的地址,此时文件才可以称得上是可执行文件。
目标文件是制作动态库与静态库的前提。
在使用 gcc/g++ 编译代码时,选项部分不填默认是将文件直接执行编译 1->2->3->4 这4个步骤生成可执行文件。
链接步骤会将文件链接对应的库文件,最后形成可执行文件。
库文件是一套方法或数据集,为其他程序员开发提供最基本的接口与功能,帮助其二次开发。
库文件分类:
链接实行方法:文件链接库文件时,链接地址替换为能找到库中方法的地址。
对于静态库,文件中需要的方法会直接拷贝静态库中的方法,执行时只需调用自己拷贝的那份。
对于动态库,文件中需要的方法只会拷贝找到动态库方法的地址,执行时会寻找动态库的方法。
动静态库对比:
动态库本质作用是将语言层面公共的代码,在内存中确保只出现一份,从而节省资源。
从编译行为上说,gcc 编译 C语言代码, g++ 编译 C++代码,但是 g++ 也可以编译 C语言的代码,gcc 想要编译 C++代码需要显示链接 C++标准库(-lstdc++
)。
从文件扩展名上说,gcc 只会处理后缀 .c
文件,g++ 可以处理 .cpp
也可以处理 .c
文件。
注意:使用 gcc 编译 C++代码,一般不会通过 C++ 具有的特性如:类、模版等用法。
对于两者命令行中的选项,除开标准库选项的使用,大部分选项两者都可以共用。