【转载】vi/vim使用进阶: 指随意动,移动如飞 (二)

本节所用命令的帮助入口:

:help usr_03.txt
:help motion.txt
:help usr_29.txt
:help scroll.txt
:help folding 

上一篇文章中我们介绍了一些常用的移动命令,本篇将继续介绍更多的命令,使你在文档中自由穿梭。

[ 利用跳转表 ]

在vim中,很多命令可以引起跳转,vim会记住把跳转前光标的位置记录到跳转表中,并提供了一些命令来根据跳转表进行跳转。要知道哪些命令引起跳转,参见”:help jump-motions“。

使用命令””“(两个单引号)和”““(两个反引号,在键盘上和”~”共用一个键)可以返回到最后跳转的位置。例如,当前光标位于文件中第1234行,然后我使用”4321G“命令跳转到第4321行;这时如果我按””“或”““,就会跳回到1234行。

因为这两个命令也属于跳转命令,所以第4321行也被记入跳转表,如果你再次使用这两个命令,就会发现自己又跳回第4321行了。

这两个命令有一点不同,”““在跳转时会精确到列,而””“不会回到跳转时光标所在的那一列,而是把光标放在第一个非空白字符上。

如果想回到更老的跳转位置,使用命令”CTRL-O“;与它相对应的,是”CTRL-I“,它跳转到更新的跳转位置(:help CTRL-O和:help CTRL-I)。这两个命令前面可以加数字来表示倍数。

使用命令”:jumps“可以查看跳转表(:help :jumps)。

[ 使用标记 ]

标记(mark)是vim提供的精确定位技术,其功能相当于GPS技术,只要你知道标记的名字,就可以使用命令直接跳转到该标记所在的位置。

vim中的标记都有一个名字,这个名字用单一的字符表示。大写和小写字母(A-Za-z)都可以做为标记的名字,这些标志的位置可以由用户来设置;而数字标记0-9,以及一些标点符号标记,用户不能进行设置,由vim来自动设置。

我们主要讲述字母标记的使用,对于数字标记和标点符号标记,请自行参阅帮助手册(:help mark-motions)。

小写字母标记局限于缓冲区,也就是说,每个缓冲区都可以定义自己的小写字母标记,各缓冲区间的小写字母标记彼此不干扰。如果我在文件A中设置一个标记t,然后在文件B中也可以设置一个标记t。那么在文件A中,可以用”‘t“命令跳到文件A的标记t位置 ;在文件B中,可以用”‘t“命令跳到文件B的标记t位置。如果文件在缓冲区列表中被删除,小写字母标记就丢失了。

大写字母标记是全局的,它在文件间都有效。如果在文件A中定义一个标记T,那么当使用命令”‘T“时,就会跳到文件A的标记T位置,不管你当前处于哪个文件中。

设定一个标记很简单,使用命令”m{a-zA-Z}“就可以了。例如,命令”mt“在把当前光标位置设定为标记t;命令”mT“把当前光标位置设定为标记T。(:help m)

要跳转到指定的标记,使用命令”‘{a-zA-Z}“或”{a-zA-Z}“。例如,命令”‘t“会跳转到标记t;命令”‘T“会跳转到标记T。( :help ‘)

单引号和反引号的区别和上面所讲的一样,”`“在跳转时会精确到列,而”‘“不会回到跳转时光标所在的那一列,而是把光标放在第一个非空白字符上。

标记也可以被删除,使用命令”:delmarks“可以删除指定标记。命令”:marks“列出所有的标记。

关于标记,有两个非常有用的插件,一个是ShowMarks,另外一个叫marks browser。

ShowMarks是我最常用的插件之一,它使用vim提供的sign功能以及高亮功能显示出标记的位置。这样,你在设定了一个标记后,它就会在你的vim窗口中显示出标记的名字,并高亮这一行。

在你的$HOME/.vim目录把它解压,然后进行简单设置。 在我的vimrc中,对ShowMarks进行了如下配置:

""""""""""""""""""""""""""""""
" showmarks setting
""""""""""""""""""""""""""""""
" Enable ShowMarks
let showmarks_enable = 1
" Show which marks
let showmarks_include = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
" Ignore help, quickfix, non-modifiable buffers
let showmarks_ignore_type = "hqm"
" Hilight lower & upper marks
let showmarks_hlline_lower = 1
let showmarks_hlline_upper = 1 

首先,使能showmarks插件,然后定义showmarks只显示全部的大写标记和小写,并高亮这两种标记;对文件类型为help、quickfix和不可修改的缓冲区,则不显示标记的位置。

你可以定义自己的颜色来高亮标记所在的行,下面是我的定义,我把它放在我自己的colorscheme文件中:

" For showmarks plugin
hi ShowMarksHLl ctermbg=Yellow   ctermfg=Black  guibg=#FFDB72    guifg=Black
hi ShowMarksHLu ctermbg=Magenta  ctermfg=Black  guibg=#FFB3FF    guifg=Black 

ShowMarks插件中已经定义了一些快捷键:

<Leader>mt   - 打开/关闭ShowMarks插件
<Leader>mo   - 强制打开ShowMarks插件
<Leader>mh   - 清除当前行的标记
<Leader>ma   - 清除当前缓冲区中所有的标记
<Leader>mm   - 在当前行打一个标记,使用下一个可用的标记名 

我最常使用的是”<Leader>mm“和”<Leader>mh“,用起来非常方便。在我的vimrc中,把Leader定义为”,,所以每次都使用”,mm“和”,mh“来设置和删除mark。

在vim 7.0中,如果大写的标记被定义了,那么函数line()无论在哪个缓冲区里都会返回该标记的行号,导致showmarks在每个缓冲区里都会把这个大写标记显示出来。因此我为这个插件打了个补丁来修正此问题。

vim 7.0中也可以真正的删除一个mark标记,所以也改了showmarks插件的删除标记功能。原来的功能在删除标记时,并未真正删除它,只是把这个标记指向缓冲区的第一行;现在则是真正删除此标记。

如果想使用我为showmarks打的补丁,请点击这里下载showmarks补丁

用法:

  1. 保存该patch到某一目录,例如:/tmp/showmarks.vim.patch
  2. cd到你的.vim目录:cd ~/.vim
  3. 运行命令:cat /tmp/showmarks.vim.patch | patch -p0

Marks Browser插件可以显示出当前缓冲区中定义的小写标记的位置,在你无法对应上标记的名字和其位置时,非常有用。

下载后把它放到你的$HOME/.vim/plugin目录即可,我为其定义了一个快捷键:

""""""""""""""""""""""""""""""
" markbrowser setting
""""""""""""""""""""""""""""""
nmap <silent> <leader>mk :MarksBrowser<cr> 

这样,直接使用”,mk“就可以打开Mark Browser窗口了。

下图显示这两个插件工作时的效果。我在文件中定义了三个标记,一个大写标记A,两个小写标记a和t。最上面的窗口是Mark Browser窗口,主编辑窗口中的高亮行及sign标记是ShowMarks插件放置的。

点击查看大图

[ 折行 ]

在文件比较大时,在文件中移动也许会比较费力。这个时候,你可以根据自己的需要把暂时不会访问的文本折叠起来,既减少了对空间的占用,移动速度也会快很多。

vim提供了多种方法来进行折叠,既可以手动折叠,也可以根据缩进、语法,或使用表达式来进行折叠。

程序文件一般都具有良好的结构,所以根据语法进行折叠是一个不错的选择。

要启用折叠,首先要使能’foldenable‘选项,这个选项是局部于窗口的选项,因此可以为每个窗口定义不同的折叠。

接下来,设置’foldmethod‘选项,对于程序,我们可以选择根据语法高亮进行折叠。需注意的,要根据语法高亮进行折叠,必须打开文件类型检测和语法高亮功能,请参见我前面的文章。

下面是我的vimrc中的设置,它使用了自动命令,如果发现文件类型为c或cpp,就启用折叠功能,并按语法进行折叠:

autocmd FileType c,cpp  setl fdm=syntax | setl fen 

注意,vim的很多命令、选项名都有简写形式,在帮助手册中可以看到简写形式,也可以按简写形式来help,例如,要查看’foldmethod‘选项的帮助,可以只输入”:help ‘fdm’“。

折叠后的效果见下图:

点击查看大图

图中以黑色背景显示的行就是被折叠起来的行,vim会显示这个fold中被折叠了多少行,以及起始行的内容。留意一下左下方的”__Tag_List__”窗口,在这个窗口中也存在着折叠,我把macro, typedef, variable几项折叠起来了,而把function的折叠打开。从该窗口最左边的折叠栏(:help fold-foldcolumn)也可以看出不同:被折叠的文本前显示了”+“,打开的折叠前显示的是”|“。

折叠的背景色及显示文字等都可以修改,参阅帮助手册(:help folding)。

下面的命令用来打开和关闭折叠:

    zo – 打开光标下的折叠
    zO – 循环打开光标下的折叠,也就是说,如果存在多级折叠,每一级都会被打开
    zc – 关闭光标下的折叠
    zC – 循环关闭光标下的折叠 

更多的命令,请参阅手册(:help folding)。

vim提供了一些命令在折叠间快速移动:

    [z – 到当前打开折叠的开始
    ]z – 到当前打开折叠的结束
    zj – 向下移动到下一个折叠的开始处
    zk – 向上移动到上一个折叠的结束处 

我通常不喜欢把文本折叠起来,因为我更喜欢一目了然的看到全部文本。你可以根据自己的喜好来决定是否启用折叠。

多说一点,手动创建的折叠是可以保存在session文件中的,这样下次进入vim时可以载入之前创建的折叠,参见:help ‘sessionoptions’。

[ 在程序中移动 ]

vim的作者是一个程序员,这就不难理解为什么vim提供了众多在程序中移动的命令。这里面既包括我们前面的文章中介绍过的利用tag文件cscope在标签间跳转,也包括众多在函数、注释、预处理指令、程序段,及其它程序元素中移动的命令。

本文不再详细介绍这些命令,作为程序员,一定要熟读usr_29.txt!这些命令,可以帮助你在程序中得心应手的移动。

在这里介绍两个插件,增强了在程序中移动的功能,一个是a.vim,另外一个是matchit。

a.vim的功能非常简单,它帮助你在源文件和头文件间进行切换,这个简单的功能,却非常实用,至少它为我节省了很多时间。

下载a.vim后,把它放到你的.vim/plugin目录就可以了。

假设你正在浏览C语言的源文件,这时想修改它对应的头文件,只需要输入”:A“命令,就切换到头文件了(需要源文件和头文件在同一目录中)。a.vim插件还定义了其它一些命令和快捷键,参见它的帮助手册。

在vim中,”%“命令跳转到与当前项目相匹配的项目。例如,当光标位置在”{“时,按下%,光标就跳转到对应的”}“( :help %)。

但vim提供的%命令,只能在括号,或者C注释的开始和结束( /* */),或者C编译预处理指令间进行跳转。对于其它程序结构,例如HTML,%命令不能从<html>标记,跳转到对应的</html>标记。

Matchit插件则扩展了%命令的功能,使%命令可以对其它程序语言的开始和结束标记间进行跳转。

下载后,把这个插件放到你的.vim/plugin目录,你就可以用%在各种开始/结束标记间跳转了,目前,它可以支持Ada, ASP with VBS, Csh, DTD, Essbase, Fortran, HTML, JSP (same as HTML), LaTeX, Lua, Pascal, SGML, Shell, Tcsh, Vim, XML等语言。

[ 插入模式下的移动 ]

上面介绍的移动命令,都是在normal模式下使用的,如果想在insert模式下移动,阅读:help ins-special-special。

你真的需要在插入模式下移动吗?我几乎不会!通常我会先按ESC返回Normal模式,然后再移动,当你习惯了以后,你会发现效率会更高。

[ 小结 ]

你会发现,本文的内容,和usr_03.txt帮助文档很相似。是的,只要你学会了usr_03.txt中列出的命令,你就掌握了最常用最实用的vim移动命令(:help usr_03.txt)。

如果你想了解更多的移动命令,请通篇阅读motion.txt,记住你最有可能用到的那些键。当你的手指能够不假思索的使用这些命令后,你在vim中就能做到指随意动、移动如飞了。

[参考文档]

<< 返回vim使用进阶: 目录

原创文章,请阅读页脚的许可方式,转载请注明:转载自易水博客 [ http://easwy.com/blog/ ]

本文链接地址: http://easwy.com/blog/archives/advanced-vim-skills-advanced-move-method/

文章的脚注信息由WordPress的wp-posturl插件自动生成

相关文章

时间: 2024-10-27 18:51:13

【转载】vi/vim使用进阶: 指随意动,移动如飞 (二)的相关文章

【转载】vi/vim使用进阶: 指随意动,移动如飞 (一)

vi/vim使用进阶: 指随意动,移动如飞 (一) << 返回vim使用进阶: 目录 本节所用命令的帮助入口: :help usr_03.txt :help motion.txt :help usr_29.txt :help scroll.txt vim提供的移动方式多如牛毛,但我们并不需要掌握全部这些命令,只需要掌握最适合自己的那些命令.因为我们最终的目的,并不是成为一个vim高手,而是更高效的编辑文本. 我们下面介绍的命令,如果没有特别说明,都是在Normal模式下使用的命令. 这些命令的

vi/vim使用进阶: 在VIM中使用GDB调试 – 使用vimgdb

vi/vim使用进阶: 在VIM中使用GDB调试 – 使用vimgdb << 返回vim使用进阶: 目录 本节所用命令的帮助入口: :help vimgdb 在UNIX系统最初设计时,有一个非常重要的思想:每个程序只实现单一的功能,通过管道等方式把多个程序连接起来,使之协同工作,以完成更强大的功能.程序只实现单一功能,一方面降低了程序的复杂性,另一方面,也让它专注于这一功能,把这个功能做到最好.就好像搭积木一样,每个积木只提供简单的功能,但不同的积木垒在一起,就能搭出大厦.汽车等等复杂的东西.

Linux vi/vim(转载)

Linux vi/vim 所有的 Unix Like 系统都会内建 vi 文书编辑器,其他的文书编辑器则不一定会存在. 但是目前我们使用比较多的是 vim 编辑器. vim 具有程序编辑的能力,可以主动的以字体颜色辨别语法的正确性,方便程序设计. 相关文章:史上最全Vim快捷键键位图 — 入门到进阶 什么是 vim? Vim是从 vi 发展出来的一个文本编辑器.代码补完.编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用. 简单的来说, vi 是老式的字处理器,不过功能已经很齐全了,但

【转载】-- vi/vim使用

vi/vim 基本使用方法本文介绍了vi (vim)的基本使用方法,但对于普通用户来说基本上够了!i/vim的区别简单点来说,它们都是多模式编辑器,不同的是vim 是vi的升级版本,它不仅兼容vi的所有指令,而且还有一些新的特性在里面.例如语法加亮,可视化操作不仅可以在终端运行,也可以运行于x window. mac os. windows. vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令.由于对Unix

[Linux/Ubuntu] vi/vim 使用方法讲解(转载)

转自:http://www.cnblogs.com/emanlee/archive/2011/11/10/2243930.html vi/vim 基本使用方法 vi编辑器是所有Unix及Linux系统下标准 的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令.由于对Unix及Linux系统的任何版本,vi编辑 器是完全相同的,因此您可以在其他任何介绍vi的地方进一步了解它.Vi也是Linux中最基本的文本编辑器,学会它后,您将在Linux的世界里畅行无

Unix Linux vi vim 使用手册|vi vim 常用命令 详解

Unix Linux vi vim 使用手册 Vi 简介 Vi 是 Unix 世界里极为普遍的全萤幕文书编辑器,几乎可以说任何一台 Unix 机器都 会提供这套软体.Linux 当然也有,它的 vi 其实是 elvis(版权问题),不过它们都 差不多.熟悉 DOS 下的文书处理後,也许会感到 vi 并不好用:Unix 上也已经发展出 许多更新.更好用的文书编辑器,但是并不一定每一台 Unix 机器上都会安装这些额外 的软体.所以,学习 vi 的基本操作还是有好处,让你在各个不同的机器上得心应手.

windows下gVim(Vi/vim)基本使用

Vim 是一个Linux 平台上功能非常强大的编辑器,他是早年的Vi 编辑器的加强版.这个gVim 是windows 版的,并且有了标准的windows 风格的图形界面,所以叫g(graphical)Vim.我们可以将gvim 理解为vim(vi的加强版)图形化版本,其指令和用法都完全相同,所以可以參考vim的指令.这是一个国际版本,会根据安装的平台自动选择相应语言包, 支持中文及其各种编码,连界面也是中文的,请放心使用.这个极具Unix特色和风格(simple is the best)的编辑器

Vi/Vim查找替换使用方法

vi/vim 中可以使用 :s 命令来替换字符串.该命令有很多种不同细节使用方法,可以实现复杂的功能,记录几种在此,方便以后查询.    :s/vivian/sky/ 替换当前行第一个 vivian 为 sky    :s/vivian/sky/g 替换当前行所有 vivian 为 sky    :n,$s/vivian/sky/ 替换第 n 行开始到最后一行中每一行的第一个 vivian 为 sky    :n,$s/vivian/sky/g 替换第 n 行开始到最后一行中每一行所有 vivi

Vi/Vim的快捷方式

1 vi/ vim键盘图 2 文字解说 进入编辑模式的6种方式: i在光标前插入 I在行首插入 a在光标后插入 A在行末插入 o在下一行插入 O在上一行插入 删除字符 x 删除当前字符 X 删除前一个字符 行操作 dd 删除当前行 5dd从当前行开始算,删除5行 yy 拷贝当前行 8yy 拷贝当前开始的8行 p粘贴paste linux中 you have newmail in /var/spool/mail/root是什么意思 一般这种情况mail的内容就只是一些正常的系统信息或者是比较重要的