Vim-蓝色星球迄今为止最强大的编辑器(持续更新

Posted Jiro程序猿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Vim-蓝色星球迄今为止最强大的编辑器(持续更新相关的知识,希望对你有一定的参考价值。

故事 - “编辑器之神”

为什么Vim被称为编辑器之神?话说啊,远古时候,有两大神仙,地上很多猿类大多分成两派,一部分仰慕Vim大神,另一部分崇拜Emacs大仙,这两派互相挖苦比较,只相信自己的信仰之神是最强大的!我呢,暂时站Vim神的,不排除以后叛变啦!

好了,正经说话吧!高校里教学c语言时,应该是用的VC++6.0 or VS2010,这两个是编辑器嘛?当然,不是的!他们都是集成开发环境(IDEIntegrated Development Environment),而Vim才是编辑器,与vim一起称作编辑器还有啥子呢?比如,Emacs(Vim在这个世界上的最强大对手),VS code(Microsoft推出的开源编辑器,是我最近使用的最频繁的编辑器,可以说面对学习曲线陡峭的Vim来说,VS code是最容易上手的编辑器,我现在在写的这篇blog就是用VS code写的,插件十分丰富,除了由于GUI界面的存在,可能在内存上稍高于Vim,但比起鬼畜的Atom来说,那是好到不知道哪里去了的存在),Atom(Google推出的开源编辑器,同样因为开源的原因,插件十分丰富),Sublime Text(前端engineer一定经历过的编辑器,插件丰富,性能极优)等等……

好了,你现在肯定会问我,为啥我这次blog只介绍Vim呢?因为,Vim难学啊!这里有一张网上嘲讽几大编辑器的学习曲线~

学习Vim能给你带来什么?

从图上我们能看出,vim(vi)的学习曲线入门是十分陡峭的,Emacs的略显鬼畜2333~!那,学习Vim对于我来说,到底有什么什么好处呢?我在刚刚学习Vim时,也是有抱着这个疑惑的,后来总是强迫自己去学+在网上了解Vim,我觉得学习对你可能会有这些好处:

  • 熟悉命令行工具:Vim是在终端(Terminal)上运行的编辑器,学习Vim无疑你会在命令行下进行频繁操作,而命令行工具对于程序员来说,是十分重要的!也许大部分同学的开发环境大部分还是Windows,使用命令行工具的机会很少!但是以后科研or工作,开发平台就不一定是Windows了,也不一定会有带图形界面的开发工具给你使用。比如:

    • 你科研跑TensorFlow,进行深度学习方面的科研,大概率会需要在linux上跑;做机器学习离不开Linux~我最近在做计算机视觉(Computer Vision)的研究,小方向现在做的是对机械臂进行视觉定位,然而这个机械臂的ROS操作工具,就必须在Linux下进行~~macOS&Windows都没提供~~

    • 你是EE爱好者(robot开发方向的爱好者),而ROS (Robot Operating System, 机器人操作系统) 恰恰只提供给你Linux的开发工具(且只保证Ubuntu(Linux的一个发行版)能够完美兼容),你作为机器人方向开发者,无法避免命令行工具的使用

    • 除了科研界,工程界对于命令行工具的使用不要太多!各大互联网的大厂的每一个开发岗offer,无论你是c/c++/java/python/c#/前端/运维等,哪个岗位要求都会有这么一句“熟悉使用命令行操作工具”or“熟悉shell脚本语言编程”,可以说,使用命令行工具是一位合格的计算机专业大学生应该具有的。

  • Vim具有其他编辑器不具有的与生俱来的特殊功能,比如轻松运用SSH(SSH指:. Secure Shell(缩写:SSH),即“安全壳协议”,一项计算机上的安全协议);Vim内存占用很低,对于开发配置要求极低,比起具有图形界面的VS code,Atom,Sublime来说,可以说能开机的电脑都能顺溜地跑Vim~!

  • 最后一个:Vim能帮助乌干达的贫苦儿童,这是个梗2333~!不过,认真讲哦~你用Vim写代码,是在帮助世界上的其他小孩子呢!还有什么理由,不好好写代码233~!
    Vim-蓝色星球迄今为止最强大的编辑器(持续更新

相信前面的大串理由,你一定拒绝不了Vim的诱惑,不如和我一起来学习Vim工具吧~啦啦啦~!

Vim介绍以及如何入门

Vim和Vi的关系

通过搜索引擎了解一下,就简单黏上来了!自己写的没有这么全面~

Vim和Vi都是多模式编辑器,不同的是vim 是vi的升级版本,它不仅兼容vi的所有指令,而且还有一些新的特性在里面。
vim的这些优势主要体现在以下几个方面:
1、多级撤消
我们知道在vi里,按`u`只能撤消上次命令,而在vim里可以无限制的撤消。
2、易用性
vi只能运行于unix中,而vim不仅可以运行于unix,windows ,mac等多操作平台。
3、语法加亮
vim可以用不同的颜色来加亮你的代码。
4、可视化操作
就是说vim不仅可以在终端运行,也可以运行于x window、 mac os、 windows。
5、对vi的完全兼容
某些情况下,你可以把vim当成vi来使用。


所以,我们通常就把Vim包括了Vi啦~!

Vim安装

按道理来说,现如今的操作系统(除Windows)都已经自带好了Vim。为了避免古老版本只安装Vi的gg情况,我们可以先敲

$ vim -version


来确定计算机是否已经安装好了Vim,一般出现的结果就是:

fuujiro-Mac:~ fuujiro$ vim -version
VIM - Vi IMproved 8.0 (2016 Sep 12, compiled Jul 26 2017 19:10:24)


如上结果的话,你的计算机就已经安装好了Vim,版本是8.0。
当然如果提示command not found,那也不慌,我们装上就好:

  • Linux用户:
    因为Linux存在两大派系,Debian和Redhat,对于不同派系,安装命令也不相同。

    ubuntu系统(基于Debian):
    普通用户下输入命令:sudo apt-get install vim-gtk
    centos系统(基于Redhat):
    普通用户下输入命令:yum -y install vim*
  • macOS用户:
    macOS是自带Vim的,但由于随系统版本的原因,可能版本落后,那就讲一下Vim的升级吧~!
    我是推荐用Homebrew(Homebrew是一款自由及开放源代码的软件包管理系统,用以简化Mac OS X系统上的软件安装过程)来升级的。

    1. 安装Homebrew

      $ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
    2. 安装or升级Vim

      安装Vim
      $ brew install vim
      升级Vim
      $ brew update vim
  • Windows用户
    Windows因为不是*nix类系统,所以不会自带Vim,不过已经有大牛开发出了vim在Windows上的编辑器-gvim

    • gvim+w7+vundle安装教程
      上面这个文章清晰的解释了每一步,跟着做就好。

Vim入门

vim的基础模式

在使用vim时,主要你会在两个模式下操作:

  • 正常(normal)模式:任何其它模式中都可以通过键盘上的 Esc 键回到正常模式。在这个模式下可以进行命令(commmand)模式操作(按:进入)。例如,wq是保存并退出,q!是强制退出不保存。

  • 输入(insert)模式,输入文本时使用;在正常模式下键入“i”(insert)或“a”(append)即可进入插入模式。这时候一般进行文本编辑工作,例如写代码。

当然除了这两种模式,还有可视(visual)模式:用于选定文本块;可以在正常模式下输入“v”(小写)来按字符选定,输入“V”(大写)来按行选定,或输入“Ctrl-V”来按方块选定。主要的话,还是上面那2种模式用的比较多。

vim的基本操作

你如果是第一次接触命令行,可以在打开终端(open terminal),敲下vimtutor然后按下回车,就可以看到(如下图)

Vim-蓝色星球迄今为止最强大的编辑器(持续更新

这是vim的学习文档,文档语言取决于你的系统语言,所以不会英语的小伙伴也不必害怕学习vim,毕竟中文文档也是挺丰富的,不过我还是推荐学习好英语的。

好,现在默认大家都已经跟着vimtutor过了一遍了,那再复现一下文档里的一些主要的操作。

注意:

  • 首先是控制光标移动的方向键,依然还是可以用上下左右键的,不过vim发明者的本意是提高使用者的打字效率,所以推荐h,j,k,l这4个键分别,这样你的双手就不用离开主键盘区了,完完全全的效率工具。当然,刚刚开始使用时,你会觉得有点变扭,不过熟悉后你肯定会赞成我这句话的。

  • 在插入模式下按:键就可以进入命令模式;在命令模式下按i就可以进入插入模式。在插入模式下,输入wq可以保存并退出文件,按q!是强制退出不保存。如果有需要保存的路径,那么就w+空格+保存文件的路径

总结的详细操作:

  1. 删除字符
    要删除一个字符,只需要将光标移到该字符上按下”x”。

  2. 删除一行
    删除一整行内容使用dd命令。删除后下面的行会移上来填补空缺。

  3. 删除换行符
    在Vim中你可以把两行合并为一行,也就是说两行之间的换行符被删除了:命令是J

  4. 撤销
    如果你误删了过多的内容。显然你可以再输入一遍,但是命令u 更简便,它可以撤消上一次的操作。

  5. 重做
    如果你撤消了多次,你还可以用CTRL-R(重做)来反转撤消的动作。换句话说,它是对撤消的撤消。撤消命令还有另一种形式,U命令,它一次撤消对一行的全部操作。第二次使用该命令则会撤消前一个U的操作。用uCTRL-R你可以找回任何一个操作状态。

  6. 追加
    i命令可以在当前光标之前插入文本。
    a命令可以在当前光标之后插入文本。
    o命令可以在当前行的下面另起一行,并使当前模式转为Insert模式。
    O命令(注意是大写的字母O)将在当前行的上面另起一行。

  7. 使用命令计数
    假设你要向上移动9行。这可以用kkkkkkkkk9k来完成。事实上,很多命令都可以接受一个数字作为重复执行同一命令的次数。比如刚才的例子,要在行尾追加三个感叹号,当时用的命令是a!!!。另一个办法是用3a!命令。3说明该命令将被重复执行3次。同样,删除3个字符可以用3x。指定的数字要紧挨在它所要修饰的命令前面。

  8. 退出
    要退出Vim,用命令ZZ。该命令保存当前文件并退出Vim。

  9. 放弃编辑
    丢弃所有的修改并退出,用命令:q!。用:e!命令放弃所有修改并重新载入该文件的原始内容。

  10. 以Word为单位的移动
    使用w命令可以将光标向前移动一个word的首字符上;比如3w将光标向前移动3个words。b命令则将光标向后移动到前一个word的首字符上。
    e命令会将光标移动到下一个word的最后一个字符。命令ge,它将光标移动到前一个word的最后一个字符上。、

  11. 移动到行首或行尾
    $命令将光标移动到当前行行尾。如果你的键盘上有一个键,它的作用也一样。^命令将光标移动到当前行的第一个非空白字符上。0命令则总是把光标移动到当前行的第一个字符上。键也是如此。$命令还可接受一个计数,如1$会将光标移动到当前行行尾,2$则会移动到下一行的行尾,如此类推。”0”命令却不能接受类似这样的计数,命令^前加上一个计数也没有任何效果。

  12. 移动到指定字符上
    命令fx在当前行上查找下一个字符x(向右方向),可以带一个命令计数F命令向左方向搜索。tx命令形同fxs命令,只不过它不是把光标停留在被搜索字符上,而是在它之前的一个字符上。提示:t意为To。该命令的反方向版是Tx。这4个命令都可以用;来重复。以,也是重复同样的命令,但是方向与原命令的方向相反。

  13. 以匹配一个括号为目的移动
    用命令%跳转到与当前光标下的括号相匹配的那一个括号上去。如果当前光标在(上,它就向前跳转到与它匹配的),如果当前在)上,它就向后自动跳转到匹配的(上去.

  14. 移动到指定行
    G命令指定一个命令计数,这个命令就会把光标定位到由命令计数指定的行上。比如33G就会把光标置于第33行上。没有指定命令计数作为参数的话, G会把光标定位到最后一行上。gg命令是跳转到第一行的快捷的方法。
    另一个移动到某行的方法是在命令%之前指定一个命令计数比如50%将会把光标定位在文件的中间, 90%跳到接近文件尾的地方。
    命令H,M,L,分别将光标跳转到第一行,中间行,结尾行部分。

  15. 告诉你当前的位置
    使用CTRL-G命令。set number在每行的前面显示一个行号。相反关闭行号用命令:set nonumber:set ruler在Vim窗口的右下角显示当前光标位置。

  16. 滚屏
    CTRL-U显示文本的窗口向上滚动了半屏。CTRL-D命令将窗口向下移动半屏。一次滚动一行可以使用CTRL-E(向上滚动)和CTRL-Y(向下滚动)。要向前滚动一整屏使用命令CTRL-F。另外CTRL-B是它的反向版。zz命令会把当前行置为屏幕正中央,zt命令会把当前行置于屏幕顶端,zb则把当前行置于屏幕底端.

  17. 简单搜索
    /string命令可用于搜索一个字符串。要查找上次查找的字符串的下一个位置,使用n命令。如果你知道你要找的确切位置是目标字符串的第几次出现,还可以在n之前放置一个命令计数。3n会去查找目标字符串的第3次出现。
    ?命令与/的工作相同,只是搜索方向相反。N命令会重复前一次查找,但是与最初用/?指定的搜索方向相反。
    如果查找内容忽略大小写,则用命令set ignorecase, 返回精确匹配用命令set noignorecase

  18. 在文本中查找下一个word
    把光标定位于这个word上然后按下*键。Vim将会取当前光标所在的word并将它作用目标字符串进行搜索。#命令是*的反向版。还可以在这两个命令前加一个命令计数:3*查找当前光标下的word的第三次出现。

  19. 查找整个word
    如果你用/the来查找Vim也会匹配到there。要查找作为独立单词的the使用如下命令:/the>>是一个特殊的记法,它只匹配一个word的结束处。近似地,<匹配到一个word的开始处。这样查找作为一个word的the就可以用:/

  20. 高亮显示搜索结果
    开启这一功能用:set hlsearch,关闭这一功能::set nohlsearch。如果只是想去掉当前的高亮显示,可以使用下面的命令::nohlsearch(可以简写为noh)。

  21. 匹配一行的开头与结尾
    ^ 字符匹配一行的开头。$字符匹配一行的末尾。
    所以/was$只匹配位于一行末尾的单词was,所以”/^was”只匹配位于一行开始的单词was。

  22. 匹配任何的单字符
    .这个字符可以匹配到任何字符。比如c.m可以匹配任何前一个字符是c,后一个字符是m的情况,不管中间的字符是什么。

  23. 匹配特殊字符
    放一个反斜杠在特殊字符前面。如果你查找ter。,用命令/ter。

  24. 使用标记
    当你用G命令从一个地方跳转到另一个地方时,Vim会记得你起跳的位置。这个位置在Vim中是一个标记。使用命令``可以使你跳回到刚才的出发点。
    `` 命令可以在两点之间来回跳转。CTRL-O命令是跳转到你更早些时间停置光标的位置(提示:O意为older). CTRL-I则是跳回到后来停置光标的更新的位置(提示:I在键盘上位于O前面)。
    注:使用CTRL-I 与按下键一样。

  25. 具名标记
    命令ma将当前光标下的位置名之为标记a。命令:”:marks”用来查看标记的列表。命令delm!删除所有标记。

  26. 操作符命令和位移
    dw命令可以删除一个word,d4w命令是删除4个word,依此类推。类似有d2ed$。此类命令有一个固定的模式:操作符命令+位移命令。首先键入一个操作符命令。比如d是一个删除操作符。接下来是一个位移命。比如w。这样任何移动光标命令所及之处,都是命令的作用范围。

  27. 改变文本
    操作符命令是c,改变命令。它的行为与d命令类似,不过在命令执行后会进入Insert模式。比如cw改变一个word。或者,更准确地说,它删除一个word并让你置身于Insert模式。
    cc命令可以改变整行。不过仍保持原来的缩进。
    c$改变当前光标到行尾的内容。
    快捷命令:

    • x 代表dl (删除当前光标下的字符)

    • X 代表dh (删除当前光标左边的字符)

    • D 代表d$ (删除到行尾的内容)

    • C 代表c$ (修改到行尾的内容)

    • s 代表cl (修改一个字符)

    • S 代表cc (修改一整行)
      命令3dwd3w都是删除3个word。第一个命令3dw可以看作是删除一个word的操作执行3次;第二个命令d3w是一次删除3个word。这是其中不明显的差异。事实上你可以在两处都放上命令记数,比如,3d2w是删除两个word,重复执行3次,总共是6个word。

  28. 替换单个字符
    r命令不是一个操作符命令。它等待你键入下一个字符用以替换当前光标下的那个字符。r命令前辍以一个命令记数是将多个字符都替换为即将输入的那个字符。要把一个字符替换为一个换行符使用r。它会删除一个字符并插入一个换行符。在此处使用命令记数只会删除指定个数的字符:4r将把4个字符替换为一个换行符。

  29. 重复改动
    .命令会重复上一次做出的改动。.命令会重复你做出的所有修改,除了u命令CTRL-R和以冒号开头的命令。.需要在Normal模式下执行,它重复的是命令,而不是被改动的内容,

  30. Visual模式
    v可以进入Visual模式。移动光标以覆盖你想操纵的文本范围。同时被选中的文本会以高亮显示。最后键入操作符命令。

  31. 移动文本
    dx这样的命令删除文本时,被删除的内容还是被保存了起来。你还可以用p命令把它取回来。P命令是把被去回的内容放在光标之前,p则是放在光标之后。对于以dd删除的整行内容,P会把它置于当前行的上一行。p则是至于当前行的后一行。也可以对命令pP命令使用命令记数。它的效果是同样的内容被取回指定的次数。这样一来dd之后的3p就可以把被删除行的3 份副本放到当前位置。
    命令xp将光标所在的字符与后一个字符交换。

  32. 复制文本(VIM编辑器内复制)
    y操作符命令会把文本复制到一个寄存器3中。然后可以用p命令把它取回。因为y是一个操作符命令,所以你可以用yw来复制一个word. 同样可以使用命令记数。如下例中用y2w命令复制两个word,yy命令复制一整行,Y也是复制整行的内容,复制当前光标至行尾的命令是y$

  33. 文本对象
    diw 删除当前光标所在的word(不包括空白字符)
    daw 删除当前光标所在的word(包括空白字符)

  34. 快捷命令
    x 删除当前光标下的字符(“dl”的快捷命令)
    X 删除当前光标之前的字符(“dh”的快捷命令)
    D 删除自当前光标至行尾的内容(“d$”的快捷命令)
    dw 删除自当前光标至下一个word的开头
    db 删除自当前光标至前一个word的开始
    diw 删除当前光标所在的word(不包括空白字符)
    daw 删除当前光标所在的word(包括空白字符)
    dG 删除当前行至文件尾的内容
    dgg 删除当前行至文件头的内容
    如果你用c命令代替d这些命令就都变成更改命令。使用y就是yank命令,如此类推。

  35. 编辑另一个文件
    用命令:edit foo.txt,也可简写为:e foo.txt

  36. 文件列表
    可以在启动Vim时就指定要编辑多个文件,用命令vim one.c two.c three.c。Vim将在启动后只显示第一个文件,完成该文件的编辑后,可以用令::next:n要保存工作成果并继续下一个文件的编辑,命令::wnext:wn可以合并这一过程。

  37. 显示当前正在编辑的文件
    用命令:args

  38. 移动到另一个文件
    用命令:previous :prev回到上一个文件,合并保存步骤则是:wprevious :wprev。要移到最后一个文件:last,到第一个:first.不过没有:wlast或者:wfirst这样的命令。可以在:next:previous命令前面使用一个命令计数。

  39. 编辑另一个文件列表
    不用重新启动Vim,就可以重新定义一个文件列表。命令:args five.c six.c seven.h定义了要编辑的三个文件。

  40. 自动存盘
    命令:set autowrite,set aw。自动把内容写回文件: 如果文件被修改过,在每个:next:rewind:last:first:previous:stop:suspend:tag:!:makeCTRL-] 和 CTRL-^命令时进行。
    命令:set autowriteall,set awa。和autowrite类似,但也适用于:edit:enew:quit:qall:exit:xit:recover 和关闭 Vim 窗口。置位本选项也意味着 Vim 的行为就像打开autowrite一样。

  41. 切换到另一文件
    要在两个文件间快速切换,使用CTRL-^

  42. 文件标记
    以大写字母命名的标记。它们是全局标记,它们可以用在任何文件中。比如,正在编辑fab1.Java,用命令50%mF在文件的中间设置一个名为F的标记。然后在fab2.java文件中,用命令GnB在最后一行设置名为B的标记。在可以用F命令跳转到文件fab1.java的半中间。或者编辑另一个文件,'B命令会再把你带回文件fab2.java的最后一行。
    要知道某个标记所代表的位置是什么,可以将该标记的名字作为marks命令的参数:marks M或者连续跟上几个参数:marks MJK。可以用CTRL-OCTRL-I可以跳转到较早的位置和靠后的某位置。

  43. 查看文件
    仅是查看文件,不向文件写入内容,可以用只读形式编辑文件。用命令:vim -R file。如果是想强制性地避免对文件进行修改,可以用命令:vim -M file

  44. 更改文件名
    将现有文件存成新的文件,用命令:sav(eas) move.c。如果想改变当前正在编辑的文件名,但不想保存该文件,就可以用命令:f(ile) move.c

  45. 分割一个窗口
    打开一个新窗口最简单的办法就是使用命令:splitCTRL-W命令可以切换当前活动窗口。

  46. 关闭窗口
    用命令close,可以关闭当前窗口。实际上,任何退出文件编辑的命令:quitZZ都会关闭窗口,但是用:close可以阻止你关闭最后一个Vim,以免以意外地整个关闭了Vim。

  47. 关闭除当前窗口外的所有其他窗口
    用命令:only,关闭除当前窗口外的所有其它窗口。如果这些窗口中有被修改过的,你会得到一个错误信息,同时那个窗口会被留下来。

  48. 为另一个文件分隔出一个窗口
    命令:split two.c可以打开第二个窗口同时在新打开的窗口中开始编辑作为参数的文件。如果要打开一个新窗口并开始编辑一个空的缓冲区,使用命令:new

  49. 垂直分割
    用命令:vsplit:vsplit two.c。同样有一个对应的:vnew命令,用于垂直分隔窗口并在其中打开一个新的空缓冲区。

  50. 切换窗口
    CTRL-W h 到左边的窗口
    CTRL-W j 到下面的窗口
    CTRL-W k 到上面的窗口
    CTRL-W l 到右边的窗口
    CTRL-W t 到顶部窗口
    CTRL-W b 到底部窗口

  51. 针对所有窗口操作的命令
    :qall放弃所有操作并退出,:wall保存所有,:wqall保存所有并退出。上面的这几个命令可以缩写为:q:w:wq

  52. 为每一个文件打开一个窗口
    使用-o选项可以让Vim为每一个文件打开一个窗口vim -o one.txt two.txt three.txt

  53. 使用vimdiff查看不同
    vimdiff main.c~ main.c,另一种进入diff模式的办法可以在Vim运行中操作。编辑文件main.c,然后打开另一个分隔窗口显示其不同:
    :edit main.c
    :vertical diffpatch main.c.diff

  54. 页签
    命令:tabe(dit) thatfile在一个窗口中打开thatfile,该窗口占据着整个的Vim显示区域。命令:tab split/new结果

最后贴2张Vim的命令大全图,可以留着当壁纸,时不时看几眼,没准就都记住了呢~
Vim-蓝色星球迄今为止最强大的编辑器(持续更新


Vim的终极配置

  • spf13-vim官网

Vim使用时遇到过的问题及处理方法(持续更新

祝大家使用Vim更加爽快~!在编程的道路上越走越远~!

致谢:

  1. 令狐葱@前端笔记

  2. 吴润的知乎专栏:cs专业那些事

  3. vim常用命令总结 (转)


以上是关于Vim-蓝色星球迄今为止最强大的编辑器(持续更新的主要内容,如果未能解决你的问题,请参考以下文章

Vim速查手册:最强大的工具,最全面的指南

Vim速查手册:最强大的工具,最全面的指南

Emacs是神的编辑器,而Vim是编辑器之神

Linux之文本编辑器

vim绝对常用命令(持续更新中)

C语言第十六章:linux系统vi编辑器