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查找上一个;
  • ?反向查找,在这个模式下nN的方向会相反;
  • %跳转到匹配的括号;
  • 替换指令
    • :/s/old/new将字符串old替换为new,只会替换一个;
    • :/s/old/new/g将当前行的字符串old替换为new
    • #,#s/old/new/g将两行之间的字符串进行替换,#需要用数字代替;
    • %s/old/new/g将文件中所有字符串进行替换;
    • %s/old/new/gc将文件中所有字符串进行替换,但每次替换前进行询问;
  • 搜索选项:通过命令:set来设置搜索选项
    • icignorecase:忽略大小写
    • isincsearch:显示部分匹配

光标移动

  • ctrl+G显示当前光标所在文件的位置;
  • G跳转到文件尾部,gg跳转到文件的第一行;
  • [数字] G跳转到指定行,可以配合ctrl+G使用;
  • ctrl+O返回上一个位置,ctrl+I去下一个位置(配合跳转指令方便阅读代码

撤销、重做

  • u撤销;U撤销在当前行的所有操作;
  • ctrl+R重做;

系统级交互命令

  • 在命令模式下,:!后跟任何命令行的命令,都可以在不退出文件编辑的情况下执行;
  • :w <filename>将目前文件另存为;
  • 选择后可以使用:wd等命令来另存为和删除;
  • :r <filename>将外部文件插入到光标的下一行;
  • :r !<command>执行命令,并将内容插入到光标下一行;

Vim配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
call plug#begin('~/.vim/plugged')
Plug 'joshdick/onedark.vim'
call plug#end()

" 关闭对vi的兼容
set nocompatible
" 设置backspace键功能
set backspace=eol,start,indent
" 显示行号
set number
" 高亮显示当前行
set cursorline
" 让一行的内容不换行
set nowrap
" 距窗口边缘还有多少行时滚动窗口
set scrolloff=8

" 显示标尺,提示一行代码不要超过80个字符
set ruler
set colorcolumn=80
" tab设为4个空格
set tabstop=4
set shiftwidth=4
set softtabstop=4
set expandtab
set smarttab
" 新一行与上一行的缩进一致
set autoindent
" 显示括号匹配
set showmatch
" 高亮查找匹配
set hlsearch
" 增量式搜索
set incsearch
" 不区分大小写,除非含有大写字母
set ignorecase
set smartcase
" 开启语法高亮
syntax on
" 代码颜色主题
set t_Co=256
colorscheme onedark
" 在右下角显示部分命令
set showcmd
" 命令可以用tab补全,并设置匹配规则
set wildmenu
set wildmode=list:longest,full
" 显示tab和行尾多余的空格
set list
set listchars=tab:>·,trail:·

CMake笔记

CMake同样是跟着官方教程来的,随着使用可能会添加更多内容。

CMake语法

project

指定当前项目名、版本号、描述等信息。

1
2
3
4
5
project(<PROJECT-NAME>
[VERSION <major>[.<minor>[.<patch>[.<tweak>]]]]
[DESCRIPTION <project-description-string>]
[HOMEPAGE_URL <url-string>]
[LANGUAGES <language-name>...])

cmake_minimum_required

在每个CMake文件开头,指定CMake版本的最小值。

1
cmake_minimum_required(VERSION <min>[...<policy_max>] [FATAL_ERROR])

add_executable

添加一个可执行的目标文件

1
add_executable(<name> <options>... <sources>...)

set/unser

设置变量的值,如果没有指定value参数,则相当于取消设置变量(unset)。

1
set(<variable> <value>... [PARENT_SCOPE])

configure_file

将文件复制到另一个目录,并修改其内容。

1
2
3
4
5
configure_file(<input> <output>
[NO_SOURCE_PERMISSIONS | USE_SOURCE_PERMISSIONS |
FILE_PERMISSIONS <permissions>...]
[COPYONLY] [ESCAPE_QUOTES] [@ONLY]
[NEWLINE_STYLE [UNIX|DOS|WIN32|LF|CRLF]])

inputoutput指定输入输出文件的位置,均为相对位置,input路径相对值为CMAKE_CURRENT_SOURCE_DIRoutput路径相对值为CMAKE_CURRENT_BINARY_DIR

教程中用到的转化文件为头文件,语法为宏定义中的两个@符:

1
2
3
// the configured options and settings for Tutorial
#define Tutorial_VERSION_MAJOR @Tutorial_VERSION_MAJOR@
#define Tutorial_VERSION_MINOR @Tutorial_VERSION_MINOR@

会将宏定义替换为CMake的变量。

target_include_directories

指定生成目标的头文件路径,<target>变量必须先通过 add_executable或 add_library来定义。

1
2
3
target_include_directories(<target> [SYSTEM] [AFTER|BEFORE]
<INTERFACE|PUBLIC|PRIVATE> [items1...]
[<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])

add_library

添加一个库。

1
add_library(<name> [<type>] [EXCLUDE_FROM_ALL] <sources>...)

<type>变量可以是:

  • STATIC:静态库
  • SHARED:动态连接库
  • MODULE:模块库

add_subdirectory

添加一个子目录,子目录下也需要有一个CMakelist文件。

1
add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL] [SYSTEM])

为生成目标制定连接库,<target>同样也要事先声明。

1
target_link_libraries(<target> ... <item>... ...)

option

创建一个用户可以指定值的布尔类型选项。

1
option(<variable> "<help_text>" [value])

在教程中,是这样使用的 :

1
option(USE_MYMATH "Use tutorial provided math implementation" ON)

这样就可以通过命令行来指定这个USE_MYMATH选项的值(指定后,下次编译无需再设置,会保留直到下次修改):

1
cmake ../Step2 -DUSE_MYMATH=OFF

if

条件判断,括号里可以跟着条件语法,包括ANDORLESS等等。

target_compile_definitions

为构建目标添加一个宏定义,相当于在头文件中定义#define

1
2
3
target_compile_definitions(<target>
<INTERFACE|PUBLIC|PRIVATE> [items1...]
[<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])

CMake命令

-S:用于指定源码目录

1
cmake -S build

-B:用于指定构建目录

1
cmake -B .

-D:用于设置CMake变量

1
cmake -DVAR_NAME=VALUE path_to_source_directory

–build:用于执行构建

1
cmake --build <path_to_build_dir>

常见变量

  • PROJECT_NAME:项目名;
  • PROJECT_SOURCE_DIR:项目源文件文件夹的绝对路径;
  • PROJECT_BINARY_DIR:项目生成文件夹的绝对路径;
  • CMAKE_CXX_STANDARD:设置C++标准;
  • CMAKE_CXX_STANDARD_REQUIRED:设置是否必须要符合设置的C++标准;

Vim_and_CMake_notes
http://zhouhf.top/2025/03/06/工具/Vim-and-CMake-notes/
作者
周洪锋
发布于
2025年3月6日
许可协议