【转】高效使用vim

2023-05-16

出处:http://www.cnblogs.com/hyddd/archive/2010/04/08/1706863.html


英文出处:jmcpherson.org/editing.html

翻译引用: tingsaode.spaces.live.com/blog/cns!FE95D0EE01558610!780.entry
原文地址: http://hi.baidu.com/gone1210/blog/item/41c0e60b000230c33ac76328.html

之于我, vi即禅.
用vi如修禅,
vi命令如禅之心印.
用者不可窥其堂奥,
门外汉视其晦涩如天书.
常用之, 实可知其道.

高效移动
珍爱生命, 远离插入模式

      一般情况下, 你应该尽量少把时间花在插入模式, 因为在这种模式下vi和其它sb编辑器区别不大. 这也是大部分vim新手把大部分时间花在插入模式的原因 -- 插入模式很易用. 但是vim真正的优势在命令模式. 你会发现越了解vim, 你花在插入模式的时间越少.

使用h,j,k, l

      高效率用vim编辑的第一步是绝了你用方向键(上下左右)的念头. vim设计出"模式"操作方式的一大优势就是可以让你不需要老是把手从方向键和字母键之间移来移去. 当你在命令模式下, 用字母h, j, k, l对应方向左, 下, 上, 右. 这个需要练习一下才能习惯, 但是你会发现一旦你习惯了它们, 比用方向键快多了. (译注: 这几个移动键一定要动手试, 然后反复用, 靠记忆忒艰难了)

     在你编辑电子邮件或其他段落式文本的时候, 你可能注意到移动方向跳的行数比你料想的多. 这是因为你的段落对vim来说在很长的同一个行里. 用h, j, k, l移动前输入g可以让移动相对于屏幕看上去的行数而不是vim内部的行数.

用motion在当前行移动 

(译注: 没想到特别合适的词翻译motion, 可以理解为"高级移动", 另请注意, motion仅在当前行移动)

    大部分编辑器只有简单的光标移动功能(上下左右, 行首行尾等等). vim有非常高级的光标移动命令, 这些命令叫做Motion. 当用motion把光标从文本中的一个点移动到另一个点的时候, 两点间的文本(包括两个点本身)被motion"掠过". (这个概念在接下来的教程中非常重要.) (译注: 举例说明一下"掠过"概念, 比如你有一行文本, 内容是abcdefg, 当前光标在c上, 如果你用motion $, 光标移动到了g上, 那么从c到g这段文本就被motion $"掠过"了).

下是一些有用的motion:

fx

在当前行向前移动光标到下一个字符x (很明显, x可以是任意你想要移动到的字符). 这是一个超级有用的命令. 你可以输入;来重复前一个f命令.

tx

和上面的命令基本相同, 除了移动光标到字符x之前而不是x字符本身. (这个真的很有用)

Fx

在当前行向后移动光标到上一个字符x.

w

将光标向前移动一个词.

b

将光标向后移动一个词.

0

将光标移动到当前行首.

^

将光标移动到当前行的第一个字符. (译注: 第一个字符可能不是行首, 比如行首有space, tab等不可见符号, 0会把光标停在这些符号之前, 而^会把光jk标停在这些符号之后的第一个可见字符.)

$

将光标移动到当前行尾.

)

将光标移动到下一个句子. (写电子邮件或者文本文档的时候很有用.)

(

将光标移动到上一个句子.

在文件中高效移动

      vim有很多命令可以让你在文件中任意移动光标 -- 很少需要手工一页一页滚动. 以下按键技术上说不算motion, 因为它们是在文件中移动, 而不是在某一特定的行.

<C-F> 将光标向前(下)移动一页(屏幕).
<C-B> 将光标向后(上)移动一页.
G 移动到文件尾
numG 将光标移动到某一行. (例如, 10G是把光标移动到第10行.)
gg 将光标移动到文件开头
H 将光标移动到当前页的第一行.
M 将光标移动到当前页的中间一行.
L 将光标移动到当前页的最后一行. (译注: 有了HML3个命令, 可以把鼠标撇了, 爽)
* 读取光标下的字串, 然后移动到当前文件中下一次出现该字串的位置. (比如说如果你的光标所在的位置的字串为"bob,", 按了*之后, 光标将移动文件中下一个"bob"出现的位置.)
# 和*命令基本相同, 除了它移动到上一次出现字串的位置.
/text    从当前光标位置开始, 查找下一个含有text的字串并且移动到那里. 需要按回车(Enter)键来执行查找. 如果要重复执行查找, 输入n(n代表next occurance). (译注: text指你想搜索的字串, 比如你要在文件查找字串"abc", 就输入/abc然后回车)
?text    和/text相似, 区别是?text进行反向查找(查找上一个字串).
ma 给当前光标所在位置设置一个名字为a的书签. 书签的名字可以是任何小写字母. 你看不到书签, 但它确实在.
`a 移动光标到书签a. 注意`不是单引号, 大部分键盘上它在数字1的左面. (译注: 本人使用的vim 7.1 windows版本用单引号也能完成同样功能)
`. 移动到你之前编辑过的行. 这个又是"真有用". 如果你需要在文件中"滚来滚去"查看一些东西, 你可以用这个命令回到你之前编辑的行尽管你没把它设成书签.

高效输入
使用关键字自动完成(补全)

     vim 有个非常好的关键字自动完成系统. 就是说你可以只输入很长的词的一部分, 按一个键, vim帮你把这个词自动补全. 比如说在你的代码中有一个变量叫iAmALongAndAwkwardVarName, 你可能不愿意每次用这个变量都把整个词打一遍, 这时候就可以用自动完成功能.

       要使用关键字自动完成, 只要输入一个字串的前几个字母 (比如 iAmAL) 然后按 <C-N> (按住Ctrl然后按N>)或者<C-P>. 如果vim没有选择你需要的字串, 继续按<C-N>或<C-P> -- vim会遍历所有和你输入的前几个字母匹配的字串.

用点脑子开始插入模式

     大部分新用户输入i来进入插入模式. 这种方法有时候相当低效, vi有一堆可以高效进入插入模式的命令. 这里是最常用的一些:

i 在当前字符的左侧开始插入.
I 在当前行行首开始插入.
a 在当前字符的右侧开始插入.
A 在当前行行尾开始插入.
o 在当前行的下一行开始新的一行并在那插入. (译注, 写code用这个很爽)
O 在当前行的上一行开始新的一行并在那插入.
c{motion} 删除(change)motion"掠过"的文本然后插入新文本代替它. 比如说, c$会删除当前光标位置到当前行尾的文本并开始插入模式. ct!会删除当前光标位置到下一个!出现位置(不包括!本身)之间的文本并进入插入模式. 删除的文本会被复制到剪切板可以被粘贴使用. (译注: 可以到前面复习一下"掠过"的概念, 参考例子. 输入c{motion}命令的时候, 不需要输入花括号)
d{motion}  删除motion"掠过"的文本 -- 和c{motion}相似, 但是不进入插入模式.

高效移动成块的的文本
用可视化选择, 用合适的选中模式

      和最早的vi不同, vim可以让你把文本置为高亮然后对高亮的文本操作. 以下是主要的3个可视化选中模式 (即文本高亮模式).

v 字符选中模式. 大部分人习惯用这个, 所以玩其他模式之前先把这个练熟.
V 行选中模式. 选中整行. 当你需要复制或移动几行的时候, 这个比字符选中模式要好.
<C-V> 块选中模式. 超级nb而且很少有其他的编辑器支持(译注: 还是有一些支持的, 比如ultraedit, 但是得付钱...). 你可以在任何文本中选择一个矩形块来操作. (译注: 在windows版本的vim中<C-V>默认被映射为粘贴, 可以通过更改键盘映射或者使用<C-Q>来进行块操作)

     所有常用的光标移动键都可以在可视模式使用, 比如vwww会进入字符选中模式并且选中光标之后的3个词. Vjj将会进入行选中模式并且选中当前行及之后的两行.

在可视化选中模式下进行剪切和复制

     一旦你有了高亮选择, 你可能想要干点啥. 以下是对选中的高亮文本最有用的命令:

d 剪切(删除)高亮选中的文本到剪切板. (译注: 据本人所知, vim所有的删除其实都是剪切)
y 复制 (或者说"拽"(yank), vim用"拽"来表示复制...)高亮选中的文本到剪切板.
c 剪切高亮选中的文本到剪切板. 和d很相似, 只是c会进入插入模式.

在非可视化选择模式进行剪切和复制
   如果你确知你想要复制或者剪切什么, 你可以不进入可视化选择模式就完成这些操作. 这样速度更快.

d{motion} 把由motion"掠过"的文本剪切到剪切板. 比如dw把当前光标开始的一个词剪切到剪切板, 而dfS把从当前行从光标是到下一个S之间的文本剪切到剪切板.
y{motion}  把motion"掠过"的文本复制到剪切板.
c{motion}  把motion"掠过"的文本剪切到剪切板并且进入插入模式.
dd  剪切当前行到剪切板.
yy 复制当前行到剪切板.
cc 剪切当前行到剪切板并且进入插入模式.
D 剪切光标当前位置到行尾的文本到剪切板.
Y 复制整行到剪切板, 和yy相似. (yes, 这个命令和命令D的操作方式没保持一致, 你可以用y$完成类似D的操作)
C 剪切光标当前位置到行尾的文本到剪切板并进入插入模式.
x 剪切当前字符. (类似于命令模式的退格(backspace)键)
s 剪切当前字符并进入插入模式.

粘贴
  粘贴很简单. 把光标移动到你想要粘贴的位置输入p. (译注: 粘贴操作需要在命令模式下, 另外P(大写)命令把剪切板的内容粘贴到光标当前位置之前, 对用惯其它编辑器的人来说, P命令可能更符合习惯)

 

使用多个剪切板

       大部分编辑器只有一个剪切板. (译注: 貌似不算太'大部分') vim有多个. 在vim里剪切板叫做寄存器(regiseter). 你可以输入:reg列出所有当前定义过的寄存器和它们的内容. 大多数情况下你会使用以小写字母命名寄存器, 其他的有各自不同的vim内部用途, 偶尔可能会有用.

      要使用指定的某个寄存器来完成复制和粘贴, 很简单, 在复制粘贴操作之前输入"a, a表示你希望用的寄存器.

      举个例子, 复制当前行到寄存器k, 输入"kyy. (也可以用V"ky. 想想为啥这个也成). 那一行就会被存放在寄存器k里, 直到有其他的东西被复制到到寄存器k覆盖它. 复制之后可以用"kp来把寄存器k里存放的内容粘贴到到文本中.

不干机械劳动
给你惊喜的.命令

      在vi中, 输入.(英文的句号)可以重复上一个你执行过的命令. 比如你上一个命令是dw, 当你输入.命令, vi会删除下一个词.

使用计数器执行重复操作

      计数器是vim最nb的提速功能. 任何命令之前都可以加一个数. 这个数告诉vim你想把命令执行多少次. 例如:
3j会把光标向下移动3行.
10dd会删除10行文本.
y3"在当前行, 把光标当前位置到第三个双引号之间的文本复制到剪切板. 这种计数器用法可以大大扩展motion的操作范围. (译注: 本人认为y3"不能完成这样的功能, 对应的命令应该是y3f", 可能原作者漏写了f命令, 有空的时候问问原作者)

录制宏

      你可能偶然会发现你对一个文档中的某块文本反反复复的进行相同的操作. vim可以录制一个特定的宏来完成这些操作.

qregister  开始录制一个宏并保存在某个有名字的寄存器. 比如qa开始录制一个宏并把这个宏存放在寄存器a中.
q 结束录制
@register 回放存放在某个寄存器的宏. 比如@a播放寄存器a中的宏.

      请注意宏只是记录你的按键并且回放; 不是神奇的魔法. 因为在vim中可以用多个命令执行某个任务, 录制宏几乎成了一种艺术形式, 你必须非常小心的选择要用的命令才能用宏达到你想要的效果.

用vim写程序代码

    vim是优秀的源代码编辑器, 有很多的功能是专门为写程序设计的. 这里是一些常用的:

]p 和p相似, 但是它可以自动调整粘贴的代码和已有的代码缩进. 试试吧.
% 把光标放在某个花括号{}, 中括号[]或者圆括号()上, 按%会把光标移动到与之对应的花括号, 中括号或者圆括号上. 对于修正多层嵌套逻辑代码块的括号解析问题来说, 这个功能堪称救人于水火之中.
>> 缩进高亮选中的代码. (对高亮选中请查看前面章节, 如果没有文本被高亮选中, 则将当前行缩进)
<< 和>>类似, 但是反方向(译注: 缩进是向右移动行, 反方向既向左移动).
gd 把光标移动到当前光标所在位置的函数或者变量的定义(definition)(或声明(declaration)).
K 打开当前光标所在词对应的手册页(man page). (比如你的光标当前在sleep这个词上, vim会显示sleep的手册页) (译注: 这个功能貌似只对vim的原生OS--unix上有用)

(译注: 结合ctags, cscope之类的辅助工具, vim可以提供更强大的程序代码编写功能)


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【转】高效使用vim 的相关文章

  • Vim 重复点(“.”)命令缓冲区?

    我真的很喜欢 YankRing 的行为 它让我可以访问我最近完成的几件事y固定或d已删除或c不假思索地被吊死了 然而 这样的补充功能对于 重复命令 最常见的是当我键入我真正想重复的内容时 然后按x清理一些东西 通常 可以通过视觉模式拉动我刚
  • Vi/vim - 从末尾行删除,包括最后一个字符

    我想做类似这个问题的事情VI VIM 删除 更改从右到左 https stackoverflow com q 9154212 301527即从行尾删除到该行中 的最后一个实例 这可以使用dT 将光标放置在该行的末尾 然而 这个命令和其他这样
  • 如何在 Vim 中使 shift+空格键向上翻页?

    我的 vimrc 中有一个条目 当我按空格键时 它会在视口中向下翻页 它看起来像这样 map
  • Vim ":source %" 命令导致错误 (E499)

    Stack Overflow vim 用户大家好 我最近发现自己花了相当多的时间在学校的计算机科学实验室编写代码 我在无数的linux系统上配置过vim 从来没有遇到过这个错误 E499 Empty file name for or onl
  • Vim:垂直选项卡列表可以吗?

    是否可以让 vim 的选项卡列表垂直显示在编辑器的左侧 这确实很有帮助 但我还没有找到任何可以做到这一点的插件 我对谷歌很烂吗 我同意兰迪关于选项卡使用的观点 但前段时间我也在寻找在 gvim 中添加垂直制表符的可能性 为此 您必须修改源
  • vim 脚本“input()”函数不需要用户按 Enter 键

    我想让用户调用我的函数 然后让该函数请求用户输入 但我不希望用户在输入 input 函数所需的字母后必须输入 enter 例如 用户应该能够键入 h j k l 等单字母命令 并且键入的每个字母都会在我的函数中循环 直到用户键入 x 退出
  • VIM:使用 :normal 命令退出插入模式

    当我使用 normal 命令进入插入模式时 normal i 例如 如何退出插入模式 如果我按 或 VIM 会退出命令模式 并且我无法运行 normal 命令 I put imap
  • Vim 搜索模式,如果出现则删除到行尾

    我正在尝试在文本文件中搜索特定模式 如果出现这种模式 则意味着该行的其余部分不需要 因此可以删除 我尝试过使用以下命令 但到目前为止还没有成功 s pattern d g pattern d 如果有人有任何建议 他们将不胜感激 would
  • Vim + tmux + WSL 在导航文档时显示方块和奇怪的字符

    我可以在 Windows Ubuntu 子系统中使用 vim 没有任何问题 然后 当在 tmux 中运行 Vim 并输入文本时 大多数字符都会显示为奇怪的方块 里面有引号而不是实际的字母 这是 vim 文本的屏幕截图 1 在 tmux 中突
  • Vim - 在插入模式下删除行

    我可以在插入模式下删除一行吗 因为目前我必须按
  • Vim 自动缩进换行

    我如何让vim将光标放在大括号内以新行开始 即用 表示光标位置 class 现在我的设置只能做到这一点 class 我在 vimrc 文件中得到了这个 设置自动缩进 shiftwidth 2 tabstop 2 noexpandtab 基本
  • 如何翻转vim中视觉选择的线条?

    我想进行视觉选择并将其翻转 以便选择的第一行位于底部 从
  • 增加和减少数字

    我有这个带有数字的文本 My numbers are 04 and 0005 My numbers are 05 and 0006 My numbers are 06 and 0035 My numbers are 07 and 0007
  • vimscript 调用与执行

    在 vimscript 中 有什么区别call and execute 在什么场景 用例中我应该使用其中一种而不是另一种 免责声明 我知道 vim 中提供了广泛的在线帮助 我正在寻找这个特定问题的简洁答案 call 调用函数 exec 将字
  • 在文件中逐块更改文件类型(或其他 Vim 设置)?

    我在 Vim 中编写了很多 Perl 程序 通常我只是将一些 CGI 脚本组合在一起 然后将 CSS 直接放入程序代码中 所以最近我问自己是否有可能在我的代码中的这些块周围放置一些 Vim 特定的注释 以便 vim 突出显示特定区域而不是
  • 编译带有 python 支持的 vim

    我正在尝试编译支持 Python 2 5 1 的 Vim 7 2 但遇到了一些麻烦 我运行配置 看起来它正在按预期工作 configure with features huge enable pythoninterp prefix home
  • 在vim中的所有缓冲区中运行宏

    我知道关于 bufdo命令 并试图将其与我录制的宏结合起来 a 在我加载的每个头文件的正确位置添加 include 但是 我找不到在每个缓冲区上运行宏的简单方法 有没有办法通过ex模式来执行宏 这就是 bufdo需要 或者我还缺少另一个命令
  • 使用vim,如何快速刷新正在处理的网页?

    我已经使用 VIM 几个星期了 同时处理各种网络语言 我真的很喜欢它 我发现必须点击或单击浏览器并刷新页面才能看到代码更改的效果 这很麻烦 更烦人的是 因为我使用的是 Virtual Box 而且我倾向于在主机系统上处理 PDF 文件 因此
  • 如果“dw”只删除单词的一部分,那么“daw”如何在 Vim 中删除单词?

    我是 Vim 用户 我想删除一个关键字 我总是使用 dw 来删除特定的关键字 但有时效果不佳 例如 我想删除示例程序中的 value123 ex public void function int valule123 当我将光标放在 2 上
  • 如何在 Vim 中对数字和文字列进行排序

    使用 Vim 6 0 假设我正在编辑这个文件 sdfsdg dfgdfg 34 12 2 4 45 1 34 5 如何对第二列进行排序 如果您有合适的 shell 请选择您的号码并运行命令 lt gt sort n k 2 如果您要在视觉模

随机推荐

  • my.cnf

    http wenku baidu com view d10a7ea20029bd64783e2cdd html My cnf配置选项 mysqld程序 目录和文件 basedir 61 path 使用给定目录作为根目录 安装目录 chara
  • mysql 修改root密码的方法

    如果是刚安装成功后 xff0c 密码为空 xff0c 修改密码方法为 mysqladmin u root password 39 11111 39 密码不为空 xff0c 修改密码方法有两种 xff1a 1 mysqladmin u roo
  • mysqldump用法小结

    1 备份单个数据库 普通备份 xff1a root 64 A server mysqldump u root p 39 111111 39 newjueqi default gt tmp newjueqi default sql root
  • MySQL数据库性能优化之缓存参数优化

    作者 xff1a Sky Jian 可以任意转载 但转载时务必以超链接形式标明文章原始出处 和 作者信息 及 版权声明 链接 xff1a http isky000 com database mysql perfornamce tuning
  • magento中的启用https

    在Magento的后台管理中 General gt web gt secure 有安全链接的设置 xff0c 所谓安全链接 xff0c 是指启用了https 协议的链接 百度百科中关于https的介绍 xff08 http baike ba
  • 解决magento中guest页面cookie保存时间过短问题

    在magento新的企业版11 xff0c 有个新的功能退货 xff08 RMA xff09 xff0c 不仅能退货 xff0c 还能以guest的身份查看订单的各种信息 xff0c 但在IE下有个问题 xff1a cookies的保存时间
  • 指定magento后台使用的theme

    众所周知 xff0c magneto是能后台配置中指定前台使用的是哪个theme xff0c 但后台呢 xff1f 指定后台的theme xff0c 需要在添加如下的配置 xff1a lt config gt lt stores gt lt
  • MySQL 数据库性能优化之表结构优化

    作者 xff1a Sky Jian 可以任意转载 但转载时务必以超链接形式标明文章原始出处 和 作者信息 及 版权声明 链接 xff1a http isky000 com database mysql perfornamce tuning
  • MySQL 数据库性能优化之索引优化

    作者 xff1a Sky Jian 可以任意转载 但转载时务必以超链接形式标明文章原始出处 和 作者信息 及 版权声明 链接 xff1a http isky000 com database mysql performance tuning
  • MySQL 数据库性能优化之SQL优化

    作者 xff1a Sky Jian 可以任意转载 但转载时务必以超链接形式标明文章原始出处 和 作者信息 及 版权声明 链接 xff1a http isky000 com database mysql performance tuning
  • “巨型”的ESP8266模块,快来围观。

    作者 xff1a 晓宇 xff0c 排版 xff1a 晓宇 微信公众号 xff1a 芯片之家 xff08 ID xff1a chiphome dy xff09 01 巨型ESP8266 ESP8266几乎无人不知 xff0c 无人不晓了吧
  • MySQL数据库性能优化之存储引擎选择

    作者 xff1a Sky Jian 可以任意转载 但转载时务必以超链接形式标明文章原始出处 和 作者信息 及版权声明 链接 xff1a http isky000 com database mysql performance tuning s
  • 配置magento后台翻译

    同事在magento中添加了若干翻译 xff0c 但总是没法再后台显示 xff0c 我帮忙查了很久 xff0c 终于找到问题所在了 xff0c 原来没有配置对应module的后台翻译文件 xff0c 所以在后台显示不出翻译 这里贡献一份前后
  • apache安装新模块的方法

    1 检查是否安装 a 编译安装http bin apachectl l grep mod expires b 如果是以DSO方式编译的 xff0c 则查看 ll modules grep expires 注意 xff0c 以上两种情况不能同
  • prototype.js中hide()和show()的一个注意事项

    在项目中遇到一个问题 xff0c 用prototype js的show xff08 xff09 方法要设置某个div为display block 但总是没法成功 xff0c 后来查了手册 xff1a http api prototypejs
  • doxygentoolkit.vim 用法

    http blog chinaunix net space php uid 61 20570759 amp do 61 blog amp id 61 1922274 早就安上了这个东西 xff0c 只是一直没研究它怎么用 因为 emacs
  • 一些vim知识的摘录

    h function list 看内置函数 b name variable local to a buffer w name variable local to a window g name global variable also in
  • 为什么 Vim 使用 HJKL 键作为方向键

    出处 xff1a http blog jobbole com 18650 导读 xff1a 关于这个问题 xff0c 以前网络上有一种说法 xff0c 手指放在键盘上输入时 xff0c HJKL 比方向键距离手指更近 xff0c 自然输入效
  • 蚂蚁变大象:浅谈常规网站是如何从小变大的(一)

    http zgwangbo blog 51cto com 4977613 849529 标签 xff1a 架构 web 原创作品 xff0c 允许转载 xff0c 转载时请务必以超链接形式标明文章 原始出处 作者信息和本声明 否则将追究法律
  • 【转】高效使用vim

    出处 xff1a http www cnblogs com hyddd archive 2010 04 08 1706863 html 英文出处 xff1a jmcpherson org editing html 翻译引用 xff1a ti