开发工具
每当别人问你:
💦你在什么环境下写代码、调试、编译、链接代码?
🧑🏿Visual Studio 2022。VScode。IntelliJ IDEA。Eclipse...
对于上面这种环境,我们称之为集成开发环境(IDE)。然而,相比我们在 Linux 中大部分情况下,我们所使用的工具都是独立的工具 ------ 比如我们写代码用 vim、编译用 gcc/g++、调试用 gdb、维护项目关系用 make/Makefile 等。在Linux环境中,vim可谓是程序员们的老朋友了。
vi/vim 的区别简单说,它们都是多模式编辑器,不同的是 vim 是 vi 的升级版本,它不仅兼容 vi 的所有指令,而且还有一些新特性。例如语法高亮,可视化操作不仅可以在终端运行,也可以运行于 x window、 mac os、windows,所以这里我们学习 vim。
不过,vim 并不好学,学习成本较高,那为啥还要学习 vim 呢 ?------ 主要原因有两个:其一是 vim 用的比较广泛,当然其功能也是很强大,大成后可以完全摆脱鼠标的束缚,尤其是嵌入式软件开发工作者,在实际工作中,没有界面操作时,对终端的依赖程度十分高;其二是基本所有的 Linux 机器上都默认带有 vim 的,可以这么说,vim 只要熟练了,其它的文本编译器都不足为惧。vim 和 make/Makefile 使用的熟练度是衡量一个 Linux 程序员水平的一个很重要的东西。
1、vim的基本概念
vim 共有 12 种模式:six BASIC modes 和 six ADDITIONAL modes。
详细介绍三种常用模式:命令模式、插入模式和底行模式。
这是六种基本模式:
normal mode 正常模式
visual mode 可视化模式
command mode 命令模式
insert mode 插入模式 i / a / o
select mode 选择模式
ex mode 扩展模式
有六种附加模式。这些是基本模式的变体:
Operator-pending 模式 这类似于普通模式,但在操作符命令启动后,Vim 正在等待 {motion} 来指定操作符将要处理的文本。
Replace mode 替换模式 替换模式是插入模式的一个特例。可以执行与插入模式相同的操作,但对于您输入的每个字符,现有文本中的一个字符将被删除。
Virtual Replace mode 虚拟替换模式 虚拟替换模式与替换模式类似,但您替换的不是文件字符,而是屏幕空间。
Insert Normal mode 插入普通模式 在插入模式下按 CTRL-O 键进入。这类似于普通模式,但在执行一个命令后,Vim 将返回到插入模式。如果启用了"showmode"选项,则窗口底部将显示"--(插入)--"。
Insert Visual mode 插入可视模式 从插入模式开始可视选择时进入,例如,使用 CTRL-O 然后按"v"、"V"或 CTRL-V。当可视选择结束时,Vim 返回插入模式。如果"showmode"选项处于打开状态,则窗口底部将显示"--(插入)VISUAL --"。
Insert Select mode 插入选择模式 从插入模式启动选择模式时进入。例如,通过拖动鼠标或 <S-Right>。选择模式结束时,Vim 返回插入模式。如果"showmode"选项处于打开状态,则窗口底部会显示"-- (insert) SELECT --"。
mode-switching / 模式转换
如果出于某种原因你不知道自己处于哪种模式,你可以随时获得通过输入两次<Esc >返回正常模式。【这不适用于Ex模式 】
但是,使用" :visual "。当你看到屏幕闪烁或键入<Esc >后会听到铃声。但是,在插入模式下使用CTRL-O后按<Esc >会听到 "哔" 声,但您仍处于插入模式,请再次键入<Esc>以返回正常模式。
转换模式 | To 模式 | *i_esc * | |||||
---|---|---|---|---|---|---|---|
正常 | 可视 | 选择 | 插入 | 替换 | 命令行 | Ex | |
FROM 模式 | |||||||
正常 | v V ^V | * 4 | * 1 | R gR | : / ? ! | Q | |
可视 | * 2 | ^G | c C | - - | : | - - | |
选择 | * 5 | ^O ^G | * 6 | - - | - - | - - | |
插入 | <Esc> | - - | - - | <Insert> | - - | - - | |
替换 | <Esc> | - - | - - | <Insert> | - - | - - | |
命令行 | * 3 | - - | - - | :start | - - | - - | |
Ex | :vi | - - | - - | - - | - - | - - |
- - not possible
*1 通过输入命令" i "," I "," a "从普通模式进入插入模式," A "、" o "、" O "、" c "、" C "、" s " 或 S "。
*2 通过发出非移动命令从可视模式进入正常模式,执行命令,或者按 " v "," V "或" CTRL-V "(参见 | v_v |),它只会停止可视模式,而没有任何副作用。
*3 通过以下方式从命令行模式进入正常模式:
-
按 <CR >或<NL>,将执行输入的命令。
-
删除整行(例如,使用CTRL-U)并给出最后的<BS>。
-
按 CTRL-C 或 <Esc> 退出命令行而不执行命令。
在最后一种情况下, <Esc > 可能是使用 'wildchar' 选项定义的字符,在这种情况下它将启动命令行完成。您可以忽略它并再次输入<Esc >。{Vi: 当按下时,命令行被执行。这对大多数人来说是意料之外的;因此它被改变了。
在 Vim 中,当 <Esc > 是映射的一部分时,命令行执行。如果您希望在输入**<Esc > 时也使用 Vi 行为,请使用" :cmap ^V<Esc> ^V ^M" }
*4 通过以下方式从 正常模式 进入 选择模式 :
- 当 'selectmode' 包含 "mouse" 时,使用鼠标选择文本
- 使用不可打印的命令移动光标,同时保持 Shift 按下键,并且 "selectmode" 选项包含 "key"
- 当 'selectmode' 包含 "cmd" 时使用 " v "、" V " 或 " CTRL-V "
- 使用 " gh "、" gH " 或 " g CTRL-H " | g_CTRL-H |
*5 使用不可打印的命令从选择模式进入正常模式以移动光标,而无需按住 Shift 键。
*6 通过输入可打印字符从 选择模式 进入插入模式。选择内容被删除并且字符被插入。
如果"insertmode"选项打开,则编辑文件将在插入模式下开始。
*CTRL-_CTRL-N * *i_CTRL-_CTRL-N * *c_CTRL-_CTRL-N * *v_CTRL-_CTRL-N *
此外,命令 CTRL-\ CTRL-N 或 <C-\ > <CN > 可用于从任何其他模式进入正常模式。这可用于确保 Vim 处于正常模式,而不会像 <Esc > 那样发出蜂鸣声。然而,这不在 Ex模式下工作。在带有参数的命令(如 | f | 或 | m |)之后使用时,将应用使用 " ttimeoutlen" 设置的超时。
*CTRL-_CTRL-G * *i_CTRL-_CTRL-G * *c_CTRL-_CTRL-G * *v_CTRL-_CTRL-G *
当设置了 "insertmode" 时,可以使用命令 CTRL-\ CTRL-G 或 <C-\ > <CN> 进入插入模式。否则进入正常模式。这可以用来确保 Vim 处于 'insertmode'指示的模式,无需了解 Vim 当前处于什么模式。
* Q* * mode-Ex* * Ex-mode* * Ex* * EX* * E501*
Q :
切换到 "Ex"模式。 这有点像一个接一个地输入":"命令,不同之处在于:
-
您不必一直按":"。
-
屏幕不会在每个命令之后更新。
-
没有正常的命令行编辑。
-
不使用映射和缩写。
实际上,您正在使用"标准"行输入编辑命令(<Del > 或 <BS > 删除,CTRL-U 删除整行)编辑行。如果在命令行上以 "ex" 调用 Vim,它将默认进入此模式。
使用 ":vi" 命令 |:visual| 退出 "Ex"模式 。
注意:在旧版本的 Vim "Q"格式文本中,现在使用 |gq| 完成。但是,如果您使用
|vimrc_example.vim| 脚本,"Q"的工作方式与"gq"相同。
* gQ*
gQ :
像使用"Q"一样切换到 "Ex"模式 ,但实际上就像依次输入":"命令一样。所有命令行编辑、完成等均可用。
使用":vi"命令 |:visual| 退出 "Ex"模式。
{not in Vi}
===============================================================
2、vim的基本操作
三种常用模式:
1> vim拥有三种操作模式
命令行模式(Command Mode) :
当我们vim到某个文件时,默认进入的就是 命令模式。
实现光标的移动,字符、字或行的删除,移动、复制等编辑型操作。
插入模式(Insert Mode) :
自定义输入文本的模式 在命令模式下按下键盘'i' 'a' 'o' ---> -- INSERT -- 意味着进入了插入模式。
只有在插入模式下,才可以做文字输入。
底行模式 :
就是给文件做最后处理的模式。
其实,本来Vim只有命令模式和插入模式就可以了,但是,在命令行模式下,输入的命令不回显,有些命令回显比较好, 所以,又专门弄了一个底行模式,在这种模式下,输入的命令回显在编辑器的底部,所以叫底行模式。
三种模式的运行切换:
3、vim插入模式命令集
i / a / o 进入到插入模式
按「i」切换进入插入模式「insert mode」,按"i"进入插入模式后是从光标当前位置开始输入文件;
按「a」进入插入模式后,是从目前光标所在位置的下一个位置开始输入文字;
按「o」进入插入模式后,是插入新的一行,从行首开始输入文字。
「i」:i是从光标所在位置开始输入
「I」:I是光标所在行第一个非空白字符开始输入
「a」:a是从光标所在的下一个字符开始输入
「A」:A是从光标所在行的最后一个字符开始输入
「o」:o是从光标所在行的下一行新的一行开始输入
「O」:O是从光标所在行的上一行新的一行开始输入
「r」:r是取代光标所在的字符一次
「R」:R是依次取代光标所在字符
从插入模式切换为命令模式:按「ESC」键。
4、vim命令行模式命令集
移动光标
按「gg = G」: 自动排版
vim可以直接用键盘上的光标来上下左右移动,但正规的vim是用小写英文字母「h」、「j」、「k」、「l」,分别控制光标左、下、上、右移一格
按「G」:移动到文章的最后
按「 $ 」:移动到光标所在行的"行尾"
按「^」:移动到光标所在行的"行首"
按「w」:光标跳到下个字的开头
按「e」:光标跳到下个字的字尾
按「b」:光标回到上个字的开头
按「#l」:光标移到该行的第#个位置,如:5l,56l
按[gg]:进入到文本开始
按[G]:回到文件末尾
按[shift+g]:进入文本末端
按「ctrl」+「b」:屏幕往"后"移动一页
按「ctrl」+「f」:屏幕往"前"移动一页
按「ctrl」+「u」:屏幕往"后"移动半页
按「ctrl」+「d」:屏幕往"前"移动半页
按「v」:v是光标起始和结束之间的文本会被选中
按「V」:V是光标起始和结束之间的所有行被选中
按「ctrl」+「v」:Ctrl+v是光标起始和结束之间构成的矩形区域被选中
删除文字
「x」:每按一次,删除光标所在位置的一个字符
「#x」:例如,「6x」表示删除光标所在位置的"后面(包含自己在内)"6个字符
「X」:大写的X,每按一次,删除光标所在位置的"前面"一个字符
「#X」:例如,「20X」表示删除光标所在位置的"前面"20个字符
「dd」:剪切光标所在行
「#dd」:从光标所在行开始剪切#行
「d1G」:d1G是删除当前行前面的所有数据
「dG」:dG是删除当前行之后的全部数据
复制
「yw」:将光标所在之处到字尾的字符复制到缓冲区中。
「#yw」:复制#个字到缓冲区
「yy」:复制光标所在行到缓冲区。
「#yy」:例如,「6yy」表示拷贝从光标所在的该行"往下数"6行文字。
「y1G」:y1G是复制当前行前面的所有数据
「yG」:yG是复制当前行之后的全部数据
「p」:将缓冲区内的字符贴到光标所在位置。注意:所有与"y"有关的复制命令都必须与"p"配合才能完成复制与粘贴功能。
替换
「r」:替换光标所在处的字符。
「R」:替换光标所到之处的字符,直到按下「ESC」键为止。
撤销上一次操作
「u」:如果您误执行一个命令,可以马上按下「u」,回到上一个操作。按多次"u"可以执行多次回复。
「ctrl + r」: 撤销的恢复,反撤销。
「.(小数点)」: 重复上一个动作。
更改
「cw」:更改光标所在处的字到字尾处
「c#w」:例如,「c3w」表示更改3个字
跳至指定的行
「ctrl」+「g」列出光标所在行的行号。
「#G」:例如,「15G」,表示移动光标至文章的第15行行首
5、vim底行模式命令集
在使用低行模式之前,请记住先按「ESC」键确定您已经处于正常模式,再按「:」冒号即可进入末行模式。
保存文件
「w」 保存
「q」 退出
「wq」 保存并退出
「q!」 强制退出
「wq! 」 强制保存并退出
列出行号
「set nu」 临时显示行数
跳到文件中的某一行
「#」:「#」号表示一个数字,在冒号后输入一个数字,再按回车键就会跳到该行了,如输入数字15,再回车,就会跳到文章的第15行。
搜索
「/aslord」 全文搜索"aslord"
「n」 查找下一个
「N」 查找上一个
「/关键字」: 先按「/」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按
「n」会往后寻找到您要的关键字为止。
「?关键字」:先按「?」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直
按「n」会往前寻找到您要的关键字为止。
替换
「s/old/new/g」 将光标所在行中的old 替换成 new
「%s/old/new/g」 将全文的old 替换成 new --->一句话替换变量名/函数名
6、vim参数列表
$ vim --help
VIM - Vi IMproved 8.2 (2019 Dec 12, compiled Oct 01 2021 01:51:08)
用法: vim [参数] [文件 ..] 编辑指定的文件
或: vim [参数] - 从标准输入(stdin)读取文本
或: vim [参数] -t tag 编辑 tag 定义处的文件
或: vim [参数] -q [errorfile] 编辑第一个出错处的文件
参数:
-- 在这以后只有文件名
-v Vi 模式 (同 "vi")
-e Ex 模式 (同 "ex")
-E Improved Ex mode
-s 安静(批处理)模式 (只能与 "ex" 一起使用)
-d Diff 模式 (同 "vimdiff")
-y 容易模式 (同 "evim",无模式)
-R 只读模式 (同 "view")
-Z 限制模式 (同 "rvim")
-m 不可修改(写入文件)
-M 文本不可修改
-b 二进制模式
-l Lisp 模式
-C 兼容传统的 Vi: 'compatible'
-N 不完全兼容传统的 Vi: 'nocompatible'
-V[N][fname] Be verbose [level N] [log messages to fname]
-D 调试模式
-n 不使用交换文件,只使用内存
-r 列出交换文件并退出
-r (跟文件名) 恢复崩溃的会话
-L 同 -r
-A 以 Arabic 模式启动
-H 以 Hebrew 模式启动
-T <terminal> 设定终端类型为 <terminal>
--not-a-term Skip warning for input/output not being a terminal
--ttyfail Exit if input or output is not a terminal
-u <vimrc> 使用 <vimrc> 替代任何 .vimrc
--noplugin 不加载 plugin 脚本
-p[N] 打开 N 个标签页 (默认值: 每个文件一个)
-o[N] 打开 N 个窗口 (默认值: 每个文件一个)
-O[N] 同 -o 但垂直分割
+ 启动后跳到文件末尾
+<lnum> 启动后跳到第 <lnum> 行
--cmd <command> 加载任何 vimrc 文件前执行 <command>
-c <command> 加载第一个文件后执行 <command>
-S <session> 加载第一个文件后执行文件 <session>
-s <scriptin> 从文件 <scriptin> 读入正常模式的命令
-w <scriptout> 将所有输入的命令追加到文件 <scriptout>
-W <scriptout> 将所有输入的命令写入到文件 <scriptout>
-x 编辑加密的文件
--startuptime <file> Write startup timing messages to <file>
-i <viminfo> 使用 <viminfo> 取代 .viminfo
--clean 'nocompatible', Vim defaults, no plugins, no viminfo
-h 或 --help 打印帮助(本信息)并退出
--version 打印版本信息并退出
7、简单vim配置
1> 打开vim的配置文件的位置
sudo vim /etc/vim/vimrc
在目录 /etc/ 下面,有个名为vimrc的文件,这是系统中公共的vim配置文件,对所有用户都有效。
而在每个用户的主目录下,都可以自己建立私有的配置文件,命名为:".vimrc"。例如,/root目录下,通常已经存在一个.vimrc文件,如果不存在,则创建之。
切换用户成为自己执行 su ,进入自己的主工作目录,执行 cd ~
打开自己目录下的.vimrc文件,执行 vim .vimrc
2> 去到文件末尾,并添加以下内容
set mouse=a
set number
set cindent
set st=4
set sw=4
set sts=4
3> 保存并退出
解释:
1>set mouse=a --->vim中可以用鼠标控制光标
2>set number --->显示行号
3>set cindent --->C语言的编程缩进格式
4>三位一体 : --->设置你的tab,一个tab=4个空格
set st=4
set sw=4
set sts=4
其他:
设置语法高亮: syntax on
显示行号: set nu
设置缩进的空格数为4: set shiftwidth=4
mf:快捷键自动生成初始化代码
map mf i#include <stdio.h><Esc><Esc>oint main(int argc, char *argv[])<Esc>o{<Esc>oreturn 0;<Esc>o}<Esc>2ko
另外,我的资源中免费上传了Vim中文手册,需要的朋友自取。
以上。
我是一个十分热爱技术的程序员,希望这篇文章能够对您有帮助,也希望认识更多热爱程序开发的小伙伴。
感谢!