Linux中vim相关操作
命令行模式下的操作
vim里搜索关键字
进入命令行模式,如搜索关键字tmp: /tmp + 回车
- /+关键字,回车:为从文档当前位置向下查找关键字,n键查找下一位置
- ?+关键字,回车:为从文档当前位置向上查找关键字,n键向上查找关键字
如果输入查找的内容忽略大小写,则设置'ignorecase'选项:
:set ignorecase
如果恢复区分大小写:
:set noignorecase
help帮助命令
进入命令行模式
:help
获得特定主题的帮助
:help {主题}
退出帮助窗口
"ZZ"命令:即"shift+zz"键
普通模式下的操作
vim删除字符
删除一个字符---"x"
将光标移到需要删除的字符上面,然后按下"x"键,就删除了一个字符。
删除一行字符---"dd"
将光标移到需要删除的一整行上,然后使用"dd"命令,即连按"d"键两次,就会删除一整行,并且后一行就会移上来填补删除的一行。
删除换行符---"J"
即需要将两行之间的换行符删除,将两行连接起来,将光标移到这一行,输入"J",即"shift+j"键。
撤销---"u"
撤销上一个编辑操作,输入"u"键。
重做---"CTRL+R"
撤销上一个撤销,输入"CTRL+R"回退前一个命令。
光标移动
词移动
**"w"命令:**移动光标跳到下一个单词词首,使用"w"命令,可以直接在命令前加数字前缀表示将命令重复多次,"3w"表示向前移动3个单词移动后光标在单词的词首。
**"b"命令:**移动到前一个单词的词首。
**"e"命令:**移动到下一个单词的词末。
**"ge"命令:**移动到前一个单词的末尾。
移动到行首或行尾
**"$"命令和<End>键:**将光标移动到当前行行尾。
**"^"和"0"命令,<Home>键:**将光标移动到当前行的行首。
移动到一个指定的字符
即当前行的字符的查找:
**"fx"命令:**向前查找本行中的字符x。
**"Fx"命令:**向后查找本行中的字符x。
括号匹配
**"%"命令:**用于匹配一对括号,如果光标在"("上,它回对应的移动到")"上,同样适用于"\[\]"和"{}"上。
移动到指定的行,文件末尾和首行
**"G"命令:**计数前缀加上"G"(shift+G),如果没有计数前缀,"G"命令将光标移动到文件末,移动到文件首的命令是"gg"。
"ngg / nG"表示移动到第n行,移动到第n行也可以用命令窗口(:num)
查找一个单词
**""命令:**将光标移动到需要查找的单词上面,然后按""键,vim就会取得光标上的单词作为查找的字符串;
如果选中单词没有高亮,运行一下命令
bash
:set hls
替换命令
全局替换忽略大小写命令 [:%s/BMZ/NMZ/gi]
当前行替换 [:s/BMZ/NMZ/g]
替换前检查 [:%s/BMZ/NMZ/gc]
% - 表示整个文件
s - 替换命令
g - 全局替换(每行所有匹配)
c - 每次替换前确认
i - 忽略大小写
插入模式下的操作
| 命令 | 描述 |
|---|---|
| i | 在光标前插入 |
| a | 在光标后追加 |
| I | 在行首第一个非空白字符插入 |
| A | 在行尾插入 |
| o | 在当前行下方开启新行并插入 |
| O | 在当前行上方开启新行并插入 |
在插入模式下删除操作:
bash
[Ctrl+h]: 删除前一个字符,同退格键
[ctrl+w]:删除前一个单词
[ctrl+u]:删至行首
复制,剪切和粘贴
剪切文本行
"dd"命令剪切当前行;
"ndd"命令:剪切n行,n表示大于1的数字;
"p"命令将内容粘贴当前光标行的下一行
dw:从光标处剪切至一个单子/单词的末尾,包括空格
de:从光标处剪切至一个单子/单词的末尾,不包括空格
d$:从当前光标剪切到行末
d0:从当前光标位置(不包括光标位置)剪切之行首
d3l:从光标位置(包括光标位置)向右剪切3个字符
d5G:将当前行(包括当前行)至第5行(不包括它)剪切
d3B:从当前光标位置(不包括光标位置)反向剪切3个单词
dH:剪切从当前行至所显示屏幕顶行的全部行
dM:剪切从当前行至命令M所指定行的全部行
dL:剪切从当前行至所显示屏幕底的全部行
复制文本行
"yy"命令复制当前文本行;
"p"命令将内容粘贴当前光标行的下一行。
yy:复制当前行
nyy:n表示大于1的数字,复制n行
yw:从光标处复制至一个单子/单词的末尾,包括空格
ye:从光标处复制至一个单子/单词的末尾,不包括空格
y$:从当前光标复制到行末
y0:从当前光标位置(不包括光标位置)复制之行首
y3l:从光标位置(包括光标位置)向右复制3个字符
y5G:将当前行(包括当前行)至第5行(不包括它)复制
y3B:从当前光标位置(不包括光标位置)反向复制3个单词
自由选择复制,剪切与粘贴
在命令模式下移动光标定位到内容选取处,按下"v"命令进入可视模式 ,即自由选取模式,选择好内容后,按下"d"命令进行内容剪切 ,按下"y"命令进行内容复制 ,移动光标到需要复制/粘贴的位置处,按下"p"命令进行内容的粘贴。
Vim 配置文件(.vimrc)
Vim启动时,会根据配置文件(.vimrc)来配置Vim。
Vim 配置文件分为系统配置文件和用户配置文件:
- 系统配置文件位于 Vim 的安装目录(默认路径为 /etc/.vimrc);
- 用户配置文件位于主目录 ~/.vimrc,即通过执行
vim ~/.vimrc命令即可对此配置文件进行合理修改。通常情况下,Vim 用户配置文件需要自己手动创建(touch ~/.vimrc)。
注意,Vim 用户配置文件比系统配置文件的优先级高,换句话说,Vim 启动时,会优先读取 Vim 用户配置文件(位于主目录中的),所以我们只需要修改用户配置文件即可(不建议直接修改系统配置文件)。
| 设置参数 | 功能描述 |
|---|---|
| set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936 set termencoding=utf-8 set encoding=utf-8 | 设置编码格式,encoding 选项用于缓存的文本、寄存器、Vim 脚本文件等;fileencoding 选项是 Vim 写入文件时采用的编码类型;termencoding 选项表示输出到终端时采用的编码类型。 |
| set nu set number | nu 是 number 的缩写,所以上面两个配置命令是完全等效的,二选一即可。取消行号可使用 set nonu。 |
| set cursorline | 突出显示当前行。 |
| set mouse=a set selection=exclusive set selectmode=mouse,key | Vim 编辑器里默认是不启用鼠标的,通过此设置即可启动鼠标。 |
| set autoindent | 设置自动缩进,即每行的缩进同上一节相同。 |
| set tabstop=4 | 设置 Tab 键宽度为 4 个空格。 |
在vim中的配置文件如下:
shell
set nocompatible "确保vim使用默认的兼容模式,避免与其他编辑器产生兼容性问题
filetype on "文件类型识别
filetype indent on
filetype plugin on
"打开文件类型检测,可以用智能补全"
filetype plugin indent on
set backspace=indent,eol,start "设置backspace键的行为
let mapleader=" "
set expandtab "空格代替TAB缩进
set shiftwidth=4
set softtabstop=4
set tabstop=4
set smarttab
syntax on "语法高亮
set number "设置行号
set norelativenumber
set cursorline "当前行加下划线
set wrap
set showcmd "在状态栏上显示当前输入的命令
set wildmenu "命令模式自动补齐
"搜索配置
set hlsearch "搜索高亮
exec "nohlsearch" | "exec 每次打开文件都会执行
set incsearch "增量搜索
set ignorecase "搜索忽略大小写
set smartcase "搜索时智能大小写
noremap = nzz
noremap - Nzz
noremap <LEADER><CR> :nohlsearch<CR>
autocmd BufReadPost * if line("'\"") > 0|if line("'\"") <= line("$")|exe("norm '\"")|else|exe "norm $"|endif|endif
"上下左右键的映射
"noremap i k
"noremap k j
"noremap j h
"h 进入插入模式
"noremap h i
map S :w!<CR>
"map R :source ~/.vim/vimrc <CR>
map <C-n> :NERDTreeToggle<CR>
"插件
call plug#begin('~/.vim/plugged')
Plug 'vim-airline/vim-airline'
Plug 'connorholyday/vim-snazzy'
Plug 'itchyny/lightline.vim'
Plug 'vim-scripts/taglist.vim'
"Plug 'ycm-core/YouCompleteMe'
Plug 'preservim/nerdtree'
call plug#end()
autocmd StdinReadPre * let s:std_in=1
autocmd VimEnter * if argc() == 0 && !exists("s:std_in") | NERDTree | endif
autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.isTabTree()) | q | endif
let g:NERDTreeDirArrowExpandable = '+'
let g:NERDTreeDirArrowCollapsible = '-'
nmap tt :TlistToggle<cr>
"分屏
map sr :set splitright<CR>:vsplit<CR>
map sl :set nosplitright<CR>:vsplit<CR>
map su :set nosplitbelow<CR>:split<CR>
map sd :set splitbelow<CR>:split<CR>
map <LEADER>h <C-w>h
map <LEADER>k <C-w>k
map <LEADER>l <C-w>l
map <LEADER>j <C-w>j
map tu :tabe<CR>
map tn :-tabnext<CR>
map ti :+tabnext<CR>
"背景色
"let g:lightline = {
"\ 'colorscheme':'snazzy',
"\}
"let g:SnazzyTransparent = 1 "透明
"color snazzy
autocmd BufNewFile *.cpp,*.[ch],*.sh,*.py exec ":call SetTitle()"
autocmd BufNewFile * normal G
function SetTitle()
if &filetype == 'sh'
call setline(1, "\#!/bin/sh")
call append(line("."), "################################################################################")
call append(line(".")+1, "# Copyright 2020-2023 by xxxxxx.")
call append(line(".")+2, "# All right reserved. See COPYRIGHT for detailed Information.")
call append(line(".")+3, "#")
call append(line(".")+4, "# @file ".expand("%:t"))
call append(line(".")+5, "# @brief ")
call append(line(".")+6, "#")
call append(line(".")+7, "# @author Tanner<Tanner@xxx.cn>")
call append(line(".")+8, "# @date ".strftime("%Y-%m-%d"))
call append(line(".")+9, "# @history 1.")
call append(line(".")+10, "################################################################################")
elseif &filetype == 'py'
call setline(1, "#!/usr/bin/env python")
call append(line("."), "################################################################################")
call append(line(".")+1, "# Copyright 2020-2023 by xxxxxx.")
call append(line(".")+2, "# All right reserved. See COPYRIGHT for detailed Information.")
call append(line(".")+3, "#")
call append(line(".")+4, "# @file ".expand("%:t"))
call append(line(".")+5, "# @brief ")
call append(line(".")+6, "#")
call append(line(".")+7, "# @author Tanner<Tanner@xxx.cn>")
call append(line(".")+8, "# @date ".strftime("%Y-%m-%d"))
call append(line(".")+9, "# @history 1.")
call append(line(".")+10, "################################################################################")
elseif &filetype == 'c' || &filetype == 'cpp' || &filetype == 'h'
call setline(1, "/******************************************************************************")
call append(line("."), "* copyright 2020-2023 by xxxxxx.")
call append(line(".")+1, "* all right reserved. see copyright for detailed information.")
call append(line(".")+2, "*")
call append(line(".")+3, "* @file ".expand("%:t"))
call append(line(".")+4, "* @brief ")
call append(line(".")+5, "*")
call append(line(".")+6, "* @author Tanner<Tanner@xxx.cn>")
call append(line(".")+7, "* @date ".strftime("%Y-%m-%d"))
call append(line(".")+8, "* @history 1.")
call append(line(".")+9, "*****************************************************************************/")
endif
endfunc
vim跨文件进行复制粘贴
- 用vim打开一个文件,如: test1.c
- 在普通模式下,输入命令:" :sp(横向切分一个窗口)",或者 ":vsp(纵向切分一个窗口)",然后就会有两个窗口打开同一个文件
- 在普通模式下切换窗口命令(ctrl+w,再按下w)
- 在一个窗口普通模式下输入命令:":e /home/file/path/test2.c",就可以在另一个窗口打开另一个文件
- 这时就可以通过yy(复制命令),p(粘贴命令)进行在两个文件之间进行复制粘贴
vimdiff命令进行文件比较
vimdiff 等同于 vim -d 命令,即 Vim 编辑器的 diff 模式。
该命令后面通常会接两个或多个文件名作为参数,这些文件会同时在 Vim 编辑器的分割窗口中打开,并高亮显示文件中内容有差异的部分。
命令使用:
vimdiff file1 file2
光标移动
可以使用下列两种快捷键,在文件的各个差异点之间前后移动:
], c:跳转到下个差异点[, c:跳转到上个差异点
至于光标在两个窗口之前的切换,可以使用如下按键:
Ctrl-w, l:光标切换到右侧的窗口Ctrl-w, h:光标切换到左侧的窗口Ctrl-w, w:光标在两个窗口间彼此切换
内容合并
可以使用 d, p (即 diff put)命令,将当前差异点中的内容覆盖到另一文件中的对应位置。
如当光标位于左侧文件(file1)中的第一行时,依次按下 d、p 键,则 file1 中的 Line one 被推送到右侧,并替换掉 file2 中对应位置上的 Line 1 。
同时操作两个文件
vimdiff 实际上是 Vim 编辑器的 diff 模式,因此适用于 Vim 编辑器的命令和快捷键也同样可以在该模式下使用。常用的几个命令如下:
:qa:退出所有文件:wa:保存所有文件:wqa:保存并退出所有文件qa!:强制退出(不保存)所有文件z o:查看被折叠的内容z c:重新折叠
vimdiff中查看二进制文件命令:
bash
:%!xxd -g 1
vim中自动补全功能
内置自动补全功能
自动补全可以在插入模式下触发,当我们触发补全功能的时候,vim会根据当前编辑会话中所有缓冲区的内容建立一张补全列表,然后根据当前光标左侧的字符进行检测
bash
<Ctrl - n> :使用来自补全列表中的下一项内容(next)
<Ctrl - p> :使用来自补全列表中的上一项内容(prev)
<Down> :与 <Ctrl -n>相同
<Up>:与 <Ctrl - p> 相同
<Ctrl -y> :确认使用当前选中的匹配项
<Ctrl - e> : 还原最初的输入项
<Ctrl -h> :从当前匹配项中删除一个字符
<Ctrl - l> :从当前匹配项中增加一个字符
自定义补全项来源
默认情况下,vim 补全项主要来源于以下几个地方:
缓冲区列表:vim补全项最基本的来源就是当前的缓冲区列表。它可以通过 <Ctrl - x><Ctrl - n> 来触发该项。
包含文件,所有的编程语言都有包含文件的概念,例如 c/c++中的#include , python中的 import 。使用 可以触发这个选项,让vim从被包含文件中提取补全项。vim本身使用 c 语言编写的,它能够识别 c/c++ 语言中的关键字,我们可以指定 include 项来使 vim认识其他不同的关键字。一般常用的编程语言 vim 都能够识别,因此不需要修改 include 项。
标签文件,我们使用 ctags 或者类似的插件的时候会生成一个标签文件,该文件会将扫描到代码中的关键字、函数、变量等的索引放入到一个文件中以供后续进行跳转。同时他们也会产生一系列的补全项到补全列表中。可以使用 <Ctrl+x><Ctrl+]> 来触发
一般直接使用 <Ctrl + n> 触发的是当前缓冲区列表中的补全项,使用 <Ctrl+x> 作为前缀,可以触发其他类型的补全项。这么做有一个好处是尽量精简补全列表,减少了我们手动遍历的过程。但是有时候我们并不知道我想要的内容该从哪里来,有没有什么办法能做到,用 <Ctrl + n> 这个按钮就可以调用其他所有来源的补全项呢?
要做到这点,可以使用 complete 这个配置项。该项包含一组由逗号分隔的单个字符表示的参数,当参数出现时表示需要扫描该参数代表的位置。使用 set complete? 可以看到,缺省项为 complete=.,w,b,u,t。我们可以使用 set complete-=i 或者 set complete+=k 来删除或者添加某个扫描位置。常见的位置参数如下所示:
bash
. : 表示当前以打开的缓冲区
w : 当前打开的窗口
b : 当前缓冲区列表
u : 当前处于缓冲区列表中,但是未打开的缓冲区
t : 当前标签文件
U : 当前打开的,不属于缓冲区列表中的缓冲区
k : 从字典文件中加载的补全项
i : 从当前文件和包含文件中读取
d : 从当前文件和包含文件中读取使用 define定义的宏
完整的内容可以使用 :h 'complete' 来查看。
可视模式
命令:
| 命令 | 作用 |
|---|---|
| v | 激活面向字符的可视模式 |
| Ctrl + v | 激活面向列块的可视模式 |
| Shift + v | 激活面向行的可视模式 |
退出可视模式:Esc键
创建分割窗口
命令:
| 命令 | 作用 |
|---|---|
| <Ctrl+w> + s | 水平切分当前窗口,新窗口仍显示当前缓冲区 |
| <Ctrl+w> + v | 垂直切分当前窗口,新窗口仍显示当前缓冲区 |
| :split {file} | 水平切分当前窗口,新窗口中载入{file} |
| :vsplit {file} | 垂直切分当前窗口,新窗口中载入{file} |
| <Ctrl+w> + w | 在窗口间循环切换 |
| <Ctrl+w> + h/j/k/l | 切换到左/下/上/右边窗口 |
| :close (普通命令:<Ctrl+w>+c) | 关闭活动窗口 |
| :only (普通命令:<Ctrl+w>+o) | 只保留活动窗口,关闭其他所有窗口 |
| <Ctrl+w> + = | 使所有窗口等宽,等高 |
用标签页将窗口分组
命令:
| 命令 | 作用 |
|---|---|
| :tabedit {filename} | 在新标签页中打开{filename} |
| <Ctrl+w>T | 把当前窗口移到一个新标签页 |
| :tabclose | 关闭当前标签页及其中的所有窗口 |
| :tabonly | 只保留活动标签页,关闭其他所有标签页 |
| :tabnext (普通命令:{N}gt) | 切换到编号为{N}的标签页 |
| :tabnext (普通命令:gt) | 切换到下一标签页 |
| :tabprevious (普通命令:gT) | 切换到上一标签页 |
VIM中进行批量注释
进行小段注释
bash
方法 1
添加注释:
Ctrl+v:选中要加注释的行
Shift+i:插入模式
按Shift+3 = #号
按3次ESC键
取消注释:
Ctrl+v 选中要减注释的#号
按d 删除
方法 2
:set number 从第几行
添加注释#号
:3,5 s/^/#/g
取消注释号
:3,5 s/^#//g
大段注释
bash
光标移动到要加注释的行的第一行 .代表当前行 $代表最后一行
添加注释
:.,$ s/^/#/g
取消注释
:.,$ s/^#//g
进行全部注释
bash
0 代表首行 %通配符 匹配所有行
添加注释
:0,$ s/^/#/g
取消注释
:0,$ s/^#//g
添加注释
:% s/^/#/g
取消注释
:% s/^#//g