简单的VIM命令,你希望你早些时候知道

我一直在学习VIM中的新命令,但是我相信每个人都会偶尔学到一些新的东西。 我最近才了解到这一点:

zz,zt,zb – 将光标定位在屏幕的中间,上方或下方

什么是你希望你以前学过的其他有用或优雅的命令?

我真的希望我知道你可以使用Ctrl-C而不是ESC来切换插入模式。 这对我来说是一个真正的生产力提升。

我学到的最近的“哇”招是一个复杂的search和replace的方法。 在过去很多时候,我有一个非常复杂的正则expression式来做replace,它不起作用。 有一个更好的方法:

:set incsearch " I have this in .vimrc /my complicated regexp " Highlighted as you enter characters :%s//replace with this/ " You don't have to type it again 

这里的“诀窍”是指你可以使用search来创build正则expression式(“incsearch”在input字符时将其突出显示),然后在replace中使用空的模式:空模式默认为最后的search模式。

例:

 /blue\(\d\+\) :%s//red\1/ 

相当于:

 :%s/blue\(\d\+\)/red\1/ 

看到:

 :help 'incsearch' :help :substitute 

我为我的一个朋友创build了我最常用命令的这个参考。 希望人们能find有用的东西:

 select v select row(s) SHIFT + v select blocks (columns) CTRL + v indent selected text > unindent selected text < list buffers :ls open buffer :bN (N = buffer number) print :hardcopy open a file :e /path/to/file.txt :e C:\Path\To\File.txt sort selected rows :sort search for word under cursor * open file under cursor gf (absolute path or relative) format selected code = select contents of entire file ggVG convert selected text to uppercase U convert selected text to lowercase u invert case of selected text ~ convert tabs to spaces :retab start recording a macro qX (X = key to assign macro to) stop recording a macro q playback macro @X (X = key macro was assigned to) replay previously played macro * @@ auto-complete a word you are typing ** CTRL + n bookmark current place in file mX (X = key to assign bookmark to) jump to bookmark `X (X = key bookmark was assigned to ` = back tick/tilde key) show all bookmarks :marks delete a bookmark :delm X (X = key bookmark to delete) delete all bookmarks :delm! split screen horizontally :split split screen vertically :vsplit navigating split screens CTRL + w + j = move down a screen CTRL + w + k = move up a screen CTRL + w + h = move left a screen CTRL + w + l = move right a screen close all other split screens :only * - As with other commands in vi, you can playback a macro any number of times. The following command would playback the macro assigned to the key `w' 100 times: 100@w ** - Vim uses words that exist in your current buffer and any other buffer you may have open for auto-complete suggestions. 

gi切换到插入模式,将光标置于之前的相同位置。

  :Q! 

我希望我在第一次开始vi之前就知道

^ XF完成使用当前目录中的文件名。 没有更多的从terminal复制/粘贴或痛苦的双重检查。

^ XP在当前文件中使用单词完成

:设置scrollbind强制一个缓冲区滚动另一个。 例如把窗户分成两个垂直的窗格。 在每个文件中加载一个文件(可能是同一文件的不同版本)。 这样做:set scrollbind在每个中:set scrollbind 。 现在当你滚动一个, 两个窗格将滚动在一起。 理想的比较文件。

您可以使用一整套命令来更改括号/圆括号/引号/标记内的文本。 避免find组的开始和结束是非常有用的。 尝试ci(, ci{, ci<, ci", ci', ct取决于你想要改变什么types的对象,并且ca(, ca{, ... variants也删除括号/引号。

容易记住:在括号内的声明中改变/改变括号内的声明。

  1. 不要按逃生。 看到这个答案,了解为什么 。 如上所述,ctrl-c是一个更好的select。 我强烈build议映射你的大写locking键来转义。

  2. 如果您正在编辑ctags兼容语言,使用标签文件和:ta,ctrl-]等是浏览代码的好方法,即使在多个文件中也是如此。 另外,使用标签文件的ctrl-n和ctrl-p完成是减less击键的好方法。

  3. 如果你正在编辑一个被封装的行,因为它比缓冲区宽,你可以使用gk和gj向上/向下移动。

  4. 在学习不良习惯之前,尽量把重点放在有效使用动作命令上。 比如使用'dt'或'd3w'而不是按xa。 基本上,任何时候你会发现自己反复提出同样的关键,可能会有更好/更快,更简洁的方式来完成同样的事情。

星号键*将search光标下的单词。

[ + Tab将带你到你的光标下的C函数的定义。 (并不总是工作。)

ZZ (作品像:wq

关于光标位置。 我发现总是停留在屏幕中间的光标很酷

 set scrolloff=9999 

我的一些最新补充到我的VIm大脑:

  • ^wi :通过分割窗口跳转到光标下的标签。
  • cib/ciB :分别改变当前括号()或大括号{}中的文本。
  • :set listchars=tab:>-,trail:_ list :显示与其他空间视觉上不同的制表符/尾随空格。 帮助Python编码。

:shell从Vim启动一个shell控制台。 比如你想在不退出Vim的情况下testing一个脚本。 当您完成shell控制台时,只需点击^ d ,然后回到Vim和您的编辑文件。

gv启动可视化模式并自动select您之前select的内容。

在vim中构build和debugging代码!

组态

不多,真的。 您需要在当前目录中的Makefile

编译

当你在vim中时,input:make来调用一个shell,编译你的程序。 输出滚动时不要担心; 完成后按[Enter]返回vim。

魔术

回到vim中,你可以使用以下命令:

  1. :cl列出错误,警告和其他消息。
  2. :cc在屏幕底部显示当前的错误/警告消息并跳转到代码中的违规行
  3. :cc n跳转到第n消息。
  4. :cn前进到下一条消息。
  5. :cp跳转到上一条消息。

还有更多; 如果您有兴趣,请在vim中键入:help :cc

vimcryption

vim -x filename.txt

您将被要求input密码,编辑并保存。 现在,无论何时您再次在vi中打开文件,都必须input密码才能查看。

这总是让我高兴

 :help 42 

^ P和^ N

完成前一个(^ P)或下一个(^ N)文本。

^ O和^我

转到上一个(^ O – “O”旧的位置)或下一个(^ I – “I”只是靠近“O”)。 当你执行search,编辑文件等,你可以浏览这些“跳转”向前和向后。

分数

按下ma (m-标记,a – 标记的名称)。 稍后返回到位置types`a

^r^w在命令模式下将光标粘贴到光标下。 使用grep或replace命令时非常有用

当光标位于引号,paren,括号或大括号上时,请按%以查找其匹配。

直到[人物]( t )。 适用于接受范围的任何命令。 我最喜欢的是ct; 或者ct) ,它删除所有的一切,直到后面的分号/closures圆括号,然后将你置于插入模式。

另外, Ggg是有用的(分别到底部和顶部)。

q <letter> – logging一个macros。

@ <相同字母> – 回放。

这些是迄今为止vim中最有用的命令,因为你可以让计算机为你做很多工作,甚至不需要编写程序或任何东西。

input一个行号后跟gg将带你gg一行。

我希望我早些时候知道基本的视觉模块的东西。 即使您不使用VIM,在VIM中打开一个文件只是为了某些块操作而节省大量时间。 我很确定我浪费了很多时间手动做这种事情。

例子我发现特别有用的时候,比如重构符号常量名称列表,

进入Visual Block模式(在Windows上Ctrl-Q代替Ctrl-V

移动光标以突出显示所需的块。

然后, I whatever text ,然后按Esc将文本插入每一行块前面。

使用A而不是I将文本插入每行上的块之后。

此外 – 简单地切换与~的视觉select的情况下可以是一个大的节省时间。

简单地删除列,当然也是。

^ y将复制光标上方的字符。

qx将开始录制击键。 你可以做任何编辑任务,Vim会记住它。 完成后再次点击q ,然后按@键重放击键。 这对于重复的编辑来说太好了,这些编辑太复杂了,不能写映射。 您可以使用x以外的字符来录制多个录音。

我不得不说,我的最爱之一是把帮助窗口放在一个新的标签:

 :tab help <help_topic> 

这在一个新标签中打开了一个帮助,就像有人喜欢vim标签一样,这是非常有用的。

使用标签打开多个文件:

 :tabe filepath 

在打开的文件之间导航

 gt and gT or :tabn and :tabp 

保存打开的会话,以便以后可以返回到打开的文件列表:

 :mksession session_file_name.vim 

打开一个创build的会话

 vim -S session_file_name.vim 

一次closures所有文件

 :qa 

编辑:

我最近学到的另一个命令:

 autocmd 

它允许你在一个事件上运行一个命令,例如你可以运行make命令,当你使用类似下面的方法保存文件时:

 :autocmd BufWritePost *.cpp :make 

:b [any portion of a buffer name]切换缓冲区。 所以如果你有两个缓冲区“somefile1.txt”和“someotherfile2.txt”,你可以简单的使用":b 2.t<enter>"切换到第二个":b 2.t<enter>" 。 它也支持选项卡完成,虽然它不是必需的。

说到tab完成,设置:set wildmode=full wildmenu也是非常有帮助的。 它可以完成命令模式的完整标签,以及使用它时所有可能匹配的非常有用的ncurses风格菜单。

CW

更改单词 – 删除光标下的单词,并将您置入插入模式以input新单词。 当然这可以和其他的移动键一起使用,所以你可以像c $一样来改变行的末尾。

f +字符

查找当前行上下一个字符的出现位置。 所以你可以做vft来select所有的文本直到当前行的下一个“t”。 这是另一个移动键,所以它也可以和其他命令一起使用。

选项卡式界面
除了拆分窗户,你也可以有标签窗口。 在转义模式下,input:tabnew。 你可以像这样打开多个标签。 要在选项卡之间导航,请inputtabn。 这将移到下一个选项卡。 要移至选项卡式窗口,请键入:tabn2以移动第二个选项卡等等。

要closures选项卡,请键入:tabc或:tabclose或者只是:closures。

如果你是在一个terminal模拟器(基本上terminal在GUI),那么你可以尝试做:set mouse = a。 完成之后,您可以用鼠标在编辑器内单击。 这也可以帮助你点击标签之间的导航,也可以通过点击右侧的closuresbutton来closures标签。

alignment你的代码 – 完整的文件
只需在退出模式下inputG = gg即可。

折叠你的代码
假设你有一个完成的function。 你想最小化(或折叠)这部分代码,这样你就可以释放一些空间并减less混乱。 只需select代码。 然后,input:fold。

这会将代码折叠起来。 如果你想扩展代码,只要去那里inputzo。 再次折叠,键入zc。