【转】高效使用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 的相关文章

  • 在 Archlinux 上使用 Vim 作为 Haskell 的 IDE 目前情况如何?

    如果可行的话 我的目标是通过 YouCompleteMe 在 Vim 中完成 Haskell 的命令 在这方面 正如您在下面看到的 我还没有找到关于如何让它发挥作用的共识 相关评论的最新评论YouCompleteMe 上的问题 https
  • 在 vimrc 中切换匹配

    我的 vimrc 文件中有以下几行 hi ExtraWhitespace cterm NONE ctermbg green ctermfg green guibg green guifg green match ExtraWhitespac
  • 如何在Vim中正确显示UTF-8字符

    我想要 需要编辑包含 UTF 8 字符的文件 并且我想使用 Vim 在我被指责问以前问过的问题之前 我已经阅读了有关编码 文件编码 s 术语编码等的 Vim 文档 用 google 搜索了该主题 并阅读这个问题 https stackove
  • Vim:领导不工作

    当尝试使用时vim latexsuite的映射 使用的是Leader不工作 nmap n
  • gvim中的鼠标输入

    标准鼠标输入可以在 vim 中自定义吗 在我的例子中是 vim 插件也是可以接受的选择 我特别感兴趣的是 覆盖 双击某个单词 这样 gvim 就不仅仅是突出显示该单词 而是进行搜索 从而突出显示文件中该单词的所有实例 我在其他编辑器中看到过
  • Vim 无法在 OS X 上使用 python 进行编译

    我一直在尝试编译vim 7 3 with 蟒蛇2 7支持苹果系统 X 10 6 Vim 本身编译得很好 但嵌入的 python 编译得不太好 我已采取的步骤 hg clone https vim googlecode com hg vim
  • 如何在 vim 中为 cscope 输出添加颜色?

    我使用的是 vim 7 4 vim 中的 cscope 输出全是白色 可以变得更加丰富多彩吗 我尝试了cecscope 它使用quickfix给vim带来颜色 但它的输出不适合小屏幕 使用笔记本电脑时它没有那么有用 那么还有其他方法可以为
  • Vim、Javascript、DoctorJS (jsctags) 和 Taglist(源代码浏览)

    我已经安装了DoctorJS http doctorjs org 之前jsctags 试图为 Vim 获得一些好的源代码浏览 标签列表 使用Taglist http www vim org scripts script php script
  • 如何在 VIm 和终端中始终拥有相同的当前目录?

    我希望我的终端当前目录跟随我的 VIM 目录 Example 在终端中 gt pwd gt Users rege gt vim 然后在VIM中 cd Users rege project
  • 如何在 Vim 中特定列的所有行中插入特定字符?

    Dates Name Date Battle of the Plains of Abraham September 13 1759 Proclamation Act October 07 1763 Stamp Act March 22 17
  • 强制 vim 覆盖外部更改

    我使用 Vim 7 4 Mac OS 编辑和运行 Lua 脚本 我已经在 vimrc 中映射了一个键来保存当前缓冲区并运行外部脚本 vimrc 中的按键映射 map V w
  • 如何使用 VIM 进行 .Net 开发 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 按文件类型设置 Vim 空白首选项

    在我的工作中 我需要遵循房屋风格进行缩进 如下所示 编码 html 和 ruby 时有 2 个空格 编码 javascript 时使用制表符 建议使用 tabwidth 4 为每个文件类型指定不同的空白首选项的最佳方法是什么 方法有很多 但
  • vim 中的语法高亮

    当我在 vim 中打开语法颜色时 我无法在黑色上阅读深蓝色 如何更改一些默认颜色或模式颜色 例如 http www vim org scripts script php script id 1571 http www vim org scr
  • 如何中断一个花费太多时间的 Vim 命令?

    有时 Vim 命令需要花费太多时间来执行 典型示例 gf通过网络发送具有巨大路径的命令 最多可能需要 30 秒才能结束 我想在执行过程中中断它 有没有办法取消命令执行并返回到正常模式 无需杀死 Vim 并重新启动 您可以中断它发送 SIGI
  • 如何从 Bash 命令行在后台 Vim 打开另一个文件?

    我正在从使用 Gvim 过渡到使用控制台 Vim 我在 Vim 中打开一个文件 然后暂停 Vim 在命令行上运行一些命令 然后想返回到 Vim Ctrl Z 在正常模式下 暂停 Vim 并返回到控制台 fg可用于将焦点返回到 Vim job
  • VIM:使用 :normal 命令退出插入模式

    当我使用 normal 命令进入插入模式时 normal i 例如 如何退出插入模式 如果我按 或 VIM 会退出命令模式 并且我无法运行 normal 命令 I put imap
  • 如何将可视选择的文本通过管道传输到 UNIX 命令并将输出附加到 Vim 中的当前缓冲区

    使用 Vim 我尝试将在可视模式下选择的文本通过管道传输到 UNIX 命令 并将输出附加到当前文件的末尾 例如 假设我们有一个 SQL 命令 例如 SELECT FROM mytable 我想做如下的事情
  • 自定义 Vim HTML 语法

    我有一个脚本可以读取 HTML 文件并替换出现的 foo 具有 Perl 设置的值 像这样的东西 span class hi mom span 会在浏览器中产生类似这样的内容 span class classyclass Hello Wor
  • vim中的折叠功能

    有没有什么方法或工具可以在 vim 中折叠功能 例如 Visual Studio 或 Eclipse Vim folding commands zf j creates a fold from the cursor down lines z

随机推荐

  • 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