当前位置: 首页 > 工具软件 > vim4perl > 使用案例 >

Vim快捷键 小记

汪丁雷
2023-12-01

定位

vim进入编辑模式

编辑模式:一般模式下不可以修改某个字符,若要修改字符,只能进入编辑模式。从一般模式进编辑模式,只需按i、I、a、A、o、O、r和R中某个键即可。当进入编辑模式时,在屏幕尾部会显示INSERT或REPLACE字样(若你的centos支持中文,则会显示“插入”)。从编辑模式回到一般模式,按esc即可。

i:在当前字符前插入。
I:在光标所在行的行首插入。
a:在当前字符后插入。
A:在光标所在行的行尾插入。
o:在当前行的下一行插入新的一行。
O:在当前行的上一行插入新的 一行。

vim命令行模式退出

退出方法: 如果是输出状态,首先按Esc键退出输入状态,然后按Shift+“;”,再输入q!或wq!(不保存改动,wq!是保存文件的写入修改)退出。 补充: 只要按住shift键盘,下面的这些命令都可以用:

1、如果你想编辑某个文档,可以直接编辑的如:你有文档AA,可以用vi AA 【注意:必须在AA所在的目录下】。
2、如果没有文档,而且你又想编辑就可以直接编辑vi aa【名字你可以随便命名】。
3、也可以先建立一个文档touch aa ,然后再编辑vi aa。
4、编辑器有三种模式:
		1、命令行模式 2、末行模式 3、输入模式。
5、按Esc 就可以进入命令行模式,也是系统默认模式。
6、输入模式可以按 o i a 都可以进入,退出可以进入末行和命令行模式。
7、末行模式可以按ctrl+;它的主要功能是退出编辑器,也可以保存退出文档。 
8、q! 【强制退出不保存】,q【退出不保存】,wq【退出并保存后面也可以加个!】。
9、在输入模式和命令行模式命令很多。
10、如复制(yy)、粘贴(p)、删除(d)等等。

要换行的话,最好的方法是按下 esc 或 ctrl + [ 回到 normal 模式,再用 o/O 在下方/上方插入新行。至于你在另一个回答下提到行尾插入冒号的问题,在 normal 模式下用 A 也可以轻松定位。

再说一点,频繁用 esc 返回 normal 模式确实比较麻烦。最好交换左 ctrl 和 capslock 的键位,然后用 ctrl + [ 。一般 linux 桌面环境都可以直接设置。如果你用的桌面环境不支持,也可以用 xmodmap 命令

vim命令模式下的搜索

命令模式:输入:或者/即可进入命令模式。该模式下,可以搜索字符或字符串,可以保存、替换、退出、显示行号等操作。

/word:在光标之后查找一个字符串word,按n向后继续搜索,shift+n向上搜索。
?word:在光标之前查找一个字符串word,按n向后继续搜索。

搜索出来的字符串都会高亮显示,若想不高亮,输入:nohl。

:n1,n2s/word1/word2/g:在n1和n2行之间查找word1并替换为word2,不加g则只替换每行的第一个word1。(先起点然后逗号分隔,再终点s表示替换/需替换的/替换后的/g表示全部。$表示到最末端)
:1,$s/word1/word2/g:将文档中所有的word1替换为word2,不加g则只替换每行的第一个word1。

vim普通模式下的光标位置移动

1. ngg或nG 跳转到第n行行首,按gg,n不输入默认为1,按G时,不输入n表示跳转到最后一行
2. :n  跳转到n行  需要输入回车键 先输入 :然后输入行号(这个是命令行模式)
3. vim +n filename  在打开文件后,跳转到文件的第n行
4. $或End键 跳转到行尾
5. ^或0或Home键 可以跳转回行首
6. Ctrl+O,Ctrl+I
7. Ctrl+o/Ctrl+i 跳到光标的上次位置/跳到光标下次的位置
8. hjkl 代替箭头键 ←↓↑→
9. w 跳到下一个单词的开始
10.b 跳到上一个单词的开始
11.e 跳到单词的结束
12.{/} 移动到段首/段尾
13.H/M/L 移动光标到屏幕顶端/中间/底部

vim命令行模式下删除复制

1. nyy 复制从当前开始的n行
2. ndd 删除并且复制从当前开始的n行
3. p/P 在下一行插入复制的内容/在上一下插入复制的内容
4. d$/D 删除当前光标所在位置到某一行的结尾
5. dL 删除当前位置到屏幕上最后一行的内容
6. dH 删除当前位置到屏幕上第一行的内容
7. dG 删除当前位置到工作缓存区结尾的内容
8. d1G 删除当前位置到工作缓存区开始的内容
9. u 撤回之前操作的一步

Vim 搜索

最简单的搜索

?<search_string>回车

默认情况下,搜索会定位到一个离当前光标最近的一个匹配结果。如果我们想要转到下一个/上一个搜索结果,请使用以下按键:

n/N 寻找下一个匹配结果/寻找上一个匹配结果

基本语法

: s(substitute)命令用来查找和替换字符串。语法如下:

:{作用范围}s/{目标}/{替换}/{替换标志}

作用范围

1.  :s 搜索当前行 
	例如 :s/foo/far/g
2.  :%s 搜索全文  
	例如 :%s/foo/bar/g
3.  可视模式下选择区域后输入:Vim 即可自动补全为 :'<,'>
	例如 :'<,'>s/foo/bar/g
4.  :n1,n2s  n1和n2行号之间
	例如 :2,11s/foo/bar/g
5.  :.,+2s 当前行 . 与接下来两行 2的范围
6.  :.,-2s 当前行 . 与往上的两行 2的范围
7.  :.,$s 当前行 . 到最后一行的范围

替换标志符

1.  g 表示全局 global 替换(即替换目标的所有出现)
2.  i/I  i表示大小写不敏感查找,I 表示大小写敏感:
	例  :%s/foo/bar/i    foo可以匹配到 FOO,FOo,fOo,fOO等等
 	等效的 \c/\C   \c指定大小写不敏感  \C指定大小写敏感
	例  :%s/foo\c/bar	foo可以匹配到 FOO,FOo,fOo,fOO等等
3.  c  表示需要确认,例如全局查找 "foo" 替换为 "bar" 并且需要确认
	例  :%s/foo/bar/gc
	之后光标移到每个匹配foo出现的位置,并提示
	replace with bar (y/n/a/q/l/^E/^Y)?
	按下 y 表示替换,n 表示不替换,a 表示替换所有,
	q 表示退出查找模式, l 表示替换当前位置并退出。
	^E 与 ^Y 是光标移动快捷键。

注:要搜索整个单词,请键入<标记单词的开头,输入搜索模式,键入>标记单词的结尾:
: s/<foo>/bar/ 该foo只能匹配到 foo 匹配不了包含 foo的单词,如果 food 就会匹配不了。

正则搜索模式

:[range]s/{pattern}/{string}/[flags] [count]

该命令在[range]中的每一行中搜索{pattern},并将其替换为{string}。 是与命令[count]相乘的正整数。
如果未给出[range]和[count],则仅替换当前行中找到的pattern。 当前行是光标所在的行。

注:除了斜杠字符(/),您还可以使用任何其他非字母数字的单字节字符作为分隔符。 当您在搜索模式中包含“ /”字符或替换字符串时,此选项很有用。
:s|foo|bar|

{pattern} 可以是任何正则表达式 不过pattern中的有特殊含义的字符需要用  \ 转义
如
:%$/\s+/   就只会匹配到一个空格和+号,
:%$/\s\+/  才会正常匹配到一串空格

以上的并不是真正的正则表达式匹配,为了打开真正的正则模式可以设置打开正则开关

magic 介绍

1.设置magic
:set magic
2. 取消magic
:set nomagic
3. 查看帮助
:h magic

vim 毕竟是个编辑器,正则表达式中包含的大量元字符如果原封不动地引用(像 perl 那样), 势必会给不懂正则表达式的人造成麻烦,比如 /foo(1) 命令, 大多数人都用它来查找foo(1)这个字符串, 但如果按照常规的正则表达式来解释,被查找的对象就成了 foo1 了。因为在小括号 () 不是普通的字符,而是有特殊含义的字符,小括号 () 包裹的内容视为一个整体项,这里小括号只含有 1,那么就匹配 1,加上前面的字符串 foo,那么匹配的字符串就是 foo1。

于是,vim 就规定,常规的正则表达式的元字符必须用反斜杠进行转义才行, 如上面的例子,如果确实要用常规的正则表达式,就应当写成 /foo(1) 。 但是,像 .、* 这种极其常用的正则表达式元字符,都加上反斜杠就太麻烦了。 而且,众口难调,有些人喜欢用常规的正则表达式,有些人不喜欢用…

为了解决这个问题,vim 设计 magic 这个东西。简单地说, magic 就是用来设置哪些元字符要加反斜杠哪些不用加的工具。

(一)长效设置

要在“底行命令模式”下设置 vim 的 magic,设定方法为:

命令说明
set magic设置 magic,除了 $.*^[ ] 之外其他正则表达式的元字符都要加反斜杠进行转义,否则视为普通的字符,这是 vim 的默认设置
set nomagic取消 magic,除了 $^ 之外其他元字符都要加反斜杠
h magic查看帮助

(二)临时设置

这个设置也可以在正则表达式中通过 \m\M\v\V共 4 个开关来临时切换。

指令说明
\m表示后面的正则表达式会按照 magic 处理,例如,/\m.*(ktv),后面的 (ktv) 是 5 个普通的字符,而不是分组,要当成分组使用,小括号前面要加上转义符号 \ 才行
\M后面的正则表达式按照 nomagic处理, 而忽略实际的 magic 设置
\vvery magic,意为非常魔幻,又叫模式开关。任何元字符都不用加反斜杠,vim 会自动识别元字符。该模式下,除下划线_#、英文字母以及数字之外的所有字符都具有特殊含义
\Vvery nomagic,意为非常不魔幻,其实就是非常不智能,非常傻的模式,又叫原义开关。任何元字符都必须加反斜杠,任何有特殊含义的字符都必须加反斜杠,否则视为普通字符。该模式下只有反斜杠 \ 具有特殊意义,其它的都是普通字符

magic模式下的正则表达式简介

vimperl说明
**0个或多个(匹配优先)
\++1个或多个(匹配优先)
\? 或 \=?0个或1个(匹配优先),?不能在 ? 命令(逆向查找)中使用
\{n,m}{n,m}n个到m个(匹配优先)
\{n,}{n,}最少n个(匹配优先)
\{,m}{,m}最多m个(匹配优先)
\{n}{n}恰好n个
\{-n,m}{n,m}?n个到m个(忽略优先)
\{-}*?0个或多个(忽略优先)
\{-1,}+?1个或多个(忽略优先)
\{-,1}??0个或1个(忽略优先)

从上表中可见,vim的忽略优先量词不像perl的 *? +? ?? 那样,而是统一使用 {- 实现的。 这大概跟忽略优先量词不常用有关吧。

环视和固化分组
vim居然还支持环视和固化分组的功能,强大,赞一个 关于环视的解释请参考Yurii的《精通正则表达式》 一书吧。

vimperl说明
\@=(?=顺序环视
\@!(?!顺序否定环视
\@<=(?<=逆序环视
\@<!(?<!逆序否定环视
\@>(?>固化分组
\%(atom)(?:非捕获型括号

和perl稍有不同的是,vim中的环视和固化分组的模式的位置与perl不同。 例如,查找紧跟在 foo 之后的 bar,perl将模式写在环视的括号内, 而vim将模式写在环视的元字符之前。

Perl的写法 /(?<=foo)bar/
vim的写法 /(foo)@<=bar/
元字符说明
.匹配任意一个字符
[abc]匹配方括号中的任意一个字符。可以使用-表示字符范围,
[a-z0-9]匹配小写字母和阿拉伯数字。
[^abc]在方括号内开头使用^符号,表示匹配除方括号中字符之外的任意字符。
\d匹配阿拉伯数字,等同于[0-9]。
\D匹配阿拉伯数字之外的任意字符,等同于[^0-9]。
\x匹配十六进制数字,等同于[0-9A-Fa-f]。
\X匹配十六进制数字,等同于[^0-9A-Fa-f]。
\w匹配单词字母,等同于[0-9A-Za-z_]。
\W匹配单词字母之外的任意字符,等同于[^0-9A-Za-z_]。
\t匹配字符。
\s匹配空白字符,等同于[ \t]。
\S匹配非空白字符,等同于[^ \t]。
\a所有的字母字符. 等同于[a-zA-Z]
\l小写字母 [a-z]
\L非小写字母 [^a-z]
\u大写字母 [A-Z]
\U非大写字母 [^A-Z]

Vim折叠操作(折叠代码、折叠函数、方法、类等)

普通模式下手动折叠(默认折叠方式)

字母 z 折叠操作符
启动折叠操作符zf,后面可以接动作(motion)或文本对象(text-object)确定折叠的范围。

zfi{      # 折叠光标当前所在的大括号{里面的文本
zfa{      # 折叠光标当前所在的大括号{里面的文本和大括号本身
zfG       # 从当前光标所在行开始,折叠到文件尾
zf10j     # 从当前光标所在行开始,继续向下折叠10行
zfip      # 折叠内部段落

展开光标当前所在折叠zo,o估计是open。
收缩光标当前所在折叠zc,c估计是close
其他常用命令,可查看帮助文档:h fold-commands

za    # 切换(alternative)折叠状态,只能用在已折叠/未折叠的行
zR    # 展开所有折叠
zM    # 收缩所有折叠

可视模式下的折叠操作

可视模式选中文本,之后按 zf 即可实现折叠。

命令模式下的折叠操作

语法 :{range}fold

折叠范围(range)常见设置

,$    # 当前行到最后一行
m,n   # 第m行与第n行之间
m,    # 第m行与当前行之间
,n    # 当前行与第n行之间
,+n   # 当前行及其之后的n行

文件加密

vi加密。进入vi,输入":X" 之后按回车就提示你输入两次密码。之后:wq 保存退出。再次进入时就提示你输入密码了。如果你不想要密码了,就:X 提示你输入密码时连续按两次回车,就搞定了。哈哈。**

常用vim配置【/etc/vim/vimrc】

if has("syntax")
    syntax on
endif

set hlsearch
set cursorline

" If using a dark background within the editing area and syntax highlighting
" turn on this option as well
"set background=dark

" Uncomment the following to have Vim jump to the last position when
" reopening a file
"au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif

" Uncomment the following to have Vim load indentation rules and plugins
" according to the detected filetype.
"filetype plugin indent on

" The following are commented out as they cause vim to behave a lot
" differently from regular Vi. They are highly recommended though.
"set showcmd		" Show (partial) command in status line.
set showmatch		" Show matching brackets.
"set ignorecase		" Do case insensitive matching
set smartcase		" Do smart case matching
"set incsearch		" Incremental search
"set autowrite		" Automatically save before commands like :next and :make
"set hidden		" Hide buffers when they are abandoned
"set mouse=a		" Enable mouse usage (all modes)
set nu
set ts=4
set foldmethod=syntax
"1. manual //手工定义折叠
"2. indent //用缩进表示折叠
"3. expr //用表达式来定义折叠
"4. syntax //用语法高亮来定义折叠
"5. diff //对没有更改的文本进行折叠
"6. marker //用标志折叠
set ai
set nu
set number
set showmatch
set autoindent
set cindent
set noignorecase
set ruler
set scrolloff=5
set tabstop=4
set shiftwidth=4
set wrap
set showcmd        " Show (partial) command in status line.
set showmatch        " Show matching brackets.
set ignorecase        " Do case insensitive matching
set smartcase        " Do smart case matching
"set incsearch        " Incremental search
"set autowrite        " Automatically save before commands like :next and :make
"set hidden             " Hide buffers when they are abandoned
set mouse=a        " Enable mouse usage (all modes)
set smartindent
" Source a global configuration file if available
if filereadable("/etc/vim/vimrc.local")
	source /etc/vim/vimrc.local
endif
syntax enable
syntax on
 类似资料: