Vim_and_CMake_notes
最近终于完成密码学可视化的小程序,然后又帮导师写了几天国自然的本子,终于有时间忙里偷闲学点东西。之前就听说CS144:《Introduction to Computer Networking》的课程和项目质量都很高,于是开始着手做一下。
在此之前,先需要配置环境。课程要求项目在Ubuntu 24.04上运行(其实应该其他版本也可以,只要g++、CMake等运行环境对就行),但是为了方便起见,还是安装了Ubuntu桌面版的虚拟机,然而我发现不论怎么调整虚拟机的配置,运行起来都很卡。没办法,我只能改用Ubuntu Server。
这就引来新的问题,没有图形化界面要如何编程,etc。此外,感觉CS144的项目体积适中,方便学习Cpp的项目构建。于是便有了这篇博客,记录vim和CMake的命令、语法等。考虑长期更新,特别是Vim部分。
Vim笔记
Vim基本操作
这部分主要是跟着Vim自带的vimtutor
学习的笔记。
移动
$
代表当前行的末尾,可以配合d
等命令使用;0
代表当前行的开头,可以配合d
等命令使用;w
代表下个单词的开头;e
代表这个单词的结尾;
插入
-
按
i
进入插入模式;按I
进入插入模式,但是从此行开头开始; -
按
A
进入插入模式,但是从此行末尾开始;按a
进入插入模式,但是从当前光标之后开始; -
按
o
在下一行插入一行空行,并进入插入模式;按O
在上一行插入空行。
删除
- 按
x
删除当前光标闪烁处的字符,相当于键盘的delete
(不是Backspace
); - 更高级的做法是按d,可以接受更复杂的参数:
dd
删除整行;de
删除到当前单词末尾;dw
删除到下个单词的开头;- 中间可以加数字,表示重复多少次,例如:
d3d
,删除三行;d2w
从光标开始删除两个单词;
复制、黏贴
v
进入Visual模式,相当于鼠标拖动的选择;- 按
p
将刚刚删除的内容插入到光标后,如果刚刚删除了一整行,则会插入到光标的下一行; - 按
y
复制内容;p
黏贴内容
查找、替换
r
替换当前字符(先删除后进入插入模式,相当于x
+i
);R
连续替换字符;c
删除连续的字符,可以像d
命令一样配合数字和方向使用(同样,相当于d
+i
);/
正向查找,查找后按n
查找下一个,N
查找上一个;?
反向查找,在这个模式下n
和N
的方向会相反;%
跳转到匹配的括号;- 替换指令
:/s/old/new
将字符串old
替换为new
,只会替换一个;:/s/old/new/g
将当前行的字符串old
替换为new
;#,#s/old/new/g
将两行之间的字符串进行替换,#
需要用数字代替;%s/old/new/g
将文件中所有字符串进行替换;%s/old/new/gc
将文件中所有字符串进行替换,但每次替换前进行询问;
- 搜索选项:通过命令
:set
来设置搜索选项ic
、ignorecase
:忽略大小写is
、incsearch
:显示部分匹配
光标移动
ctrl+G
显示当前光标所在文件的位置;G
跳转到文件尾部,gg
跳转到文件的第一行;[数字] G
跳转到指定行,可以配合ctrl+G
使用;ctrl+O
返回上一个位置,ctrl+I
去下一个位置(配合跳转指令方便阅读代码)
撤销、重做
u
撤销;U
撤销在当前行的所有操作;ctrl+R
重做;
系统级交互命令
- 在命令模式下,
:!
后跟任何命令行的命令,都可以在不退出文件编辑的情况下执行; :w <filename>
将目前文件另存为;- 选择后可以使用
:w
、d
等命令来另存为和删除; :r <filename>
将外部文件插入到光标的下一行;:r !<command>
执行命令,并将内容插入到光标下一行;
Vim配置
1 |
|
CMake笔记
CMake同样是跟着官方教程来的,随着使用可能会添加更多内容。
CMake语法
project
指定当前项目名、版本号、描述等信息。
1 |
|
cmake_minimum_required
在每个CMake文件开头,指定CMake版本的最小值。
1 |
|
add_executable
添加一个可执行的目标文件
1 |
|
set/unser
设置变量的值,如果没有指定value
参数,则相当于取消设置变量(unset
)。
1 |
|
configure_file
将文件复制到另一个目录,并修改其内容。
1 |
|
input
和output
指定输入输出文件的位置,均为相对位置,input
路径相对值为CMAKE_CURRENT_SOURCE_DIR
,output
路径相对值为CMAKE_CURRENT_BINARY_DIR
。
教程中用到的转化文件为头文件,语法为宏定义中的两个@
符:
1 |
|
会将宏定义替换为CMake的变量。
target_include_directories
指定生成目标的头文件路径,<target>
变量必须先通过 add_executable或 add_library来定义。
1 |
|
add_library
添加一个库。
1 |
|
<type>
变量可以是:
STATIC
:静态库SHARED
:动态连接库MODULE
:模块库
add_subdirectory
添加一个子目录,子目录下也需要有一个CMakelist
文件。
1 |
|
target_link_libraries
为生成目标制定连接库,<target>
同样也要事先声明。
1 |
|
option
创建一个用户可以指定值的布尔类型选项。
1 |
|
在教程中,是这样使用的 :
1 |
|
这样就可以通过命令行来指定这个USE_MYMATH
选项的值(指定后,下次编译无需再设置,会保留直到下次修改):
1 |
|
if
条件判断,括号里可以跟着条件语法,包括AND
、OR
、LESS
等等。
target_compile_definitions
为构建目标添加一个宏定义,相当于在头文件中定义#define
。
1 |
|
CMake命令
-S:用于指定源码目录
1 |
|
-B:用于指定构建目录
1 |
|
-D:用于设置CMake变量
1 |
|
–build:用于执行构建
1 |
|
常见变量
- PROJECT_NAME:项目名;
- PROJECT_SOURCE_DIR:项目源文件文件夹的绝对路径;
- PROJECT_BINARY_DIR:项目生成文件夹的绝对路径;
- CMAKE_CXX_STANDARD:设置C++标准;
- CMAKE_CXX_STANDARD_REQUIRED:设置是否必须要符合设置的C++标准;