VIM常用用法进阶

    技术2022-05-11  17

    这是别人整理的笔记,我删掉了我知道的,只留下我不会的,原文请点击 链接. vi 常用用法 说明,所有命令都不包括“”,如果是“"”(半角双引号),则是一个命令字符,请注意区分。 一.移动 (1). 按字移动光标的命令 在Vi中,"字"有两种含义:一种是广义的字,它可以是两个空格之间的任何内容。 如:{int k;它只有2个字,一个是{int ,另一个是k; 另一种字是狭义上的字,在此种意义之下,英文单词、标点符号和非字母字符(如$、%、^、&、*、(、)、-、+、{、}、[、]、~、|、/、<、>、/等)均被当成是 一个字。上面那一行中就包括{、int、k、;这4个字。 Vi中使用大写命令一般就是指将字作为广义来对待,使用小写命令就是作为狭义对待。 1. w和W命令:将光标右移至下一个字的字首,它们的区别是:w命令,把光标移到下一个字(狭义)的字首,W命令,将把光标移到下一个字(广义)的字首。 2. e和E命令:如果光标起始位置处于字内(即非字尾处),则该命令将把光标移到本字字尾;如果光标起始位置处于字尾,则该命令将把光标移动到下一个字的字尾。 3. b和B命令:如果光标处于所在字内(即非字首),则该命令将把光标移至本字字首;如果光标处于所在字字首,则该命令将把光标移到上一个字的字首。 (2). 按句移动光标的命令 在Vi中,句子被定义为以逗号(,)、句号(.)、问号(?)和感叹号(!)结尾,且其后面跟着至少两个以上(含两个)空格(外国人使用打字机留下的习惯)或一个换行符的字符序列。这个定义和习惯的用法有很大出入,注意使用。 1.( 命令:将光标移至上一个句子的开头; 2. )命令:将光标移至下一个句子的开头。 (3). 按段移动光标的命令 在Vi中,一个段被定义为是以一个空白行开始和结束的片段。 1. { 命令:将光标向前移至上一个段的开头; 2. } 命令:将光标向后移至下一个段的开头。 (4). 滚屏命令 CTRL+U 将屏幕向前(文件头方向)翻滚半屏;提示:u表示 up; CTRL+D 将屏幕向后(文件尾方向)翻滚半屏。提示:d表示 down; 可以在这两个命令之前加上一个数字n,则屏幕向前或向后翻滚n行。并且这个值被系统记住,以后再用CTRL+U 和CTRL+D 命令滚屏时,还滚相应的行数。 CTRL+F 将屏幕向文件尾方向翻滚一整屏(即一页);提示:f表示 forward; CTRL+B 将屏幕向文件首方向翻滚一整屏(即一页)。提示:b表示 backward; 同样也可以在这两个命令之前加上一个数字n,则屏幕向前或向后移动n页; CTRL+E 将屏幕向上滚动一行; CTRL+Y 将屏幕向下滚动一行。 (6). 移动到行首或行尾 “0”命令则移到一行的第一个位置, <home>键也可以完成相同的功能。 “$”命令接受个数前缀。1$表示:移动到当前行的行尾;2$表示:移动到下一行的行尾;如此类推。 "0”和“^”不接受个数前缀。 (7). 移动到一个特定的字符 “Fx”命令用于向左查找,“fx”命令的反向版本。 “tx”命令把光标移动到目标字符的前一个字符上。提示:“t”表示“To”。 “Tx”"tx"命令的反向版本,移动到字符的后面。 可以在这四个命令前面加数字前缀。 "fF"命令可以通过“;”命令重复,“,”命令则用于反向重复。用于“tT"命令会出现正确而愚蠢的问题。 (8). 括号匹配 当光标不在一个有用的字符上,“%”会先向前找到一个,然后会移动到它的匹配处。 (9). 移动到特定的行 “gg”命令把光标移动到文首; “nG”命令把光标移动到第n行的第一个空白字符上,可用“:set number<enter>”来显示行号,用“:set nonumber<enter>”来关闭显示; “n%" 命令以百分数来移动光标; “H” 命令把光标移动到屏幕的第一行; “M” 命令把光标移动到屏幕的中间行; “L” 命令把光标移动到屏幕的最后一行; 提示:“H”表示“Home”,“M”表示“Middle”而“L”表示“Last”。 (10). 使用记号(mark) 当用“G”命令跳到另一个地方,Vim会记住你从什么地方跳过去的,这个位置成为一个记号(mark)。可以成为记号的还有查找命令:“/”和“?”,而"ftwehjkl"命令不是。 要回到原来的地方,使用如下命令: `` (两个反引号,<tab>的上方); 如果再次执行这个命令你会跳回去原来的地方; CTRL-O命令跳到一个“较老”的地方(提示:O表示older); CTRL-I命令跳到一个“较新”的地方(提示:I在键盘上仅靠着O); “mx”命令可以标记当前的光标位置,x可以是任意一个小写字母(a-z); “`x”命令跳到你定义的标记处,x是你用mx命令定义的标记; “'x”(单引号加上一个标记)跳到标记所在行的行首,注意和上一个命令区别开。 二.复制,删除,移动 (1). 删除功能 “D” --删除到行尾,即“d$”; “X” --删除光标左边的字符,即“dh”; “dw” --从当前位置删除到下一个单词开头; “daw”--删除光标上的单词(包括空白字符); (2). 修改文本 “c”命令表示修改,即change。它的作用与“d”操作符相似,只是完成后会切换到插入模式; “cw”--修改一个单词; “C” --修改到行尾,即“c$”; “s” --修改一个字符,即“cl”; “S” --修改一整行,即“cc”; (3). 重复一个修改 “.”是Vim中一个非常简单而有用的命令。 它重复最后一个除“u”(undo),CTRL-R(redo)和冒号命令外的修改操作。 (4). 可视模式 用“CTRL+V”命令处理一个矩形块内的文本。在使用块可视模式的时候,会有四个角,“o”命令把光标移动到对角上;而“O”则能移到同一侧的角上。 技巧:“~”来改变选中文本的大小写; “u”全部变为小写; “U”全部变为大写。 “J”合并选中的行。 (5). 复制文本 “Y” --也时复制一整行; “yw” --复制一个词。这几个都可以加上数字前缀; 技巧:用可视模式来选择文本,简单直观。 提示:“y”“p”可以是不同文件。 使用寄存器复制文件 寄存器是Vim用来保存文本的地方。用一个小写字母表示来表示寄存器。 比如:“"fyas”,复制一个句子到寄存器f 中。 “"fp”,使用寄存器f。 三.编辑多个文件 (1). 编辑另一个文件 “:edit xxx” :关闭当前文件,打开另一个; “:edit! xxx” :不保存当前文件,打开另一个; “:hide edit xxx”:编辑另一个文件,但是不马上保存当前文件,只是隐藏它; (2). 同时打开多个文件 “vi xxx1 xxx2 xxx3”,打开三个文件; “:next”“:next!”“:wnext”,编辑下一个文件; “:previous”“:previous!”“:wprevious”,编辑前一个文件; 提示:可以加数字前缀。 (3). 在文件中快速跳转 <ctrl+^>(在英美式键盘中,^ 在6的上面):跳到上一个的文件,再用这个命令就会跳回来; “`"”:跳转到上次离开这个文件时的位置; “`.”:跳转到最后一次修改文件的位置; 使用文件标记:“mX”和“`X”命令,以及用CTRL+I 和 CTRL+O 来跳转; 注意:这里的 X 必须是大写字母,表示全局。 四.分割窗口 1. 分割窗口 水平分割 垂直分割 :split :vsplit :split xxx :vsplit xxx :new :vnew 2. 关闭窗口 方法1,“:quit”和ZZ; 方法2,“:close”命令,它可以避免剩下最后一个时退出vim; 方法3,“:only”命令,关闭其他所有窗口; 3. 改变窗口大小 要扩大窗口:“<ctrl+w> +”; 要缩小窗口:“<ctrl+w> -”; 4. 窗口之间跳转 CTRL-W w 用于在窗口间跳动 CTRL-W h 跳转到左边的窗口 CTRL-W j 跳转到下面的窗口 CTRL-W k 跳转到上面的窗口 CTRL-W l 跳转到右边的窗口 5. 用 vimdiff 显示区别 方法1:从shell启动,比如:vimdiff main.c~ main.c 方法2: 从vi中启动diff模式:“:vertical diffsplit xxx”,如果没用“vertical”,就会水平分割屏幕。 方法3: 如果有patch或者diff文件:先编辑这个文件,然后告诉 Vim patch 文件的名称。例如: :edit main.c :vertical diffpatch main.c diff 四.作大修改 介绍如何做要重复多次的修改和如何改动大量的文字 1. 记录与回放命令 方法1.使用“.”命令重复前一个修改操作,但它不能完成复杂功能; 方法2.使用记录命令,步骤如下: a. “q{register}”命令启动一次击键记录,结果保存到{register}指定的寄存器中。寄存器名可以在a到z中任取一个字母表示。 b. 输入你的命令; c. 键入“q”(后面不用跟任何字符)命令结束记录; d. 用“@{register}”命令执行这个宏; 提示:“@@”命令,重复执行上一次的宏。 2. 使用,修改寄存器 用来记录操作的寄存器与你用来拷贝文本的寄存器是相同的。 使用方法: G 移到行尾(注:这里其实使用new命令开窗口更方便些) o<esc> 建立一个空行 "np 拷贝n寄存器中的文本,你的命令将被拷到整个文件的结尾 {edits} 象修改普通文本一样修改这些命令 0 回到行首 "ny$ 把正确的命令拷贝回n寄存器 dd 删除临时行 3. 扩展一个寄存器 记录到一个大写寄存器表示扩展命令到对应的小写寄存器。 替换 “:substitute”命令(可以简写为“:s”)使你可以在连续的行中执行字符串替换。 格式:“:[range]s/old/new/[flags]” 说明如下: 1.用“n,m”表示从第n行到第m行;如果不指定行范围,“:s”命令只作用在当前行上。 2.“.”表示当前行,“$”表示最后一行;“%”表示命令作用于全部行,即“1,$”。 3.可以用“+ -”号,比如“n+x,m-y”,nm可以是“.”和“$”。 4.使用可视模式来设定范围;注意:命令是作用于行范围的,而不是选中的范围的。 5.默认情况下,命令只对一行中的第一个匹配点起作用,要让对行中所有匹配点起作用,需要加一个“g(global,全局)”标记; 其他标记:“p”(print,打印),用于在命令执行的时候打印出所有被修改的行; “c”(confirm,确认),在每次替换前向你询问是否需要替换。 4.插入文件 “:read {filename}”命令读入文件,插入当前行的下面; “:nread {filename}”命令用“n”指点插入行的行号,其中数字“0”表示文件开头,“$”表示文件尾; 5.保存部分行 要把一部分行写入到文件,可以使用“:write”命令; 在没有指定范围的时候它写入全文,而指定范围的时候它只写入范围指定的行; 如果这个文件已经存在,而你一定要写入,就加一个叹号; 小心:“!”必须紧跟着“:write”,中间不能留有空格,否则这将变成一个过滤器命令; “:write >>{filename}”用于往文件中追加内容; 6.使用外部程序 命令“{motion}{program}”用一个外部程序对一个文本块进行过滤。 换句话说,它执行一个由{program}指定的外部命令,并用一个文本块作为输入, 然后用该程序的输出代替选中的文本块。 7.从崩溃中恢复 方法1. 知道文件名,可以用“-r”选项启动Vim:“vim -r xxx”; 方法2. 不知道文件名,进入原来的文件夹执行:“vim -r ""”; 方法3. 用“vim -r”列出所有它能找到的交换文件,然后用方法1; 8.折叠 折叠命令: zf F-old creation (创建折叠) zo O-pen a fold (打开折叠) zc C-lose a fold (关闭折叠) zr 打开嵌套折叠(“zR”用于全部打开) zm 关闭嵌套折叠(“zM”用于全部关闭) 9.在代码间移动 使用标记 1:创建标记文件:“ctags {filename}”,或者“ctags -R”; 2:把光标移到要查看的单词的标记处,然后用<ctrl+]>命令; 3:用<ctrl+t>返回; 技巧:“CTRL-W ]”用新开窗口查看; 10.在代码间移动 “[]” 向上跳转到一个函数的结尾,“][”向下移动到一个函数的结尾; “[[” 向上跳转到函数的开始,“]]”向下跳到结尾处; 注意:这四个命令要求“{”“}”符号在第一列; “[{” 跳转到当前代码块{}的开始处,“[}”跳转到当前代码块{}的结尾处; “]{”“]}”“[(”“[)”“](”“])”“[/”“]/”也有类似功能,只是匹配的是“()”“/*” “[I” 命令查找光标下的标识符,不仅在当前文件内查找,还会在所有的包含文件中查找; “[<tab>” 跳到第一项,<tab> 可以是<ctrl+i>; “n[<tab>” 跳到第n项; “]I” 只列出光标下面的项目 “[D” 只查找 "#define" 定义的宏, “]D” 只列出光标下面的项目 “gD” 只在当前文件中查找,并跳转到被首次使用的地方; “gd” 只在当前函数内查找,注意,函数的开始符号“{”要求在第一列;

    最新回复(0)