编辑模式:一般模式下不可以修改某个字符,若要修改字符,只能进入编辑模式。从一般模式进编辑模式,只需按i、I、a、A、o、O、r和R中某个键即可。当进入编辑模式时,在屏幕尾部会显示INSERT或REPLACE字样(若你的centos支持中文,则会显示“插入”)。从编辑模式回到一般模式,按esc即可。
i:在当前字符前插入。
I:在光标所在行的行首插入。
a:在当前字符后插入。
A:在光标所在行的行尾插入。
o:在当前行的下一行插入新的一行。
O:在当前行的上一行插入新的 一行。
退出方法: 如果是输出状态,首先按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 命令
命令模式:输入:或者/即可进入命令模式。该模式下,可以搜索字符或字符串,可以保存、替换、退出、显示行号等操作。
/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。
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 移动光标到屏幕顶端/中间/底部
1. nyy 复制从当前开始的n行
2. ndd 删除并且复制从当前开始的n行
3. p/P 在下一行插入复制的内容/在上一下插入复制的内容
4. d$/D 删除当前光标所在位置到某一行的结尾
5. dL 删除当前位置到屏幕上最后一行的内容
6. dH 删除当前位置到屏幕上第一行的内容
7. dG 删除当前位置到工作缓存区结尾的内容
8. d1G 删除当前位置到工作缓存区开始的内容
9. u 撤回之前操作的一步
?<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\+/ 才会正常匹配到一串空格
以上的并不是真正的正则表达式匹配,为了打开真正的正则模式可以设置打开正则开关
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 设置 |
\v | very magic,意为非常魔幻,又叫模式开关。任何元字符都不用加反斜杠,vim 会自动识别元字符。该模式下,除下划线_ 、# 、英文字母以及数字之外的所有字符都具有特殊含义 |
\V | very nomagic,意为非常不魔幻,其实就是非常不智能,非常傻的模式,又叫原义开关。任何元字符都必须加反斜杠,任何有特殊含义的字符都必须加反斜杠,否则视为普通字符。该模式下只有反斜杠 \ 具有特殊意义,其它的都是普通字符 |
vim | perl | 说明 |
---|---|---|
* | * | 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的《精通正则表达式》 一书吧。
vim | perl | 说明 |
---|---|---|
\@= | (?= | 顺序环视 |
\@! | (?! | 顺序否定环视 |
\@<= | (?<= | 逆序环视 |
\@<! | (?<! | 逆序否定环视 |
\@> | (?> | 固化分组 |
\%(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] |
字母 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 提示你输入密码时连续按两次回车,就搞定了。哈哈。**
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