vim操作键盘图
下图是比较基础的vim操作键盘图 (IDE例子)
- vi/vim的区别简单点来说,它们都是多模式编辑器,不同的是vim是vi的升级版本,它不仅兼容vi的所有指令,⽽且还有⼀些新的特性在⾥⾯。例如语法加亮,可视化操作不仅可以在终端运⾏,也可以运⾏于x window、 mac os、 windows。
vim的基本概念
vim本质是一款多模式的编辑器,vim是所有Linux操作系统自带的,是一款使用成本,配置成本比较高的编辑器,在操作上,也就是说虽然前期比较不好上手,但是学熟后,也就没有什么编辑器可以为难到我们了,在配置上还有一款更复杂的:VSCode。
vim的三种模式(其实有好多模式,⽬前掌握这3种即可),分别是命令模式(command mode)、插⼊模式(Insert mode)和底⾏模式(last line mode),各模式的功能区分如下:
- 正常/普通/命令模式(Normal mode)
控制屏幕光标的移动,字符、字或⾏的删除,移动复制某区段及进⼊Insert mode下,或者到 lastline mode(是一种指令的快捷方式)
- 插⼊模式(Insert mode)
只有在Insert mode下,才可以做⽂字输⼊,按「ESC」键可回到命令⾏模式。该模式是我们后⾯⽤的最频繁的编辑模式。
- 末⾏模式(last line mode)
⽂件保存或退出,也可以进⾏⽂件替换,找字符串,列出⾏号等操作。在命令模式下,*shift+:* 即可进⼊该模式。要查看你的所有模式:打开 vim,底⾏模式直接输⼊:help vim-modes
- 我这⾥⼀共有12种模式:six BASIC modes和six ADDITIONAL modes.
关系转换图
vim的基本操作
我们刚开始使用vim,一个裸的vim进行代码的编写,他是没有经过任何配置的,最多会给我们带一点点语法提醒;补全,提示,语法报错是完全没有的。
下面我们演示一下:
我们touch一个code.c文件,并代开code.c进行编辑:
bash
lfz@hcss-ecs-ff0f:~/lesson/code$ touch code.c
lfz@hcss-ecs-ff0f:~/lesson/code$ vim code.c
我们刚开始进入vim的时候是命令模式,我们想要进行编辑代码需要切换成插入模式,最简单的切换方法是:输入 i 就可以啦!(简单的切换就是上面那张图示)(想要推出的话切换成底行模式,输入wq:w是保存,q是退出)
我们可以不通过touch一个文件,我们直接vim就能创建一个新的文件,但是如果什么都不写,按q,该文件不会创建,如果什么都不写,wq后,是会创建一个空文件;
我们应该注意的是:我们无法从插入模式直接切换到底行模式
其实命令模式是很重要的;和在我们使用Ctrl+c/v的操作,这种快捷键一样,本质就是对应vim的命令模式:
就假如当前处于命令模式下,当前光标在第7行(我们可以使用底行模式:set nu/nonu 来设置/取消行号)我们可以:
gg:使光标直接回到第一行(初始位)
Shift+g=G:使光标直接回到第一行
指定行+G:使光标定位到指定行
Shift+4=$:直接定位到结尾
命令模式切换到插入模式
i
:在当前光标之前插入字符I
:在行首插入字符a
:在当前光标之后插入字符A
:在行末插入字符o
:在下一行新建一行并且插入字符O
:在上一行新建一行并且插入字符
命令模式下的文本编辑
- dd:剪切当前行(剪切后不粘贴即为删除)
- 数字+dd:删除从当前行开始的几行
- yy:复制当前行
- 数字+yy:从当前行开始复制几行
- p:粘贴到光标的下一行
- D:剪切从光标处到行末的字符
- d0:剪切从当前光标开始到行首的字符
- x:删除当前光标所指的字符
- X:删除当前光标之前的一个字符
- Shift+~:字母大小写的转换
命令模式下的撤销与导航
- u:撤销
- Ctrl+r:反撤销
Ctrl+f
:向下翻一页Ctrl+b
:向上翻一页Ctrl+u
:向上翻半屏Ctrl+d
:向下翻半屏H
:调到屏幕的第一行M
:调到屏幕的中央一行L
:调到屏幕的最后一行h
:向左移动光标j
:向下移动光标k
:向上移动光标l
:向右移动光标- G:调到整个代码的最后一行
- 数字+G:调到整个代码的指定行
- gg:调到整个代码的第一行
- w:跳到下一个单词开头
- b:跳到上一个单词开头
命令模式下的文本选择与缩进
- v:按照字符来一个一个选择代码片段
- V:按照行来选择代码片段(以上两个是用来重命令模式转为视图模式的V-BLOCK,返回也是通过Esc)
通过hjkl进行区域的选择,在通过Shift+i=I就转换到了插入模式,再通过Esc返回命令模式,这样可以达到批量化注释的效果。
当让也可在不进入插入模式下,使用命令模式当中的快捷键进行批量化处理:就比如V后进行配量化选择,再对选择的范围输入d,就可以进行删除选中的nei'r
- <<:将选中的片段整体左移
-
:将选中的片段整体右移
- {:跳到上一个代码段
- }:跳到下一个代码段
命令模式下的替换与搜索
- r:替换一个字符
- R:替换一段字符(其实这是一种模式:替换模式(进入替换模式(REPLACE):Ctrl+r;退回命令模式:Esc))
- /+搜索内容:搜索指定内容,并且高亮
- n:往下走一个搜索对象
- N:往上走一个搜索对象
命令模式下的保存与退出
- Shift+zz:保存并且退出
底行模式下的替换
- :%s/123/abc/g:将代码中所有的
123
替换成abc
- :数字,数字s/123/abc/g:将数字指定的行之间的
123
全部替换成abc
底行模式下
- 执行命令:
输入 :
进入底行模式,可以在这里输入单个或多个命令。
- 保存文件:
:w:保存当前文件。
:wq 或 :x:保存文件并退出 Vim。
- 退出 Vim:
:q
:退出 Vim,如果文件被修改过,会提示保存。
:q!
:强制退出 Vim,不保存修改。
- 查找替换:
:s/old/new/g:将当前行中的"old"替换为"new",g
表示全局替换。
:%s/old/new/g:将整个文件中的"old"替换为"new"。
:数字,数字s/123/abc/g:将数字指定的行之间的123
全部替换成abc
- 跳转到行:
:数字
:跳转到指定行号,例如 :10
跳转到第10行。
- 设置选项:
:set nu
:显示行号。
:set nonu
:关闭行号显示。
- 执行外部命令:
:!命令:在 Vim 内部执行外部命令,例如 :!ls 列出目录内容。
- 搜索内容:
/搜索内容
:向下搜索指定内容。
?搜索内容
:向上搜索指定内容。
- 删除行:
:数字d
:删除指定行号的行,例如 :10d
删除第10行。
- 复制和移动行:
:数字m数字
:将指定行移动到另一行号,例如 :10m20
将第10行移动到第20行。
:数字t数字
:将指定行复制到另一行号,例如 :10t20
将第10行复制到第20行。
- 折叠代码:
:fold
:创建一个折叠。
:foldopen
:打开一个折叠。
- 执行宏:
:@寄存器
:执行寄存器中的宏,例如 :@a
执行寄存器 a
中的宏。
- 分屏操作:
:vs 文件名:进行分屏的多模块操作,编辑代码
对于多窗口,光标在哪一个窗口,那么所执行的操作是对应的窗口,那我们怎么进行窗口操作进行光标切换呢?
最简单的做法是:Ctrl+w+w(Ctrl按住别动,w按两下)(在命令模式下)
有了上面的做法,当然就可以进行窗口间的互相编写,命令的交接使用,比如左窗口代码拷贝到右窗口。
使用vim的一个小技巧:
vim 文件 +n:上次光标+n行,打开文件就是到达原来光标位置+n行对应的光标位置;
!关键字:执行最近一次含有该关键字的指令。
vim的配置
在我们的普通用户,也就是自己创建的,使用的账号下,会存在一些隐藏文件,其中有一个文件叫做:.vimrc
bash
lfz@hcss-ecs-ff0f:~$ ls -al
total 60
drwxr-x--- 4 lfz lfz 4096 Dec 14 19:06 .
drwxr-xr-x 4 root root 4096 Oct 8 23:34 ..
-rw------- 1 lfz lfz 12418 Dec 13 16:09 .bash_history
-rw-r--r-- 1 lfz lfz 220 Oct 3 15:14 .bash_logout
-rw-r--r-- 1 lfz lfz 3771 Oct 3 15:14 .bashrc
-rw------- 1 lfz lfz 20 Dec 12 19:10 .lesshst
drwxrwxr-x 5 lfz lfz 4096 Dec 12 19:04 lesson
drwxrwxr-x 3 lfz lfz 4096 Oct 3 19:54 .local
-rw-r--r-- 1 lfz lfz 807 Oct 3 15:14 .profile
-rw-r--r-- 1 lfz lfz 0 Oct 3 15:42 .sudo_as_admin_successful
-rw------- 1 lfz lfz 12042 Dec 14 19:06 .viminfo
这里我们可以自己touch一个.vimrc文件:
bash
lfz@hcss-ecs-ff0f:~$ touch .vimrc
然后我们通过vim默认打开.vimrc文件:
bash
lfz@hcss-ecs-ff0f:~$ vim .vimrc
接下来我们就可以通过对.vimrc的文件编辑进行对该用户(lfz)的vim工具的配置
我们需要在.vimrc中编辑配置信息,比如配置信息:
bash
set nu
然后我们保存退出后(wq),再打开(vim)文件,就直接显示行号了。
我们通过:
bash
lfz@hcss-ecs-ff0f:~$ which vim
/usr/bin/vim
可以发现,其实vim是我们在/user/bin/vim目录下给我们安装的一款软件,使用vim,就是把该目录进行打开了,该软件在默认情况下,会自动在你当前用户的home目录 里搜索配置文件.vimrc,如果没有,vim就使用默认行为,如果有,vim在打开时就会读取.vimrc这个配置文件来进行配置,在.vimrc文件,我们想要注释掉信息的话,使用 " :(如下例子)
bash
1 "set nu
这样,我们再次通过vim打开文件就不会再直接显示行号了。
还有系统默认,全局公用的vimrc,这是默认存在的,不管在普通用户还是root用户,我们在Ubuntu下,可以打开该文件进行了解:
bash
lfz@hcss-ecs-ff0f:~$ vim /etc/vim/vimrc
我们推荐的是配置自己home目录下的.vimrc就行,由于权限的存在,该配置文件只有我这个用户(lfz)可以使用,这样就不会影响到其他普通用户。
我们可以在网上找几个配置项,下面是我的配置项,可以参考参考的,如果愿意的话:
我的系统版本是:
cpp
lfz@hcss-ecs-ff0f:~$ cat /etc/os-release
PRETTY_NAME="Ubuntu 22.04.4 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.4 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy
lfz@hcss-ecs-ff0f:~$ cat /etc/issue
Ubuntu 22.04.4 LTS \n \l
配置项:(about:Ubuntu)
在此之前:
Vim-Plug未安装 :.vimrc
文件中使用了Vim-Plug作为插件管理器,如果您的系统中没有安装Vim-Plug,那么插件将无法安装。您可以通过以下命令安装Vim-Plug:
bash
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
手动安装 gruvbox
: 如果 Vim-Plug 没有成功安装 gruvbox
,你可以尝试手动安装它。使用以下命令克隆 gruvbox
仓库到你的 Vim 插件目录:
bash
git clone https://github.com/morhetz/gruvbox.git ~/.vim/plugged/gruvbox
手动复制颜色文件 :如果gruvbox
插件已经安装,但是Vim仍然无法找到颜色方案,你可以尝试手动将gruvbox.vim
文件复制到~/.vim/colors
目录下。
bash
mkdir -p ~/.vim/colors
cp ~/.vim/plugged/gruvbox/colors/gruvbox.vim ~/.vim/colors/
打开.vimrc配置:
bash
" 基本设置
set nocompatible " 必须
syntax enable " 启用语法高亮
set background=dark " 背景色
colorscheme gruvbox " 颜色方案
" 界面设置
set number " 显示行号
"set relativenumber " 显示相对行号
set cursorline " 高亮当前行
set nowrap " 不自动换行
set linebreak " 在换行处断行
set autoread " 文件在外部被修改后自动重新读取
set mouse=a " 启用鼠标支持
set clipboard=unnamedplus " 允许vim使用系统剪贴板
set expandtab " 将制表符展开为空格
set tabstop=4 " 设置制表符宽度为4
set shiftwidth=4 " 设置缩进宽度为4
set softtabstop=4 " 设置软制表符宽度为4
set list " 显示特殊字符
set listchars=tab:▸\ ,eol:¬,trail:⋅,extends:❯,precedes:❮
set wildmenu " 增强命令行自动补全
set wildmode=list:longest,full
set scrolloff=3 " 保持三行距离
set sidescrolloff=15 " 侧边滚动距离
set foldmethod=indent " 代码折叠方式
set foldlevel=1 " 默认折叠级别
set laststatus=2 " 总是显示状态栏
"set statusline=%<%f\ %h%m%r%{fugitive#statusline()}%=%-14.(%l,%c%V%)\ %P
" 插件管理
call plug#begin('~/.vim/plugged')
Plug 'preservim/nerdtree' " 文件浏览器
Plug 'Xuyuanp/nerdtree-git-plugin' " NERDTree的git插件
Plug 'airblade/vim-gitgutter' " GitGutter
Plug 'vim-airline/vim-airline' " 状态栏增强
Plug 'vim-airline/vim-airline-themes'
Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
Plug 'junegunn/fzf.vim'
Plug 'tpope/vim-fugitive'
Plug 'jiangmiao/auto-pairs'
Plug 'godlygeek/tabular'
Plug 'AndrewRadev/splitjoin.vim'
Plug 'tomtom/tcomment_vim'
Plug 'sbdchd/neoformat'
Plug 'junegunn/vim-easy-align'
Plug 'terryma/vim-multiple-cursors'
Plug 'tpope/vim-surround'
Plug 'preservim/vim-commentary'
Plug 'sheerun/vim-polyglot' " 多语言支持
call plug#end()
" 代码格式化工具配置
" 使用neoformat自动格式化代码
autocmd FileType * nnoremap <leader>f :Neoformat<CR>
let g:neoformat_try_formatprg = 1
" 对于C/C++,使用clang-format
autocmd FileType c,cpp nnoremap <leader>f :0,$!clang-format<CR>
" 对于Python,使用autopep8
autocmd FileType python nnoremap <leader>f :0,$!autopep8<CR>
" 其他个人设置
" 这里可以添加其他个人化的设置
其实现在对于CentOS是较全的,对于CentOS,我们通过该网站,可以得到较为全面的插件:
(就是在卸载的时候有点卸不干净)