vim user manual - Getting Started

Usr_01.txt 关于用户手册

文本内(指用户手册文件)超链接跳转

光标移动到目标位置(非超链接的文本也可)

ctrl + ]   // 前进
ctrl + o  // 后退,可多次后退

超链接文本由两个竖线框出来,但一般为隐藏状态,可使用:set conceallevel=0修改隐藏等级(可能还需要设置样式:hi link HelpBar Normal)。

要使用此时提到的所有特性,需要Vim正确安装,并处于nocompatible模式即不兼容Vi。(使用:set compatible?命令检查vim安装状态)
另外可使用vimtutor可以快速浏览vim基础用法(vimtutor具体用法见文档)
超链接(tag)的定义可以使用星号。:hi link HelpStar Normal可以显示出来,关于tag的用法见29.1

Usr_02.txt 使用Vim的第一步

gvim或vim命令运行Vim

gvim打开的是一个GUI编辑窗口,附带一个Menu,除此之外和vim在命令窗口中类似

vim file.txt  // 若文件不存在则创建,新建的文件打开时vim编辑器窗口最下面命令行有提示

tilde(~)指明该行不存在于文件中(文件末尾之后)

插入与模式

vim有两种模式Normal和Insert,在Normal下的按键均为命令,此时按下i进入编辑模式,通过ESC返回到Normal模式。通过命令:set showmodevim将在最下行显示当前的所处的模式。无论何时都可以使用ESC到Normal模式。

移动光标

在Normal模式下使用hjkl命令分别向左、下、上、中移动一行光标

hjkl在顺手的位置,避免去使用箭头浪费大量的时间

删除字符

使用x在Normal模式下删除当前光标下的字符
使用dd删除当前行
使用J删除当前行尾的换行符(注意是大写的命令,一般需要按住shift)

撤销与恢复

u撤销一次操作,ctrl+r恢复,U撤销当前行所有的操作

需要安装的Vim处在“Vim way”,而不是“Vi way”,即不兼容Vi的状态

追加

i是在当前的光标字母之前插入,但此时不好应付末尾的情况,a则是在当前光标的字符之后插入

插入新行

o在当前行的下方插入一行新行
O在上方插入新行

使用数字

可在任何的命令之前添加一个数字表示该命令的执行次数,如,9j光标下移9行,3a!ESC追加三个!。

退出

ZZ命令仅退出当前的文档,而不是编辑器。

退出时,修改会自动保存

:q!可直接退出不保存修改,:e!可以不退出而重新加载原文档覆盖当前的所有修改。

寻求帮助

使用:help {subject}命令查询帮助文档。

//默认查询在Normal状态下的命令如
:help x
:help deleting
:help index  // 完整的vim命令索引
:help ctrl-a  //查询ctrl在命令前加ctrl-
// 查询插入模式下的命令
:help i_ctrl-h
// 查询vim命令行参数
:help -t  //即前面加-
//查询vim配置参数
:help 'number'  //即使用单引号括起来
//其他特殊按键使用<>括起来查询
:help some  // tab补全,ctrl+d列出候选项
:help i_

其他的help的用法参见help-summary

Usr_03.txt 移动光标

单词为单位移动

w向右移动一个单词
b向左移动一个单词
均移动到单词的首字母。ege同样是向左右移动但移动到尾字母

关于选项'iskeyword'
顾名思义该选项中的内容作为关键字,主要用于确定单词的边界方便用于搜索和匹配,比如这里的移动需要寻找单词边界、模式匹配查找、ctrl+]确定搜索内容的边界。使用:set iskeyword&会将其内容重置为默认值,win32下为"@,48-57,_,192-255",192之后的为拉丁文不用管。


格式为:"@,^a-z,48-57, -~,^,_,^",其中@表示所有的大小写字母,a-z表示a到z的字母但前面加了^表示的排除,要表示^需要放在最后,^,放中间表示排除逗号, -~表示空格到~,48~57表示的ASCII码的数字(数字不能直接放到选项中需要使用对应的ASCII码),127以上的十进制值参见:help digraph-table

由于iskeyword选项内容会对w移动的单词边界造成影响(比如is/are可以被认为是两个,也可以被认为是一个,关键在于/字符是否在该选项中),所以如果只想通过空格区分那么使用W

移动到行首/行尾

$移动到行尾,在前面可是添加数字:2$表示移动到下一行的行尾
^移动到该行第一个非空字符
0移动到该行第一个字符
移动到行首的两个命令无法使用数字

移动到某个字符

fx在当前行将光标跳转到查找到的第一个字符x(如果x存在),f即find,可以在前面添加数字查找非第一个如3fl查找当前行的第三个l。f是从当前光标的位置开始查找的。
F从后往前查找。
tf命令一致,只是光标将停在查找到的字母前面,意为to。
T表示从反方向查找
这四种命令执行后,都可以使用;,命令下下一个或者上一个查找结果移动

可以使用ESC取消命令

匹配括号

当光标处于(按下%,会跳转到匹配的),反过来也行,同样对于[]{}也生效。当光标不处于一个括号时,会先查找到第一个括号,然后指向其匹配。

跳转到指定行

33G跳转到第33行,G跳转到最后一行。1Ggg表示跳转到第一行。
50%跳转到整个文件的50%的位置。
HML表示当前可看见行的高中低位置。

显示当前所在位置

ctrl+g将会显示编辑的文件名、所在行、总行数、列位置等

"usr_03.txt" line 233 of 650 --35%-- col 45-52,col有两个值,第一个表示以字符为单位的位置,后一个表示以屏幕位置,这里Tab认为是一个字符,但屏幕宽度可能站4个字符。

set number设置number选项会在每行前面显示行数。由于是布尔值使用set nonumber关闭。

set ruler设置ruler选项可以在右下角里显示当前的位置,格式和ctrl+g产生的结果一样。

滚动屏幕

ctrl+u将滚动块向上移动半屏幕即内容向下移动半屏幕,ctrl+d将滚动块向下移动半屏幕。
ctrl+e将滚动块向下移动一行,ctrl+y将滚动块向上移动一行。

注意滚动块的方向和内容的方向相反

ctrl+f向前滚动一屏,ctrl+b向后移动一屏,即内容分别forward和backward
zz将光标所在行放在屏幕中间。
zt将光标所在行放在屏幕的top。
zb将光标所在行放在屏幕的bottom。

简单查找

/string然后按下查找string,之后按下n向下一个查找移动,N向上一个查找移动,?/作用一样只是反向查找,此时n的方向也是反的。
特殊字符的查找需要转义,包括.*[]^%/\?~$

使用set ignorecase忽略查找的大小写,要恢复设置为noignorecase即可。


命令历史记录,按下/后使用箭头上下即可得到查找历史,也可以先输入一个prefix后在使用箭头来补全。:的历史记录同理


使用*代替string过长的情况,此时会使用当前光标下的关键字作为string执行查找(关键字的识别和iskeyword的内容有关),并定位到当前的下一个查找。#同理,只是查找方向相反定位到当前的上一个。


局部匹配(/执行的策略,比如/the会匹配there)与严格匹配/\表示严格查找the这个单词,\<表示只查找以the开头的,\>表示只查找the结尾的。*#本身就是查找整个单词(执行严格匹配和/不同),如果需要局部匹配可以使用g*g#(同/相同)


set hlsearchset nohlsearch可以设置搜索结果是否高亮。如果只需要关闭此次搜索的结果高亮使用:nohlsearch


set incsearch将在搜索输入时(即按下回车之前)就会高亮匹配的字符,incsearch是一个bool量,关闭为noincsearch
set nowrapscan则最后一个匹配项后无法跳转回第一个,也是一个bool量,默认开启的。

简单模式匹配查找(简单的正则表达式查找)

^表示匹配处在行首的,$表示匹配处在行尾的。如/^the$只有当该行只存在一个单词the时才会匹配。
.匹配任意单个字符。要匹配.使用转义。

这里只说了非常简单的正则表达式的规则

使用marks(标记)

在使用前面介绍的命令进行跨行跳转时,vim会记住所有的跳转的位置,这些位置就叫做mark。通过:jumps可以查看vim记录的所有跳转过的位置。

w,e,j,k,f等并不会不记录

``或者''可以在当前和上一次的mark之间跳转,跳过去跳回来,两点之间跳转。`'的区别在于,'只会将光标放在行首,前者会记录光标具体的列数。
ctrl+o则是向上一次mark跳转(o即older),ctrl+iTab等效)向下一次mark跳转,根据的就是:jumps列表。

使用命名标记,ma为光标所在行设置标记a,可用标记为a-z的26个字母。然后使用'a或者`a跳转。特别适合于需要在关联的两部分内容的时候跳转,跳转后使用``或者''即可完成两部分快速跳转。
:marks列出所有的标记。'表示上一次的跳转,[]表示最后一次修改的开始和结束位置。

Usr_04.txt 小修改

Operators and motions

即一个操作紧跟一个移动,或者说移动包含的内容作为操作的输入

即删除当前光标到将移动到的光标位置之间的文本。

dw  // 假如当前光标在单词首部则删除该单词
d3w //删除三个单词(初始在单词首)
d$  //删除当前光标到文件尾的内容

关于目的光标位置下的这个字符,是否删除和移动光标的命令有关。如w移动到下个单词首部此时就不会删除不然这个单词就不全了。e则会删除以把该单词删除干净。$也会删除。

改变文本

cd操作符类似,只是在删除之后会进入插入模式。

假设此时光标在单词首,dw删除的是该单词及近跟的空格(w毕竟是到下个单词的首部),de则只删除整个单词空格保留,这些都是显而易见的。特例在于cwc其他都一样就是cw有一点不同,此时的cw表现的像ce及j即跟着的空格不会删去。这是从Vi继承下来的特性


cc类似dd但是会保留缩进


某些常用的operator-motion的形式,直接给了单独的命令如下:
x stands for dl (删除光标下的字符)
X stands for dh (删除光标左边的符)
D stands for d$ (删除到一行的末尾)
C stands for c$ (改变到一行的末尾)
s stands for cl (改变一个字符)
S stands for cc (改变整行)


r替换一个字符,按下r后,直接输入一个字符代替光标下的字符,虽然s也可以做到但r不需要进入插入模式。3rx表示将连着的三个字符都替换成x,如果x是Enter则只会有一个Enter

重复一个改变

.重复执行最近的一次改变。如要修改文中的多出four为five,可以执行如下的命令序列:

/four
cwfive
n
.
n
.

这些改变不包括在内:uctrl+r、一切使用:的命令

可见模式

v进入visual mode,此时通过移动可以高亮选中的字符。适合于operator-motion操作中不好一次性定位的motion,故可视化选中后在执行。

V进入行选择可视化模式,此时左右移动光标无效,整行整行的选择
ctrl+v进入矩形选择可视化模式
在VisualMode时,使用o切换选择哪边固定。在ctrl+v的矩形选择下o往对角跳转,O往水平跳转

移动文本

同通过dx删除的文本实际是被保存了下来,可以使用p命令粘贴,dd删除将放在下一行,其他的放在当前光标之后。P放的位置和p相反。

xp,可以交换相邻的两个字符。

复制文本

yopertor类似d一样,只不过不会有任何改变,只是将选择的文本复制,然后可以使用p粘贴。

yy复制整行,等效于Y

使用剪切板(跨程序的复制粘贴)

GUI Vim提供相应的菜单项,包括复制、剪切、粘贴等。如果使用命令则只需在yp之前添加"*即可。

文本对象(text object)

继operator-motion之后,现在可以使用operator-text object了。比如aw表示a word,is表示inner sentence(不删除句尾空格),as表示a sentence。
比如此时光标在单词的中间,就可以使用daw直接删除该单词。
text-object也可以使用在Visual mode中。

替换模式

R进入替换模。使用 key可以在插入模式和替换模式之间替换。

(usr_04)总结

可以使用各种operator和movement组合。
但这里有一些命令只能单独使用:
~改变当前字符的大小写,也可在Visual mode下改变选中的所有的大小写。
I移动到非空行首,然后进入插入模式。
A移动到行尾,然后进入插入模式。

Usr_05.txt 设置你的配置

vimrc文件

对于常用的设置可以写下来保存在vimrc文件中,vim在启动时将会执行vimrc中命令以应用设置。所有的在:之后的命令都可以写在vimrc中。

如果vimrc已存在,可以执行:edit $MYVIMRC直接编辑
该章节中只包含基础的项,更详细的vim脚本信息在usr_41.txt中

vim初始化过程内容较多,具体参考starting.txt文档,这里给出vimrc相关的加载说明。
-u filename指定文件作为vimrc,但会导致跳过某些初始化,并且不会初始化$MYVIMRC
system-vimrc若存在则总是被读取用于初始化,一般在$VIM/vimrc(该文件不一定存在)。具体路径也显示在:version命令的输出中。即使读取了system-vimrc也会读取用户vimrc。
对于用户自定义的vimrc,vim会自动搜索以下的路径,选择第一次找到的加载。(除此之外还有可能从环境变量加载,具体参考文档)

"$HOME/.vimrc"	   (for Unix) (*)
"$HOME/.vim/vimrc"	   (for Unix) (*)
"$HOME/_vimrc"	   (for Win32) (*)
"$HOME/vimfiles/vimrc" (for Win32) (*)
"$VIM/_vimrc"	   (for Win32) (*)

Note: For Unix and Amiga, when ".vimrc" does not exist,
"_vimrc" is also tried, in case an MS-DOS compatible file
system is used.  For MS-Windows ".vimrc" is checked after
"_vimrc", in case long file names are used.
Note: For Win32, "$HOME" is checked first.  If no "_vimrc" or
".vimrc" is found there, "$VIM" is tried.  See |$VIM| for when
$VIM is not set.

vimrc加载总结
若存在system-vimrc一定会被加载,但其不一定存在
然后从以上说的位置查找用户自定义vimrc(这些设置可以覆盖system-vimrc)
如果没有用户自定义vimrc,加载default.vim

vimrc_example.vim解释

参考文档
突然蹦了个vim脚本出来,语法太多现在看的糊里糊涂的,留着之后看

defaults.vim解释

default_example.vim包含了大多数人都喜欢的配置,特别适合新的用户。另外当没有用户自定义的vimrc时,会被默认加载。也可以在自定义的vimrc中source $VIMRUNTIM/defaults.vim,在defaults的基础上添加自己的选项。

	// 默认文件配置可以被跳过,只需要let skip_defaults_vim=1
	//特别是在system-vimrc中(因为system-vimrc若存在是被默认加载的)
	if exists('skip_defaults_vim')
	  finish
	endif

	// 指定在插入模式下的使用backspace等命令的删除行为
	//eol表示只允许删除到断行处即最多只能删除到行首,无法删除到上一行
	//start表示只能删除到插入的位置,也就是新增的能删,插入之前的无法删
	//indent表示是否能删除自动缩进
	set backspace=indent,eol,start

	// 历史命令和搜索的条数
	set history=200
	
	// 右下角显示正在输入的命令
	set showcmd

	// 按下Tab后是否显示待补全的菜单(针对状态栏的命令即:,/等开头的命令)
	set wildmenu

	// key codes和mapping codes的等待时间
	//在ESC按下后会等待超时,在使用远程终端时可以关闭提高响应速度
	set ttimeout
	set ttimeoutlen=100

	// 如果最后一行被截断,显示@@@代替直接不显示
	set display=truncate

	// 即在搜索的输入过程中(回车之前),开始匹配
	set incsearch
	
	// 不要将0开头的数字识别为8进制
	set nrformats-=octal
	
	// 定义一个按键映射
	map Q gq

	// 语法高亮
	syntax on

	// 开启文件类型自动检测,根据扩展名或文件内容特征识别文件类型
	//比如*.c被识别为c源程序文件,#!/bin/bash被识别为shell脚本
	//文件类型会被用于语法高亮,执行特定的文件类型插件,使用不同的缩进规则等
	filetype plugin indent on

简单映射

可以将一连串的命令绑定到一个按键上,如

// 将映射为 为单词添加{}的命令
:map  i{ea}
注意:在实际输入时可以按键也可以直接输入''字符串
			对于,可以先按下再按下在map中输入,也可以直接输入字符串''

:map命令列出当前的映射(至少是在Normal mode下的)

注意如果使用映射键和vim命令冲突则不会生效
一个可用的符号是\,所以可以使用\p,\c等来做映射则不会冲突

添加包

你可能感兴趣的:(其他,#,vim,vim,linux,编辑器)