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就会取得光标上的单词作为查找的字符串;

如果选中单词没有高亮,运行一下命令

:set hls

替换命令

全局替换忽略大小写命令     [:%s/BMZ/NMZ/gi]
当前行替换                            [:s/BMZ/NMZ/g]
替换前检查                            [:%s/BMZ/NMZ/gc]

% - 表示整个文件
s - 替换命令
g - 全局替换(每行所有匹配)
c - 每次替换前确认
i - 忽略大小写

插入模式下的操作

命令描述
i在光标前插入
a在光标后追加
I在行首第一个非空白字符插入
A在行尾插入
o在当前行下方开启新行并插入
O在当前行上方开启新行并插入
在插入模式下删除操作:
[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中的配置文件如下:

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中查看二进制文件命令:
:%!xxd -g 1
vim中自动补全功能

内置自动补全功能

自动补全可以在插入模式下触发,当我们触发补全功能的时候,vim会根据当前编辑会话中所有缓冲区的内容建立一张补全列表,然后根据当前光标左侧的字符进行检测

<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 来删除或者添加某个扫描位置。常见的位置参数如下所示:

. : 表示当前以打开的缓冲区
w : 当前打开的窗口
b : 当前缓冲区列表
u : 当前处于缓冲区列表中,但是未打开的缓冲区
t : 当前标签文件
U : 当前打开的,不属于缓冲区列表中的缓冲区
k : 从字典文件中加载的补全项
i : 从当前文件和包含文件中读取
d : 从当前文件和包含文件中读取使用 define定义的宏
完整的内容可以使用 :h 'complete' 来查看。
可视模式

命令:

命令作用
v激活面向字符的可视模式
Ctrl + v激活面向列块的可视模式
Shift + v激活面向行的可视模式

退出可视模式:Esc键

创建分割窗口

命令:

命令作用
<Ctrl+w> + s水平切分当前窗口,新窗口仍显示当前缓冲区
<Ctrl+w> + v垂直切分当前窗口,新窗口仍显示当前缓冲区
:sp[lit] {file}水平切分当前窗口,新窗口中载入{file}
:vsp[lit] {file}垂直切分当前窗口,新窗口中载入{file}
<Ctrl+w> + w在窗口间循环切换
<Ctrl+w> + h/j/k/l切换到左/下/上/右边窗口
:clo[se] (普通命令:<Ctrl+w>+c)关闭活动窗口
:on[ly] (普通命令:<Ctrl+w>+o)只保留活动窗口,关闭其他所有窗口
<Ctrl+w> + =使所有窗口等宽,等高
用标签页将窗口分组

命令:

命令作用
:tabe[dit] {filename}在新标签页中打开{filename}
<Ctrl+w>T把当前窗口移到一个新标签页
:tabc[lose]关闭当前标签页及其中的所有窗口
:tabo[nly]只保留活动标签页,关闭其他所有标签页
:tabn[ext] (普通命令:{N}gt)切换到编号为{N}的标签页
:tabn[ext] (普通命令:gt)切换到下一标签页
:tabp[revious] (普通命令:gT)切换到上一标签页
VIM中进行批量注释

进行小段注释

方法 1
添加注释:
Ctrl+v:选中要加注释的行 
Shift+i:插入模式   
按Shift+3 = #号       
按3次ESC键
取消注释:
Ctrl+v 选中要减注释的#号      
按d  删除
方法 2
:set number   从第几行
添加注释#号
:3,5 s/^/#/g
取消注释号
:3,5 s/^#//g

大段注释

光标移动到要加注释的行的第一行    .代表当前行  $代表最后一行
添加注释
:.,$ s/^/#/g
取消注释
:.,$ s/^#//g

进行全部注释

0 代表首行   %通配符 匹配所有行
添加注释
:0,$ s/^/#/g
取消注释
:0,$ s/^#//g
添加注释
:% s/^/#/g
取消注释
:% s/^#//g
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值