• Vim基本配置&快捷键&常用命令


    2022.11.2

    vim配置

    使用vim的目的,是为了实现纯键盘编辑。

    vim模式

    • normal模式:默认模式
      • 普通模式下,可以进行各种命令操作和移动
      • 大部分情况下,我们是在浏览而不是在编辑,所以vim默认是normal模式
    • insert模式:编辑模式
    • command模式:normal模式下输入:之后执行命令
      • 比如退出保存,:wq
      • 比如全局替换::% s/java/python/g 将全局的java替换成python
    • visual模式:一般用来块状选择文本
      • normal模式下使用v进入visual选择
      • V 整行选中
      • ctrl+v 进行块状选择
      • 块状选中文本后,可以用d删除,y复制,p粘贴

    vim基本配置

    sjx@Samsung:~$ cat .vimrc
    set nu "显示行号
    set shiftwidth=4 "设置缩进的空格数为4
    set tabstop=4 "设置软制表符宽度为4
    set autoindent "设置自动缩进
    set cindent "使用C/C++语言的自动缩进方式
    set showmatch "光标遇到圆括号、方括号、大括号时,自动高亮对应另一个括号
    set ruler "在状态栏显示光标的当前位置(位于哪一行、哪一列)
    set statusline=%f\ -\ FileType=%y "设置状态栏
    set hlsearch "设置高亮显示搜素字符串
    set incsearch "设置增亮搜索,边搜索边高亮
    set t_Co=256 "启动256色
    syntax on "高亮显示
    syntax enable
    colorscheme darkblue "设置主题色为darkblue
    
    
    sjx@Samsung:~$
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    修改colorscheme

    最喜欢的主题是darkblue,但是,底下的状态栏,灰色和亮蓝色实在看不清。故作修改。

    cd /usr/share/vim/vim81/colors/
    sudo cp darkblue.vim darkblueTest.vim
    sudo chown -R sjx darkblueTest.vim
    vim darkblueTest.vim
    
    • 1
    • 2
    • 3
    • 4

    将第35行:hi StatusLine guifg=blue guibg=darkgray gui=none ctermfg=blue ctermbg=gray term=none cterm=none
    的ctermfg=blue改成 —> ctermfg=56 (紫色)

    终端颜色表参考:https://www.ditig.com/256-colors-cheat-sheet

    状态栏看不清,error msg也看不清。
    第18行,也做修改。
    18 hi ErrorMsg guifg=#ffffff guibg=#287eff ctermfg=56 ctermbg=lightblue

    vim下载插件

    00 安装vim插件管理器

    首先,使用vim-plug插件管理器安装vim插件。

    https://github.com/junegunn/vim-plug

    使用命令:curl -fLo ~/.vim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

    第一个报错:Command ‘curl’ not found, but can be installed with:
    解决:sudo apt install curl

    第二个报错:sjx@Samsung:~$ curl -fLo ~/.vim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
    % Total % Received % Xferd Average Speed Time Time Time Current
    Dload Upload Total Spent Left Speed
    0 0 0 0 0 0 0 0 --:–:-- 0:01:32 --:–:-- 0^C
    超时。
    解决:使用curl命令需要配置代理:

    vim .curlrc
    cat ~/.curlrc
    proxy = “http://109.123.97.11:8080”
    insecure

    sync

    下载成功:

    sjx@Samsung:~$ curl -fLo ~/.vim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
    100 83129  100 83129    0     0   121k      0 --:--:-- --:--:-- --:--:--  121k
    sjx@Samsung:~$
    
    • 1
    • 2
    • 3
    • 4
    • 5

    01 vim-startify

    一个好用的vim开屏插件。

    https://github.com/mhinz/vim-startify

    1. vim .vimrc,增加该插件名称
    call plug#begin('~/.vim/plugged')
    Plug 'mhinz/vim-startify'
    call plug#end()
    
    • 1
    • 2
    • 3
    1. 保存然后source .vimrc
    :w
    :source ~/.vimrc
    
    • 1
    • 2
    1. 执行:PlugInstall
    :PlugInstall
    
    • 1

    报错:connect to github.com port 443: Connection timed out
    解决:

    1. 打开 https://github.com.ipaddress.com/
    2. 复制IP Address
    3. sudo vim /etc/hosts
      在末尾添加:140.82.114.4 github.com
    4. source /etc/hosts
    5. 重新下载,成功
    Updated. Elapsed time: 0.015813 sec.                                                
    [=]    
    
    - Finishing ... Done!                                                          
    - vim-startify: Already installed    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    02 nerdtree-vim文件目录和搜索插件

    使用nerdtree插件进行文件目录树管理。
    解决跳转文件得问题。

    https://github.com/preservim/nerdtree

    Plug ‘preservim/nerdtree’

    1. :NERDTree命令用于打开目录
    2. vim .vimrc 添加快捷键

    vim快捷键

    01 进入/退出插入模式

    进入
    1. a append after current char
    2. A append after current line
    3. i insert before current char
    4. I insert before current line
    5. o open a line below
    6. O open a line above
    退出
    1. :w 保存
    2. :wq 保存并退出
    3. :qa 退出所有窗口

    02 快速纠错

    痛点:退格键太远,用起来不方便,我们可以抛弃退格键

    需要先进入编辑模式或者在命令行中使用:

    1. ctrl+h 删除前一个字符
    2. ctrl+w 删除前一个单词
    3. ctrl+u 删除当前行到光标位置的所有字符

    只可以在终端命令行中使用
    4. ctrl+a 光标快速移动到开头
    5. ctrl+e 光标快速移动到结尾
    6. ctrl+b 光标往前移
    7. ctrl+f 光标往后移

    03 快速切换insert和normal模式

    痛点:Esc按起来不方便,不方便切换到normal模式

    • ctrl+c 快速切到normal模式,但有可能会中断某些快捷键
    • ctrl+[ 快速切到normal模式
    • gi 在normal模式下快速跳转到最后一次编辑的地方并进入插入模式

    04 vim快速移动大法

    左 下 上 右

    反人类:hjkl
    坚持使用几天,就可以熟练。

    在单词之间飞舞
    • w 移动到下一个word开头
    • W 移动到下一个WORD开头
    • e 移动到下一个word尾部
    • E 移动到下一个WORD尾部
    • b 移动到上一个word开头
    • B 移动到上一个WORD开头

    小写word指得是以非空白符分割的单词,大小WORD以空白符分割的单词

    行间搜索移动

    同一行快速移动的方式其实是搜索一个字符并且移动到该字符。

    • f{char} 可以快速移动到该行char字符上,如:fe 快速移动到e字符上(find)
    • t{char} 移动到char的前一个字符上,如:te(until)
    • ; 继续搜该行下一个
    • ,继续搜该行上一个
    • F{char} 反过来搜前面的字符
    vim的水平移动
    • 0 快速移动到行首第一个字符
    • ^ 移动到该行第一个非空白字符
    • $ 移动到行尾
    • g_ 移动到行尾非空白字符

    记住0 移动到行首,$移动到行尾就可以了。

    • 0w 快速移动到该行第一个非空白字符上

    :help ( 可以查询命令的用法

    vim页面移动
    • gg 快速移动到文件开头
    • G 快速移动到文件结尾
    • H 快速跳转到屏幕的开头(Head)
    • M 快速跳转到屏幕的中间(Middle)
    • L 快速跳转到屏幕的结尾(Lower)
    • ctrl+u 上翻页(upward)
    • ctrl+f 下翻页(forward)
    • ctrl+e 屏幕上移动一行
    • zz 把屏幕置为中间
    • ctrl+o 快速返回

    vim的normal模式提供了强大的命令来移动。

    学习vim,让写代码就像弹钢琴,让别人眼睛的速度都跟不上你操作的速度。

    05 vim快速增删改查

    增加

    进入插入模式编辑文本。aio/AIO

    删除

    normal模式下:

    • x 快速删除一个字符
    • dw 删除一个单词(delete a word)
    • daw 删除一个单词和旁边的空格(delete around word)
    • diw 删除一个单词不删除空格
    • dd 删除当前行
    • dt) 删除括号里的内容(delete to ))
    • dt" 删除到双引号
    • d$ 删除到行尾
    • d0 删除到开头
    • x和d可以搭配数字来执行多次
      • 2dd 删除两行
      • 4x 删除四个字符

    vim中 数字+命令 可以用于执行多次命令

    可以搭配visual模式行选或块选快速删除。

    修改

    相比删除,更常用修改。一般是删除之后改成我们希望的文本。

    • r normal模式下使用r可以替换一个字符(replace)
      • ra 把光标所指字符改成a
    • R 直接开始向下替换
    • c 配合文本对象,快速进行修改(change)
      • cw 删除当前单词并进入插入模式
      • ct" 删除到双引号并进入插入模式
    • s 删除当前字符并进入插如模式(substitute)
    • 4s 删除4个字符并进入插如模式
    • S 整行删除,并进入插如模式
    查询
    • / 进行前向搜索
    • ? 进行反向搜索
    • n 跳转到下一个匹配
    • N 跳转到上一个匹配
    • * 光标在单词上,使用*号,进行当前单词的前向匹配,找到相同的单词(向下)
    • # 进行当前单词的后向匹配(向上)
    • :noh 搜索结束后,让高亮的字符不再高亮
    搜索替换

    substitute命令允许我们查找并且替换掉文本,支持正则表达式

    • :[range]s/{pattern}/{string}/[flags]
      • range表示范围,比如:10,20 表示10-20行,%表示全部
      • pattern表示要替换的文本
      • string是替换后的文本
      • flags是替换的标志位
        • g 全局范围内执行(global)
        • c 表示确认,可以确认或者拒绝修改(confirm)
        • n 报告匹配的次数而不替换,用来查询匹配次数(number)

    :% s/self/this/g 将全局的self替换成this
    :1,6 s/self/this/g 将1-6行的self替换成this
    :% s/self//n 查看全文有多少self
    :% s/\/this/g 使用正则表达式,精确匹配所有quack,而不会有_quack等

    延伸:可以使用插件批量搜索替换多个文件中的匹配

    06 vim多文件操作

    Buffer、Window、Tab

    • Buffer:是指打开的一个文件的内存缓冲区
    • Window:窗口是指Buffer可视化的分割区域
    • Tab:Tab可以组织窗口为一个工作区
    Buffer
    • vim打开一个文件后会加载文件内容到缓冲区
    • 之后的修改都会针对内存中的缓冲区,并不会直接保存到文件
    • 直到我们执行:w(write)的时候才会把修改内容写入到文件里

    如何在buffer之间切换?

    • :ls 会列举当前缓冲区,然后使用:b n跳转到第n个缓冲区
    • :bp 向前跳(buffer previous)
    • :bnect 向后跳
    • :bfirst 跳到第一个
    • :bl 跳到最后一个(buffer last)
    • :b buffer_name/buffer_number 加上tab补全来跳转,如 :b1 跳到第一个缓冲区
    • :e 文件名 再打开一个缓冲区
    窗口

    窗口是可视化的分割区域。
    一个缓冲区可以分割成多个窗口,每个窗口也可以打开不同缓冲区

    • ctrl+w s/:sv 水平分割
    • ctrl+w v/:vs 垂直分割(w是window的意思)

    每个窗口可以继续被无限分割(看屏幕是否足够大)
    可以在不同的窗口用:e 文件名 打开不同的buffer
    不同窗口编辑同一个buffer,都会生效,因为编写的都是同一块内存里的内容

    • ctrl+w H 将光标所在位置的窗口移到左边

    • ctrl+w J 将光标所在位置的窗口移到下边

    • ctrl+w K 将光标所在位置的窗口移到上边

    • ctrl+w L 将光标所在位置的窗口移到右边

    • ctrl+w = 使所有窗口等宽、等高

    • ctrl+w _ 最大化活动窗口的高度

    • ctrl+w | 最大化活动窗口的宽度

    • [N]ctrl+w _ 把活动窗口的高度设置为N行,如40ctrl+w _

    • [N]ctrl+w | 把活动窗口的宽度设置为N列

    Tab(标签页)

    标签页用于将窗口分组。Tab是可以容纳一系列窗口的容器

    vim的tab和其他编辑器不太一样,可以想象成Linux的虚拟桌面
    比如一个Tab全用来编辑python文件,一个tab全是html文件
    相比窗口,tab一般用的比较少,tab太多管理起来也比较麻烦

    • :tabnew 文件名 在新的标签页中打开文件
    • ft 在nerdtree中可以在光标选中的文件目录下新建标签页
    • :tabe[dit] {filename} 在新标签页中打开文件
    • ctrl+w T 把当前窗口移到一个新的标签页中
    • :tabc[lose] 关闭当前标签页及其中的所有窗口
    • :tabo[nly] 只保留活动标签页,关闭所有其他标签页

    Tab标签页切换操作如下:

    命令模式下:

    • :tabn[ext]{N} 切换到编号为{N}的标签页
    • :tabn[ext] 切换到下一个标签页
    • :tabp[revious] 切换到上一个标签页

    normal模式下

    • {N}gt 切换到编号为{N}的标签页
    • gt 切换到下一个标签页
    • gT 切换到上一个标签页
    • ft 新建一个空的tab标签页

    标签页一般建立两个就好,太多不好操作

    Note: 后面会配合ctrlp插件和nerdtree快速操作多个文件

    07 vim的text object

    什么是Text Object(文本对象)

    vim里文本也有对象的概念,比如一个单词,一段句子,一个段落
    很多其他编辑器经常只能操作单个字符来修改文本,比较低效,但vim删除一个单词只要dw
    通过操作文本对象来修改要比只操作单个字符高效

    如何操作文本对象
    • [number][text object]
      • 数字表示操作几次
      • command表示操作命令,如d(delete),c(change),y(yank)复制
      • text object表示文本对象,如单词w,句子s,段落p
    示例1

    iw表示inner word。如果键入viw命令,那么首先v将进入选择模式(visual模式),然后iw将选中当前单词。
    aw表示around word。它不仅会选中当前单词,还会包含当前单词之后的空格。
    以下用[]表示作用范围:

    • iw This is a …[test]… sentence.

    • aw This is a …[test ]sentence.

    • iW This is a […test…] sentence.

    • aW This is a […test… ]sentence.

    • is …sentence. [This is a sentence.] This…

    • as …sentence. [This is a sentence. ]This…

    • ip [This is a paragraph.It has two sentences.]

      The next.
      End of previous paragraph.

    • ap [This is a paragraph.It has two sentences.

      ]The next.
      End of previous paragraph.

    练习1

    This is a “word”.

    • 删除前面三个单词包括空格:0w3dw(0w先定位到第一个单词起始位置,3dw删除三个单词)
    • 删除前面三个单词不包括空格:0w3diw
    • 删除引号里的word换成hello: fwcw(fw先定位到word的起始位置,然后用cw,删除word并进入插入模式)
    示例2
    • i( or i) 1*([ 2 + 3 ]) 不包括括号 用于函数参数定义时
    • a( or a) 1*[( 2 + 3 )] 包括括号
    • i< or i> The <[tag]>
    • a< or a> The []
    • i{ or i} int main(){[return 0]} 可用于选择一个代码段
    • a{ or a} int main()[{return 0}]
    • i[ or i] some [[code block]] 可用写json时
    • a[ or a] some [[code block]]
    • i" The “[best]” 可用于打印log
    • a" The [“best”]
    • iThe[best]` 可用于markdown文档
    • a The [best`]
    练习2

    _INFO(“this is a test”);

    • 删除双引号里的内容:f"vi"x
    • 更改双引号里的内容:f"ci" (删除并进入插入模式)

    map = {
    “name” : “j”.
    “age” : 13
    }

    • 快速修改这个map:ci"

    文本对象最常搭配d(delete)、c(change)、v(visual)、y(yank)复制使用

    我们需要拜托低效的字符操作,使用文本对象提高效率

    08 vim复制粘贴和寄存器的使用

    normal模式下的复制粘贴
    • y 复制(yank)
    • d 剪切
    • p 粘贴(put)

    我们可以用v命令选中所要复制的地方,然后使用y复制使用p粘贴

    此外配合文本对象使用:

    • yiw 复制一个单词
    • yy 复制一行

    vim命令模式分屏

    分屏
    1. :vs 将当前文件垂直分屏(vertical split)
    2. :vs [file] 创建新文件并垂直分屏
    3. :sv/sp 水平分屏
    4. :sv [file] 创建新文件并水平分屏
    分屏间光标移动
    1. ctrl+w h 切换到左边窗口
    2. ctrl+w j 切换到下边窗口
    3. ctrl+w k 切换到上班窗口
    4. ctrl+w l 切换到右边窗口
    5. ctrl+w w 在窗口之间循环切换
    分屏移动
    1. ctrl+w H 将当前分屏移到最左边
    2. ctrl+w J 将当前分屏移到最下边,并拓展到整个屏幕宽度
    3. ctrl+w K 将当前分屏移到最上边,并拓展到整个屏幕宽度
    4. ctrl+w L 将当前分屏移到最右边
    关闭分屏
    1. ctrl+w c 关闭当前子屏
    2. :hide 关闭当前窗口
    3. :only 只保留当前窗口,关闭其他窗口
    4. :qall 关闭所有窗口
    5. :wall 保存所有修改过得窗口
  • 相关阅读:
    Mac如何打开企业微信内置浏览器控制台
    神经网络-使用Sequential搭建神经网络
    网格大师如何把b3dm转为osgb格式?
    【红日靶场】vulnstack5-完整渗透过程
    五.Dockerfile文件编写的常用指令记录解释
    【MySql】7- 实践篇(五)
    图相似度计算——SIMGnn源码解读
    JDK版本对应其major.minor version,看这一篇就够啦(附java历史版本下载地址)
    Apache文件管理自学笔记——映射文件夹和基于单ip多域名配置apache虚拟机
    vscode markdown WYSIWYG 所见即所得编辑和预览
  • 原文地址:https://blog.csdn.net/Ludwig1957/article/details/127734888