Linux笔记之vim操作

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跨文件进行复制粘贴

  1. 用vim打开一个文件,如: test1.c
  2. 在普通模式下,输入命令:" :sp(横向切分一个窗口)",或者 ":vsp(纵向切分一个窗口)",然后就会有两个窗口打开同一个文件
  3. 在普通模式下切换窗口命令(ctrl+w,再按下w)
  4. 在一个窗口普通模式下输入命令:":e /home/file/path/test2.c",就可以在另一个窗口打开另一个文件
  5. 这时就可以通过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)中的第一行时,依次按下 dp 键,则 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
相关推荐
用户041328465131 小时前
Linux 查看端口占用的 6 种方法:ss、netstat、lsof 实战
linux
二宝哥1 小时前
Rocky Linux 10.2 安装 PostgreSQL 15 完整教程
linux·运维·postgresql
不会就选b1 小时前
Linux之线程池(二)
linux·运维·服务器
M78佐菲1 小时前
Linux学习笔记:进程回收、exec函数簇与线程
linux·笔记·学习·算法
OpenFDE开源桌面1 小时前
实操:如何将安卓 App与Linux系统应用级融合(附代码)
android·linux
Nontee1 小时前
Quartz 集群 + 策略模式:逾期预警推送系统设计实录
linux·服务器·策略模式
NJCloud1 小时前
Openstack(一)——基础环境配置与依赖服务安装
linux·架构·openstack
额额额对了1 小时前
Linux C 多线程编程基础:从内存模型到生命周期管理
linux·开发语言·算法