滚屏和跳转
G 光标移动到文件底部
gg 光标移动到文件顶端
50% 光标跳转到文件 50% 处
zt 光标行显示在顶端
zz 光标行显示在中间
zb 光标行显示在底部
H 光标移动到顶端
M 光标移动到中间
L 光标移动到底部
<C-e> 向下滚动
<C-y> 向上滚动
<C-u> 向上翻页,半页
<C-d> 向下翻页,半页
<C-b> 向上翻页,整页
<C-f> 向下翻页,整页
寄存器
将包含指定文本的行复制到寄存储中:
let @a = ''
:g/buffer/yank A
:new
"ap
-
查看寄存器中的值:
:echo @a
-
查看选项中的值:
-
方法一:
:echo &runtimepath
-
方法二:
:options
-
折叠的使用方法
查看折叠方法::set foldmethod
设置折叠方法::set foldmethod=marker
可选的折叠方法:
-
marker,标记
-
syntax,语法
-
manual,手动
-
indent,缩进
-
diff,未改变的文本
-
expr,见文档
通过帮助系统查看有关折叠的快捷键::h z
在 normal
模式下使用:
zM 递归的折叠所有部分
zR 展开所有折叠的部分(包括递归)
zm 增加一层(:h foldlevel)折叠
zr 减去一层折叠
zc 打开光标下的折叠
za 打开/关闭光标下的折叠
zj 去到下一个折叠上
zk 去到上一个折叠上
获取指定目录下的所有文件的路径
windows
在 Windows 下:
-
:r! dir /b /s src/
-
选中读取的内容,依据文件的后缀进行排序
:'<,'>sort /.*\.h/ r
开头为 "
的行排在一起
:'<,'>g/"Plug/move 165
查找替换 : substitute, find, replace
替换多个文件中指定文本
-
被替换者:
test_123
-
替换者:
new_123
-
使用
new_123
替换在同一个目录<dir>
中的所有h文件
中的test_123
:
:cd <dir>
:args *.h
:argdo %s/test_123/new_123/ge | update
上面命令的解释:
argdo
对所有在args
中的文件执行后面的命令%s/被替换者/替换者/ge
g
整个文件的所有符合条件者都被替换e
没有找到的情况,不报错|
用于执行多个命令update
保存对文件执行的操作(只对已经修改的缓冲有效)
替换换行符
-
在 Windows 下;
:%s/\n/ /g
-
将
;
替换为换行符::%s/;/\r/g
查找:包含 .md
的目标被排除
^\w\+.*\.\(md\)\@!
解释:找到所有文件类型不为 md 的行
例子:
abc.md 排除
abc.txt 包含
test.cpp 包含
option 的设置
-
一个布尔选项,表示开启:
set imd
-
表示取消:
set noimd
缓冲设置
创建一个临时缓冲
缓冲不可保存,可以退出,在退出程序时,内容将丢失:
command! Scratch enew | setlocal buftype=nofile bufhidden=wipe noswapfile modifiable
pwsh(powershell) 使用方法
将 vim 的默认 shell 设置为 pwsh
:
set shell=pwsh
set shellcmdflag=-Command
引用自:https://juliankay.com/development/setting-up-vim-to-work-with-powershell/
找到指定目录下的所有 cpp 文件,然后从中找到包含字符串 include 的文件:
- 使用 pwsh 作为 shell:
r!get-childitem -path path\to\src\*.cpp | select-string -pattern "include"
将行移动到标记位置
:move 'a
查看窗口的大小(宽度,高度),修改窗口大小的方法。
-
调整当前窗口(称为 A,其它的为 B,C,...)的高度,
:resize
-
当前列有两个窗口:B 变为一行,A 占据其余高度;
-
当前列有三个窗口:B,C 变为一行,A 占据其余高度;
据此可以知道,更多窗口的效果;
使用 CTRL-W =
在所有窗口均匀分布;
:resize 10
调整当前窗口的高度为 10;
调整窗口的宽度
:vertical resize 20
窗口宽度调整为 20;
vimrc 基础配置
!
leader
键为空格
" 时间:2024年7月26日
" vim 的配置,用标记折叠的方式组织起来,感觉很好
"-------------------------------------------------------------------------------
"# 基础设置(没有任何依赖项) {{{
"-------------------------------------------------------------------------------
"tags: basic setting
"查看选项的具体效果,请使用 `:help <option-name>`
"## option 设置 {{{
"-------------------------------------------------------------------------------
":options
"Options:
" 自动加载脚本autoload-plugin
"packloadall " 加载所有插件
"silent! helptags ALL " 为所有插件加载帮助文档
"noh " 清除高亮显示
set hlsearch "高亮‘/’搜索到的匹配项
filetype plugin on
filetype indent on " 根据文件类型自动缩进
filetype on
set fileencodings=utf-8,gbk
set complete-=i
"### gui options {{{
"-------------------------------------------------------------------------------
"set showtabline=1
"set guioptions-=T
"set guioptions-=m
"取消菜单、工具栏的显示
"set guioptions=
set laststatus=2
"set guifont=Lucida_Console:h18
"set guifont=Courier_New:b:h16
"}}} ## gui options
set textwidth=80 " 限制一行的长度,不错的功能
"set backspace=2 " 修正终端上的退格键 Backspace 的行为
"set softtabstop=4
"set relativenumber "相对行号
"set paste " 开启这个选项,复制进来的文本的换行符就不会乱
"set cindent " C 语言的缩进
set noswapfile
set nobackup
set noundofile
set virtualedit=all
set scrolloff=5
set t_Co=256 " 开启 256 色
set foldlevel=3
set foldmethod=marker
"set cursorline
"set cursorcolumn
set autoindent " 开启自动缩进
set backspace=3
set expandtab " 将制表符 Tab 展开为空格,这对于 Python 尤其有用
set mouse=a " 开启鼠标,默认是不能使用鼠标的
set nowrap
set number " 显示行号
set shiftwidth=4 " 用于自动缩进的空格数量
set sidescroll=10 " 自动的滚动文本,当移动的文本没有显示时
set syntax=on " 开启语法高亮
set tabstop=4 " tab 的空格数量
"set iminsert=2 " 在 gvim 中存在很大的问题——我使用的是 rime 的郑码,进入
"insert mode 会导致输入法变为郑码,但我想用的是英文,因为,我用 vim
"是为了写代码。使用这个选项,不如直接使用 windows 的输入切换方式。
"}}} ## option 设置
"## runtimepath 路径 {{{
"-------------------------------------------------------------------------------
"查看当前的 runtimepath
set runtimepath+=~\.vim\UltiSnips
set runtimepath+=~\.vim
"}}} ## rumtimepath 路径
"## mapping {{{
"-------------------------------------------------------------------------------
"2025年05月09日 09:52
"插入的模式下使用 <C-N> 成了 include "文件补全,速度太慢,怎么解决?重新映射一遍就行。
"15:53 找到原因,所以停用
"inoremap <C-N> <C-X><C-N>
"inoremap <C-P> <C-X><C-P>
"### leader key 2025-05-19 10:08:50 {{{
"--------------------------------------------------------------------------------
"let mapleader = "\\"
let mapleader = "\<space>"
"let mapleader = " "
"nnoremap <LEADER>v :Goyo<CR>
"nnoremap <Leader>g :call SwitchGui()<CR>
"nnoremap <LEADER>c :!start cmd<CR>
"nnoremap <LEADER>mo :browse oldfiles<CR>
"nnoremap <LEADER>mr :set nornu<CR>
"nnoremap <LEADER>ms :set foldmethod=syntax<CR>
"nnoremap <LEADER>o :tabnew $MYVIMRC<CR>
nnoremap <LEADER>q :
"移动当前缓冲到新标签页
nnoremap <LEADER>t <c-w>T
"nnoremap <LEADER>z ZZ
nnoremap <Leader>h <C-W>h
nnoremap <Leader>j <C-W>j
nnoremap <Leader>k <C-W>k
nnoremap <Leader>l <C-W>l
inoremap <C-D> <ESC>:call CopyLine_InsertMode()<CR>a
" 2025年05月02日 09:47
" 快捷键在 windows 终端中无法正确接收,有错误的效果
" 在 gvim 中表现正确
"inoremap <C-Enter> <Esc>o
" 表现正确
"inoremap <S-Enter> <Esc>O
"}}} ### leader key
"### normal mode 2025-05-19 10:09:24 {{{
"--------------------------------------------------------------------------------
"function key
nnoremap <F3> :tabnew<CR>
"nnoremap <F7> :w<CR>
"nnoremap <F8> <C-U>
"nnoremap <F10> :wqa<CR>
"nnoremap <LEADER>mn :set nu<CR>
"}}} ### normal mode
"### insert mode 2025-05-19 10:10:08 {{{
"--------------------------------------------------------------------------------
"inoremap <F2> <CTRL-E>
"inoremap <F9> <Esc>
"inoremap <c-q> <Esc>:
inoremap <c-o> <Esc>
"inoremap <m-o> <Esc>
"inoremap <m-y> <c-y>
"Map: vim 删除前一个空格
"inoremap <C-f> <Esc>F xA
"inoremap <c-s> <esc>:w<cr>
"inoremap <C-L> <C-X><C-L>
"inoremap <C-D> <C-X><C-D>
"inoremap <C-F> <C-X><C-F>
"inoremap <C-]> <C-X><C-]>
"g-prefix mode
"-------------------------------------------------------------------------------
"使用 :h g
"查看默认的映射
"nnoremap go :call OnlyTab()<CR>
"nnoremap cx :call CopyLine_Normal()<CR>
"nnoremap <M-o> <C-W>o
"nnoremap <Space> <C-d>
"inoremap <M-n> <C-n>
"inoremap <M-p> <C-p>
"nnoremap <M-d> <C-d>
"nnoremap <M-u> <C-u>
"nnoremap <M-w> <C-w>
"nnoremap <c-q> :
"nnoremap <c-v> <c-q> "与终端中的快捷键冲突
nnoremap <C-n> :bel vnew<cr>
nnoremap <C-s> :w<cr>
"}}} ### insert mode
"}}} ## mapping
"## autocmd : au {{{
"-------------------------------------------------------------------------------
"au! BufNewFile *.cpp,*.h,*.hpp setlocal foldmethod=syntax
"au! BufRead *.cpp,*.h,*.hpp setlocal foldmethod=syntax
"autocmd! BufRead *.cpp,*.h,*.hpp set wrap | set foldmethod=syntax
au! BufRead *.ixx set filetype=cpp
au! BufRead *.md set wrap
"}}} ## autocmd
"## abbreviations {{{
"}}} ## abbreviations
"## colorscheme {{{
"-------------------------------------------------------------------------------
"tags: cs, color
"set tgc
"hi Normal guibg=NONE
" 在 windows terminal 上,可以是背景色变为透明。
"}}} ## colorscheme
"## 自定义状态栏 {{{
"-------------------------------------------------------------------------------
" 请阅读文档后再进行设置!
"set statusline=[%n]%1*%F%=%0*%2*%l,%c\ %p%%%0*\|ascii=%b,hex=%B%{((&fenc==\"\")?\"\":\"\ \|\ \\".&fenc)}\ \|\ \%{$USER}\ @\ %{hostname()}\
"set statusline=[%n]\ %#HIComment%F%=\ \|\ %l,%c\ %p%%\ \|\ ascii=%b,hex=%B%{((&fenc==\"\")?\"\":\"\ \|\ \\".&fenc)}\ \|\ \%{$USER}\ @\ %{hostname()}\ " 没有效果
"set statusline=[%n]\ %f%m%r%h\ \|\ \ \ \|%=\|\ %l,%c\ %p%%\ \|\ ascii=%b,hex=%b%{((&fenc==\"\")?\"\":\"\ \|\\".&fenc)}\ \|\ \%{$USER}\ @\ %{hostname()}\
"set statusline=[%n]\ %f%m%r%h\ \|\ \ pwd:\ %{CurrentDir()}\ \|%=\|\ %l,%c\ %p%%\ \|\ ascii=%b,hex=%b%{((&fenc==\"\")?\"\":\"\ \|\\".&fenc)}\ \|\ \%{$USER}\ @\ %{hostname()}\
"}}} ## 自定义状态栏
"## register {{{
" 清空寄存器
"let @a =""
"}}} ## register
"}}} # 基础设置
"# 自定义的函数(并不是依赖项) {{{
"-------------------------------------------------------------------------------
"tags: Custom function, custom function
"Function: (隐藏/显示)菜单、工具栏的显示
"
function! SwitchGui()
let gui_options = &guioptions
for i in gui_options
if i == 'm' || i == 'T'
set guioptions-=m
set guioptions-=T
return
endif
endfor
set guioptions+=m
set guioptions+=T
endfunction
"## 向下重复行 2025-04-30 23:19:48 {{{
"Function: Lin 向下重复行(插入模式)
"
"向下复制行(插入模式)而不改变光标位置
"
function! CopyLine_InsertMode()
let l:old_cursor = getcursorcharpos()
execute "normal vYp"
call setcursorcharpos(l:old_cursor[1]+1, l:old_cursor[2])
endfunction
"Function: Lin 向下重复行(正常模式)
"
"向下复制行而不改变光标位置
"
"TODO: 增长数字编号
"
"1. 在行开头(排除掉空白): [注释] 数字+.
"
function! CopyLine_Normal()
let l:old_cursor = getcursorcharpos()
execute "normal vYp"
call setcursorcharpos(l:old_cursor[1]+1, l:old_cursor[2])
endfunction
"}}} ## 向下重复行
"Function: Lin 切分窗口
"
"使窗口位于中间,并打开顶部打开一个预览窗口
"
function! PlaceholderWindow()
"wincmd T
let winid = win_getid()
" 创建垂直窗口
"vnew
vsplit
" 调整当前窗口的大小
vertical resize 80
call win_gotoid(winid)
"创建当前窗口的水平副本
split
resize 10
call win_gotoid(winid)
endfunction
"通过 pwsh 来查看环境变量
"$> $env:path > tmp.txt; gvim tmp.txt
"%s/