0
点赞
收藏
分享

微信扫一扫

图形编辑器开发:一些会用到的简单几何算法

五殳师兄 2023-07-17 阅读 69

Vim语法及插件


常用

课程链接

Vim中的指令可以灵活组合使用

:help 查找文档

切换为后台Ctrl + z;切换为前台fg

Ctrl + D打开候选列表


Normal模式

进入Vim,默认Normal模式或使用Esc进入Normal模式

移动

单词间移动
移动到下一个word/WORD开头 w / W (移动到下一个word/WORD结尾 e / E
移动到上一个word/WORD开头 b / B
word是指以非空白符分割的单词,WORD是指以空白符分割的单词。

行间搜索移动
使用 f{char}可以移动到{char}字符上,t{char}移动到{char}字符的前一位字符
多个{char}间的切换用; / , 表示下一个 / 上一个
f搜索到光标行尾间的字符,F搜索到光标行首间的字符。

行间快速移动
0移动到行首第一个字符,使用0w起到和^相同的作用(^移动到行首第一个非空白字符)
$移动到行尾(g_移动到行尾非空白字符)

页面移动
gg / G 移动到文件的开头 / 结尾,ctrl + o快速返回
移动到屏幕的开头H (head),中间M (middle),结尾L (lower)
<C-u> / <C-f> 上(upword) / 下(forward)翻页
zz 调整当前行到屏幕中间
zt 将光标所在行调整到屏幕上方
:n 跳转到第n

删除

xd 删除选中部分,x可以用在一个字符上直接删除,d属于删除指令,要删除一个字符,需要dl
dw删除光标到单词的结尾,diw删除光标所在的单词,dd删除光标所在行,D 删除所在行光标之后的所有词
dt{char}删除光标到{char}的所有字符
d0 删除到行首,d$ 删除到行尾
2dd删除行,4x删除个字符。数字+命令 表示多次重复。
ggdG清空屏幕
. 模仿上一次删除操作

修改

r (replace) 替换一个字符,保持Normal模式; R 替换多个字符,保持Normal模式
s (subtitute) 删除当前字符,并进入Insert模式;S删除当前行,并进入Insert模式
c (change)
cw删除单词,并进入Insert模式;C删除光标到行尾,并进入Insert模式;
ci( 修改()中的内容,()也可以是{} [] <>,但是对于c++中的流操作符<<就不能使用ci<来修改其内容,因为是两个<相连,可以使用c%进行修改,但是光标要置于<后。

查找

/ / ? 进行前向 / 反向搜索
使用n / N 跳转到一个 / 一个
使用* / # 进行单词的前向 / 后向匹配

复制粘贴

y (yank)复制 yiw复制一个单词,yy复制一行,y0复制光标到行首
d (delete)剪切
p (put)粘贴,p粘贴到光标之后,P粘贴到光标之前

vim在复制、剪切过程中的文本内容是存在寄存器中,而不是系统剪切板。
xp :用x删除一个字符,将字符放到无名寄存器中,再使用p粘贴,实现字符对调。

对于寄存器的使用,通过:{register}可以指定寄存器,有多个寄存器,如az都可以设置为寄存器,可以作为剪贴板来使用。如"ayiw表示复制一个单词到寄存器a中,"bdd表示删除当前行到寄存器b中。
使用:reg a显示寄存器a中保存的内容
使用"bp表示粘贴寄存器b中的内容
""表示无名寄存器,默认就是用的无名寄存器,因此可以省略不写
"0表示复制专用寄存器,默认复制到无名寄存器时,也会复制到专用寄存器
"+表示系统剪贴板,用于和vim外进行交互用的寄存器

清理寄存器的内容 :let @"='',让无名寄存器的内容赋为''空字符

当在客户端进行复制后,在服务端进行粘贴时,无法使用寄存器进行交互,因此可以使用:set clipboard=unnamed设置服务器中的vim,再直接使用p来进行粘贴

颠倒两行:exe "normal! ddpk"

  • :exe :这是一个 Ex 命令,用于执行后面的字符串作为 Vim 命令。
  • "normal! ddpk":这是要执行的字符串。在这个命令中,"normal!" 是告诉 Vim 将后面的字符串作为普通模式下的按键操作来执行。
  • dd :删除当前行,并将其保存到剪贴板中。
  • pk:按下 p 键,将剪贴板中的内容(之前删除的行)粘贴到光标当前位置的上一行。

撤销

u撤销操作,U撤销某一行最近所有修改,<C-r>撤销u


Insert模式

i(insert)光标之插入,I插入
a(append)光标之插入,A插入
o(open a line below) 在下一行插入O在上一行插入

进入该模式后,<C-h> 删除上一个字符,<C-w> 删除上一个单词,<C-u> 删除光标前当前行所有字符(同理于终端

可以使用 <C-c><C-[>,从 Insert 模式切换到 Normal 模式
可以使用 gi,从 Normal 模式切换到 Insert 模式中最后编辑的位置

复制粘贴

正常文本的复制粘贴<C-c> <C-v>
<C-r>{register}对对应寄存器中的内容进行粘贴


CMD模式

通过 : 进入命令行模式

:w (write)写入
:wq (write quit)写入并退出
:q 退出编辑器,如果存在未保存的修改,Vim会提示保存放弃修改。如果没有做任何修改或已保存修改,Vim将立即退出。
:q! 也用于退出编辑器,但是它会强制退出,丢弃所有未保存的修改
因此,如果你有未保存的修改,应该首先使用:q命令尝试退出编辑器并保存修改。只有在确定不再需要这些修改时,才应使用:q!命令强制退出。

:vs (vertical split)竖直分屏
:sp (split)水平分屏
:set nu (set number)设置行号

替换

支持正则表达式
语法::[range]s[ubtitute]/{pattern}/{string}/[flags]

[range]表示范围,如10,20表示10到20行,%表示全部

{pattern}表示需要替换的文本

{string}表示替换后的文本

[flags]
g (global) 表示全局范围执行
c (confirm) 表示需要确认是否修改
n (number) 表示匹配到的次数,而不进行替换

:% s/a/b/g 把所有的a替换成b
:1,6 s/a/b/g 把1到6行的a替换成b
:1,6 s/a//n 1到6行中查找有多少个a。但可能会对a替换成空字符,可修改为:1,6 s/a/&/gn

使用正则表达式
:% s/\<a\>/b/g 把所有的单词a替换成b,而不替换含有a字符的单词


Visual模式

进行可视化选择
Normal模式输入v,进入visual选择。使用V选择整行,使用<C-v>进行块状选择。
选中使用U转换成大写字母,u转换成小写字母


多文件间的转换

Buffer

Buffer指打开的一个文件的内存缓冲区
修改时针对Buffer的内容修改,:w再将修改内容写入文件。
每个文件对应一个Buffer,使用:ls会列举当前缓冲区,再使用:b n跳转到第n个缓冲区。
:bpre :bnext :bfirst :blast 分别跳到对应的缓冲区中,或者用:b buffer_name 加上Tab补全来跳转。

通过:ls来获得缓冲区中对应文件的信息、编号,可以通过:b1跳到编号为1所对应文件的Buffer中去。
也可以用:e buffer_name打开对应的文件。

Window

WindowBuffer可视化的分割区域。
<C-w>v 垂直分割,同:vs
<C-w>s 水平分割,同:sp
<C-w>w 窗口间循环切换
<C-w>h 切换到左侧窗口,<C-w>H 将窗口移动左侧
<C-w>j 切换到下侧窗口,<C-w>J 将窗口移动下侧
<C-w>k 切换到上侧窗口,<C-w>K 将窗口移动上侧
<C-w>l 切换到右侧窗口,<C-w>L 将窗口移动右侧

Tab

Tab可以把Window组织为一个工作区


文本对象

可以快速操作一个单词、一个句子和一个段落等。
语法:[number]<command>[text object]

[number]表示次数
<command>表示命令,如d c y
[text object]表示要操作的文本对象,如w 单词,s句子,p段落


iw (inner word) viw表示选择当前单词,vi"表示选择"中的内容
aw (around word) vaw表示选择当前单词以及单词后的空格


一系列命令的集合:可以使用宏录制一系列操作,再用于回放这些操作,用于批量的编辑。

Normal模式下,使用q来开启录制,再使用q来结束录制。可以使用q{register},来指定对应的寄存器来存放指令。使用@{register}回放

如,有多行网址,要给每一行的网址加上双引号。

https://www.example1111.com
https://www.example22.com
http://www.example333.com
http://www.example4444.com
https://www.example55555.com
http://www.example666666.com
https://www.example7777777.com
http://www.example88.com
https://www.example99999.com
http://www.example1000000.com

qa 开启录制宏到a寄存器中
光标置于第一行,I" <C-[> A" <C-[> q ,其中I光标置于行首,插入"<C-[>退出Insert模式,A插入到行尾,插入",退出Insert模式,q结束录制。 完成了一个
可以使用j@a,让下一行也通过宏完成指令。
还可以使用进入visual模式,VG选择其余所有行,使用:进入命令行模式,vim会显示:'<,'>,使用normal模式下的指令,输入normal @a。命令行整体为:'<,'>normal @a,即可完成操作。

整体修改只需
:1 qa I" <C-[> A" <C-[> q :2 VG :normal @a

"https://www.example1111.com"
"https://www.example22.com"
"http://www.example333.com"
"http://www.example4444.com"
"https://www.example55555.com"
"http://www.example666666.com"
"https://www.example7777777.com"
"http://www.example88.com"
"https://www.example99999.com"
"http://www.example1000000.com"

其实可以不使用宏也来完成该需求,VG先全选,输入:normal I",给所有行首加入",进入命令行模式:<C-p>输出上一步操作,将I"改为A"即可。
将宏的批量修改改成统一修改,由于录制宏中需要两次退出Insert模式,因此需要两次进入normal模式。


补全

常见补全
<C-n><C-p> 补全单词,在待补全选项中,可以通过使用操作选<C-n>下一个和 <C-p> 上一个,而不使用方向键来选择。
<C-x><C-f> 补全文件名
<C-x><C-o> 补全代码,需要开启文件类型检查,安装插件


vim-commands-cheat-sheet-by-pnap


配置

:set number等配置的持久化,而不是每次打开一个文件都要重新配置。通过对vimrc的设置,完成此需求。
建立一个~/.vimrc配置文件,通过其编写对vim的设置。

  • 常用设置::set nu设置行号,colorscheme hybrid设置主题
  • 常用的vim映射:noremap <leader>w :w<cr>保存文件
  • 自定义的vimscript函数和插件的配置

" 表示注释


映射

vim的映射比较复杂,因为有多种模式。在~/.vimrc中,通过使用leader键来进行组合,常用的leader键是使用, 或者<space>空格 let mapleader = ','

命令模式描述
map所有模式创建非递归映射
noremap所有模式创建递归映射
com!命令行模式定义自定义命令
imap插入模式创建插入模式下的非递归映射
inoremap插入模式创建插入模式下的递归映射
nmap正常模式创建正常模式下的非递归映射
nnoremap正常模式创建正常模式下的递归映射
vmap可视模式创建可视模式下的非递归映射
vnoremap可视模式创建可视模式下的递归映射
xmap选择模式创建选择模式下的非递归映射
xnoremap选择模式创建选择模式下的递归映射

inoremap <leader>w <Esc>:w<cr>

  • inoremap : (i insert, nore no recursive, map map) 插入模式非递归映射
  • <leader>w 等价使用,w
  • <Esc>:w<cr> 等价表示为在Insert模式,先使用<Esc>,进入Normal模式,再进入命令行保存文件:w,最后再使用回车<cr>

使用,w映射为在Insert模式保存文件。

如何使得自定义的vimrc配置文件生效,类似与.bashrc一样,通过输入:source ~/.vimrc来使其生效或者退出,重新进入。

noremap <C-h> <C-w>h,通过<C-h>来实现移动到左侧窗口。

有一种情况,如下

:nmap - dd
:nmap \ -

最后,会将\映射为dd。类似于递归的形式。因此,使用递归映射,行为有不确定性。比如安装的插件恰巧映射了不确定的行为。建议使用非递归映射

通过把vimrc配置放到git版本备库管理可以同步到其他电脑或服务器上。


插件

推荐使用vim-plug插件管理器,在.vimrc中使用如下命令

call plug#begin('~/.vim/plugged')
//...
call plug#end()

有需求就有供给,如何找到插件:

  • Google
  • vimawesome
  • 他人开源配置文件

//...的位置添加想要的插件内容,完成vimrc的修改后,执行:PlugInstall安装插件即可。

语法网址描述
Plug 'mhinz/vim-startify'https://github.com/mhinz/vim-startify开屏插件,可以显示最近打开的文件
Plug 'vim-airline/vim-airline'
Plug 'vim-airline/vim-airline-themes'
https://github.com/vim-airline/vim-airline状态栏美化
Plug 'yggdroot/indentline'https://github.com/Yggdroot/indentLine增加代码的缩进线条
Plug 'w0ng/vim-hybrid'https://github.com/w0ng/vim-hybridvim配色
Plug 'preservim/nerdtree'https://github.com/preservim/nerdtree文件目录树
Plug 'kien/ctrlp.vim'https://github.com/kien/ctrlp.vim快速查找并打开文件
Plug 'tpope/vim-surround'https://github.com/tpope/vim-surround成对编辑"" ()
Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
Plug 'junegunn/fzf.vim'
https://github.com/junegunn/fzf.vim模糊搜索

ctrlp.vim 的指令:ss 查找指定的字符。
如查找name,通过ssna,将显示高亮部分,通过该部分上的字母将选择是哪一个字符

vim-surround的指令:ds delete a surrounding,cs change a surrounding, ys you add a surrounding。
如在name上加",需要ysiw";在"name""换成(,需要cs"(cs"),区别是前者()中间有空格( name ),后者()中间没有空格(name);删除"name"",需要ds"

fzf的指令:Ag [pattern]模糊搜索字符串,Files [pattern]模糊搜索目录


脚本

vim对应的脚本vimscript

推荐书目笨方法学Vimscript


举报

相关推荐

0 条评论