vim基础概念介绍

学习过程中整理的一些资料,仅供查阅,权威资料建议参考帮助文档。

1、vim几种常用模式
正常模式:可以使用快捷键命令
命令行模式:正常模式按:输入命令行。
插入模式:可以输入文本,在正常模式下,按i、a、o等都可以进入插入模式。
可视模式:正常模式下按v可以进入可视模式(如果想控制头和尾,按o/O进行切换), 在可视模式下,移动光标可以选择文本。按V进入可视行模式, 总是整行整行的选中。ctrl+v进入可视块模式。
替换模式:正常模式下,按R进入。
把命令模式和输入模式的切换有Append,Insert,Replace,Subsitute 记作AIRS,而AIRS的英文字母的大小写意思是不一样的。小写的表示characterwise(字符),大写的表示linewise(行)


2、vim启动
vim [参数] [文件 ..] 编辑指定的文件
vim [参数] - 从标准输入(stdin)读取文本
vim [参数] -t tag 编辑 tag 定义处的文件
vim [参数] -q [errorfile] 编辑第一个出错处的文件
vim 空 无文件名

3、vim启动参数
-- 在这以后只有文件名
-v Vi 模式 (同 "vi")
-e Ex 模式 (同 "ex")
-E Improved Ex mode
-s 安静(批处理)模式 (只能与 "ex" 一起使用)
-d Diff 模式 (同 "vimdiff")
-y 容易模式 (同 "evim",无模式)
-R 只读模式 (同 "view")
-Z 限制模式 (同 "rvim")
-m 不可修改(写入文件)
-M 文本不可修改
-b 二进制模式
-l Lisp 模式
-C 兼容传统的 Vi: 'compatible'
-N 不完全兼容传统的 Vi: 'nocompatible'
-V[N][fname] Be verbose [level N] [log messages to fname]
-D 调试模式
-n 不使用交换文件,只使用内存
-r 列出交换文件并退出
-r (跟文件名) 恢复崩溃的会话
-L 同 -r
-A 以 Arabic 模式启动
-H 以 Hebrew 模式启动
-F 以 Farsi 模式启动
-T <terminal> 设定终端类型为 <terminal>
-u <vimrc> 使用 <vimrc> 替代任何 .vimrc
--noplugin 不加载 plugin 脚本
-P[N] 打开 N 个标签页 (默认值: 每个文件一个)
-o[N] 打开 N 个窗口 (默认值: 每个文件一个)
-O[N] 同 -o 但垂直分割
`+ 启动后跳到文件末尾
+<lnum> 启动后跳到第 <lnum> 行
--cmd <command> 加载任何 vimrc 文件前执行 <command>
-c <command> 加载第一个文件后执行 <command>
-S <session> 加载第一个文件后执行文件 <session>
-s <scriptin> 从文件 <scriptin> 读入正常模式的命令
-w <scriptout> 将所有输入的命令追加到文件 <scriptout>
-W <scriptout> 将所有输入的命令写入到文件 <scriptout>
-x 编辑加密的文件
--startuptime <file> Write startup timing messages to <file>
-i <viminfo> 使用 <viminfo> 取代 .viminfo
-h 或 --help 打印帮助(本信息)并退出
--version 打印版本信息并退出

引用:https://www.jianshu.com/p/9c9ad9a97452

4、文档操作
:e file --关闭当前编辑的文件,并开启新的文件。 如果对当前文件的修改未保存,vi会警告。
:e! file --放弃对当前文件的修改,编辑新的文件。
:e+ file -- 开始新的文件,并从文件尾开始编辑。
:e+n file -- 开始新的文件,并从第n行开始编辑。
:enew --编译一个未命名的新文档。(CTRL-W n)
:e -- 重新加载当前文档。
:e! -- 重新加载当前文档,并丢弃已做的改动。
:e#或ctrl+^ -- 回到刚才编辑的文件,很实用。
:f或ctrl+g -- 显示文档名,是否修改,和光标位置。
:f filename -- 改变编辑的文件名,这时再保存相当于另存为。
gf -- 打开以光标所在字符串为文件名的文件。
:w -- 保存修改。
:n1,n2w filename -- 选择性保存从某n1行到另n2行的内容。
:n1,n2 w>>fox 将n1至n2追加到fox文件中
:wq -- 保存并退出。
ZZ -- 保存并退出。
ZQ -- 不保存退出
:x -- 保存并退出。
:q[uit] ——退出当前窗口。(CTRL-W q或CTRL-W CTRL-Q)
:q! 不保存退出
:saveas newfilename -- 另存为
:browse e -- 会打开一个文件浏览器让你选择要编辑的文件。 如果是终端中,则会打开netrw的文件浏览窗口; 如果是gvim,则会打开一个图形界面的浏览窗口。 实际上:browse后可以跟任何编辑文档的命令,如sp等。 用browse打开的起始目录可以由browsedir来设置:
:set browsedir=last -- 用上次访问过的目录(默认);
:set browsedir=buffer -- 用当前文件所在目录;
:set browsedir=current -- 用当前工作目录;
:Sex -- 水平分割一个窗口,浏览文件系统;
:Vex -- 垂直分割一个窗口,浏览文件系统
:Ex --(:Explore)开启目录浏览,可以浏览当前目录下的所有文件,可以选择
:suspend或Ctrl - Z 挂起vim,回到shell,按fg可以返回vim
:shell 不关闭vi切换到shell命令行,退回到vi使用:exit

5、编辑多个文件
vi a.txt b.txt c.txt

使用:next(:n)编辑下一个文件。
:2n 编辑下2个文件。
:next!命令,可以强制切换到第二个文件,但所做改动也将会丢失。
:set autowrite命令打开自动保存功能,可以避免数据丢失的意外情况;
:set noautowrite则可以关闭自动保存功能。
:previous或:N编辑上一个文件。
:wnext,保存当前文件,并编辑下一个文件。
:wprevious或wNext保存当前文件,并编辑上一个文件。
:n filenames或:args filenames 指定新的文件列表。
vi -o filenames 在水平分割的多个窗口中编辑多个文件。
vi -O filenames 在垂直分割的多个窗口中编辑多个文件。
:args可以列示打开的多个文件,并用中括号“[]”标识出正在编辑的文件名
:argument命令,直接切换到指定的文件 如:argument 3将切换至列表中的第三个文件
:first或:rewind命令,可以快速切换到第一个文件
:last命令,则可以快速切换到最后一个文件
n+Ctrl+^ 切换到第n个文件

vim -p files: 打开多个文件,每个文件占用一个标签页。
:tabe, tabnew  如果加文件名,就在新的标签中打开这个文件, 否则打开一个空缓冲区。
:tabnew filename 添加一个新标签
ctrl+w gf  在新的标签页里打开光标下路径指定的文件。
:tabn  切换到下一个标签。Control + PageDown,也可以。
:tabp  切换到上一个标签。Control + PageUp,也可以。
[n] gt  切换到下一个标签。如果前面加了 n , 就切换到第n个标签。第一个标签的序号就是1。
[n] gT  切换到上一个标签。如果前面加了 n , 就切换到第n个标签。第一个标签的序号就是1。
:tab split  将当前缓冲区的内容在新页签中打开。
:tabc[lose]  关闭当前的标签页。
:tabo[nly]  关闭其它的标签页。
:tabs  列出所有的标签页和它们包含的窗口。
:tabm[ove] [N]  移动标签页,移动到第N个标签页之后。 如 tabm 0 当前标签页,就会变成第一个标签页。

6、缓冲区
:buffers或:ls或:files 显示缓冲区列表。
:buffers!或:ls!或:files! 显示缓冲区列表,包括隐藏缓冲区unlisted-buffer
ctrl+6或“:e#”或“:n#”:在最近两个缓冲区间切换,实现在#(current filename)和 %(alternate filename)文件之间快速切换的目的
:bn -- 下一个缓冲区(bnext)。
:bp -- 上一个缓冲区(bprevious)。
:bl -- 最后一个缓冲区(blast)。
:bf -- 第一个缓冲区(bfirst)
:b[n]或:[n]b -- 切换到第n个缓冲区。
:b 2.txt 可以直接进入文件2.txt编辑
:nbw(ipeout) -- 彻底删除第n个缓冲区。
:nbd(elete) -- 删除第n个缓冲区,并未真正删除,还在unlisted列表中。
:bd 2.txt 删除2.txt文件缓冲区,并未真正删除,还在unlisted列表中。
:ba[ll] -- 把所有的缓冲区在当前页中打开,每个缓冲区占一个窗口。
:sbuffer 缓冲区编号或文件名 --在一个新窗口中打开一个缓冲区

假设你正在编辑文件"one.txt"现在需要转而编辑"two.txt". 你可能会直接使用":edit two.txt"命令, 但是你已经对"one.txt"作出了改动,所以这一命令会失败, 同时你又不希望现在就保存文件"one.txt"的内容. Vim对此的解决方案是:
:hide edit two.txt
缓冲区"one.txt"从屏幕上消失, 但Vim保存了它的当前状态. 这叫做隐藏缓冲区: 缓冲区中确有内容但你看不到它.
":hide"命令的参数是另一个命令. 它使该命令工作于°hidden° 选项被设置的状态. 你也可以自行设置该选项. 效果是当你的缓冲区看似被丢弃时, 它实际上只是隐藏了起来
hide与vertical都是这样的特殊命令, 它们以一个完整的命令作为参数, 只是以一种方式影响该命令的执行, 同时此类命令并非对所有命令都有效, 它只对那些涉及其影响效果的命令起使用, 如vertical命令只是影响新开窗口的布局, 是水平的还是垂直的.这样它对那些根本不会打开窗口的命令就形同虚设

缓冲区内容:
1 #h "help.txt" line 62

2 %l+ "usr_21.txt" line 1

3 "usr_toc.txt" line 1

第一列是缓冲区编号. 你可以在编辑该文件时以此代替文件名, 见下文. 缓冲区编号之后是缓冲区类型标志字符. 然后是文件名和上次退出时光标所在的行号. 可能的缓冲区类型标志字符如下(从左到右):
u 未被列出的缓冲区|unlisted-buffer|
# 上一次的活动缓冲区
l 被载入并显示在某窗口中的缓冲区
h 被载入但隐藏的缓冲区.
= 只读的缓冲区
- 不可编辑的缓冲区, 其中°modifiable°选项被关闭
+ 有改动的缓冲区

其中对数字缓冲区的使用,删除或复制时,每次将所有区后移,1到2,2到3,......,9原有被清空并被8覆盖

7、窗口分割
:split(:sp) -- 把当前窗水平分割成两个窗口。(CTRL-W s 或 CTRL-W CTRL-S) 注意如果在终端下,CTRL-S可能会冻结终端,请按CTRL-Q继续。
:split filename -- 水平分割窗口,并在新窗口中显示另一个文件。
:nsplit(:nsp) -- 水平分割出一个n行高的窗口。
:[N]new -- 水平分割出一个N行高的窗口,并编辑一个新文件。 (CTRL-W n或 CTRL-W CTRL-N)
ctrl+w f --水平分割出一个窗口,并在新窗口打开名称为光标所在词的文件 。
Ctrl+w Ctrl+^ -- 水平分割一个窗口,打开刚才编辑的文件。

:vsplit(:vsp) -- 把当前窗口分割成水平分布的两个窗口。 (CTRL-W v或CTRL CTRL-V)
:[N]vne[w] -- 垂直分割出一个新窗口。
:vertical 水平分割的命令: 相应的垂直分割。

:qall -- 关闭所有窗口,退出vim。
:qall! -- 放弃保存,关闭所有窗口,退出vim。
:wall -- 保存所有修改过的窗口。
:wqall -- 保存并退出
:all -- 将已经打开的多个文件分配水平的窗口
:vertical all -- 将已经打开的多个文件分配垂直的窗口
:only -- 只保留当前窗口,关闭其它窗口。(CTRL-W o)
:close -- 关闭当前窗口,CTRL-W c能实现同样的功能。 (象 :q :x同样工作 )

ctrl+w + --当前窗口增高一行。也可以用n增高n行。
ctrl+w - --当前窗口减小一行。也可以用n减小n行。
ctrl+w _ --当前窗口扩展到尽可能的大。也可以用n设定行数。
:resize n -- 当前窗口n行高。
:res(ize) +num --窗口大小增加num行
:vertical res(ize) num --窗口大小调整为num列
ctrl+w = -- 所有窗口同样高度。
n ctrl+w _ -- 当前窗口的高度设定为n行。
ctrl+w < --当前窗口减少一列。也可以用n减少n列。
ctrl+w > --当前窗口增宽一列。也可以用n增宽n列。
ctrl+w | --当前窗口尽可能的宽。也可以用n设定列数。

Ctrl-w q 即 :q 结束分割出来的视窗。如果在新视窗中有输入需要使用强制符!即:q!(Gvim下可用)
ctrl+w ctrl+w: 切换到下一个窗口。或者是ctrl+w w。
ctrl+w p: 切换到前一个窗口。
ctrl+w h(l,j,k):切换到左(右,下,上)的窗口。
ctrl+w t(b):切换到最上(下)面的窗口。
ctrl+w H(L,K,J): 将当前窗口移动到最左(右、上、下)面。
ctrl+w r:旋转窗口的位置。
ctrl+w T: 将当前的窗口移动到新的标签页上。
:Ex(:Explore) 开启目录浏览,可以浏览当前目录下的所有文件,可以选择
:Sex(:Sexplore)水平分割当前窗口,并在一个窗口中开启目录浏览器
:vs 垂直拆分当前窗口。最初,每个窗口将显示相同的缓冲区。(vertical split) 在“ vs”之前加上数字以设置新的窗口宽度。

8、文件编码及格式
:e ++enc=utf8 filename, 让vim用utf-8的编码打开这个文件。
:w ++enc=gbk,不管当前文件什么编码,把它转存成gbk编码。
:set fenc或:set fileencoding,查看当前文件的编码。
在vimrc中添加set fileencoding=ucs-bom,utf-8,cp936,vim会根据要打开的文件选择合适的编码。 注意:编码之间不要留空格。 cp936对应于gbk编码。 ucs-bom对应于windows下的文件格式。

文件格式大致有三种文件格式:unix, dos, mac. 三种格式的区别主要在于回车键的编码:dos 下是回车加换行,unix 下只有 换行符,mac 下只有回车符。
:e ++ff=dos filename, 让vim用dos格式打开这个文件。
:w ++ff=mac filename, 以mac格式存储这个文件。
:set ff,显示当前文件的格式。
在vimrc中添加set fileformats=unix,dos,mac,让vim自动识别文件格式。

9、vim句、段、节介绍
*sentence*
A sentence is defined as ending at a '.', '!' or '?' followed by either the end of a line, or by a space or tab.  Any number of closing ')', ']', '"' and ''' characters may appear after the '.', '!' or '?' before the spaces, tabs or end of line.  A paragraph
and section boundary is also a sentence boundary.
If the 'J' flag is present in 'cpoptions', at least two spaces have to follow the punctuation mark; <Tab>s are not recognized as white space. The definition of a sentence cannot be changed.

*sentence*

一个句子以 '.'、'!' 或者 '?' 结尾并紧随着一个换行符、空格或者制表符。标点和空白字符之间可以出现任何数量的闭括号和引号: ')'、']'、'"' (双引号)和 '''(单引号)。另,段落和小节的边界也视为句子的边界。
如果 'cpoptions' 包含 'J' 标志位,那么标点之后的空格至少要出现两个,而且制表符不被视为空白字符。


  *paragraph* 
A paragraph begins after each empty line, and also at each of a set of paragraph macros, specified by the pairs of characters in the 'paragraphs' option.  The default is "IPLPPPQPP TPHPLIPpLpItpplpipbp", which corresponds to the macros ".IP", ".LP", etc.  (These
are nroff macros, so the dot must be in the first column).  A section boundary is also a paragraph boundary. Note that a blank line (only containing white space) is NOT a paragraph boundary.
Also note that this does not include a '{' or '}' in the first column.  When the '{' flag is in 'cpoptions' then '{' in the first column is used as a paragraph boundary |posix|.

*paragraph*

一个段落从空行或某一个段落宏命令开始,段落宏由 'paragraphs' 选项里成对出现的字符所定义。它的缺省值为 "IPLPPPQPP TPHPLIPpLpItpplpipbp",也就是宏 ".IP"、".LP"等 (这些是 nroff 宏,所以句号一定要出现在第一列)。小节边界也被视为段落边界。注意
空白行 (只包含空白) _不是_ 段落边界。

也要 注意: 这不包括首列出现的 '{' 或 '}'。如果 'cpoptions' 里包含 '{' 标志位,那么首列的 '{' 用作段落边界 |posix|。

*section*
A section begins after a form-feed (<C-L>) in the first column and at each of a set of section macros, specified by the pairs of characters in the 'sections' option.  The default is "SHNHH HUnhsh", which defines a section to start at the nroff macros ".SH",
".NH", ".H", ".HU", ".nh" and ".sh".

The "]" and "[" commands stop at the '{' or '}' in the first column.  This is useful to find the start or end of a function in a C program.  Note that the first character of the command determines the search direction and the second character the type of brace
found.

If your '{' or '}' are not in the first column, and you would like to use "[[" and "]]" anyway, try these mappings: >
   :map [[ ?{<CR>w99[{
   :map ][ /}<CR>b99]}
   :map ]] j0[[%/{<CR>
   :map [] k$][%?}<CR>

[type these literally, see |<>|]

*section*

一个小节从首列出现的换页符 (<C-L>) 或某一个小节宏命令开始。小节宏由 'sections'选项里成对出现的字符所定义。它的缺省值是 "SHNHH HUnhsh",也就是说小节可以从如下的 nroff 宏开始: ".SH"、".NH"、".H"、".HU"、".nh" 和 ".sh"。

"]" 和 "[" 命令也停在首列出现的 '{' 或 '}' 上。这有助于在 C 程序里找到函数的开始和结束位置。 注意: 命令的第一个字符决定搜索的方向,第二个字符决定要找到的括号。

如果你的 '{' 或 '}' 不在第一列但是你还是希望用 "[[" 和 "]]" 来找它们,试试这些映射: >
   :map [[ ?{<CR>w99[{
   :map ][ /}<CR>b99]}
   :map ]] j0[[%/{<CR>
   :map [] k$][%?}<CR>
[照文本直接输入,参见 |<>|]

10、名词解释
动词
d 表示删除(delete)
r 表示替换(replace)
c 表示修改(change)
y 表示复制(yank)
v 表示选取(visual select)
名词
w 表示一个单词(word)
s 表示一个句子(sentence)
p 表示一个段落(paragraph)
t 表示一个 HTML 标签(tag)
引号或者各种括号所包含的文本称作一个文本块。
介词
i 表示“在...之内”(inside)
a 表示“环绕...”(around)
t 表示“到...位置前”(to)
f 表示“到...位置上”(forward)
动词+介词/数词+名词
dip 删除一个段落: delete inside paragraph
vis 选取一个句子: visual select inside sentence
ciw 修改一个单词: change inside word
caw 修改一个单词: change around word
dtx 删除文本直到字符“x”(不包括字符“x”): delete to x
dfx 删除文本直到字符“x”(包括字符“x”): delete forward x
c3w 修改三个单词:change three words
d2w 删除两个单词:delete two words
数词+动词+名词
2dw 两次删除单词(等价于删除两个单词): twice delete word
3x  三次删除字符(等价于删除三个字符):three times delete character

11、文件比较
vimdiff f1 f2  --直观的比较f1和f2的不同(vimdiff是shell下一个链接命令,指向vim)
:vertical diffsplit xxx --垂直方式比较当前文件和xxx文件
zo --打开光标下面的一个折叠(open)
zO --打开光标下面的所有折叠
zc --关闭光标下面的一个折叠(close)
zC --关闭光标下面的所有折叠
:set noscrollbind --取消文件比较中的同步滚屏功能
]c --跳到下一个修改点
[c --跳到上一个修改点
dp --把光标所在窗口的差异改到另一个窗口(:diffput)
do --把光标所在窗口的差异改为另一个窗口的(:diffget) o=obtain
:diffoff! --强制关闭比较模式


12、其他
以二进制方式打开文件 vim –b binaryfile 
:%!xxd 扩展命令模式下,利用xxd命令转换为可读的十六进制  
:%!xxd –r 编辑二进制文件,在扩展命令模式下,利用xxd命令转换回二进制  
:%!xxd -g 1 表示每1个字节为1组
:%!xxd -g 2 表示每2个字节为1组(默认)
:%!xxd -g 4 表示每4个字节为1组
:%!xxd -r   将vim恢复成原来的显示
hexdump -C filename 显示文件的16进制

vim中:set设置的是选项, let设置的是变量
buffer-variable b: 局部于当前缓冲区。
window-variable w: 局部于当前窗口。
tabpage-variable t: 局部于当前标签页。
global-variable g: 全局。
local-variable l: 局部于函数。
script-variable s: 局部于 :source 的 Vim 脚本。
function-argument a: 函数参数 (只限于函数内使用)。
vim-variable v: Vim 预定义的全局变量。

在 Vim 中, 编辑命令 (editing commands) 有着如下的结构:
<number> <operator> <text object or motion>
<数字>   <操作符>   <文本对象或移动命令>
number: 数字用于在文本对象或移动操作上进行多次执行, 比如说, 向后 3 个单词, 向前 2 个段落. 数字是可选的, 可以出现命令(command) 的前面,也可以放在命令的后面.
如果是 motion 和下面所提到的 operator 都有数字修饰, 那么效果是两个数字相乘. 比如, 2d3w 是删除 6 个单词.
operator: 操作符, 比如, change, delete (删除), yank (复制). 操作符也是可选的. 但是如果没有操作符的话, 那么就只剩一个移动命令, 而非一个编辑命令了.

移动命令 vs 文本对象命令
一个使用移动的命令, 比如, cw, 是从光标处开始生效.
一个使用文本对象的命令, 比如, ciw, 如果光标在何处, Vim 都将在整个文本对象上生效.
是一个移动命令还是一个文本对象命令, 区别在于是否有 a (around) 或者 i (inner) 这样的限制. 对于每个类型的文本对象都是如此.                     使用文本对象的方式可以节省你将光标移动到 "正确" 的位置的时间.

选择模式与可视模式相似,也是用来选中文字的。但 有一个显著区别: 当输入文本的时候,在选择模式下,被选中的文字将被替换成新输入的 文字。Ctrl+g可以在可视模式与选择模式之间切换

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值