您希望早先知道的简单Vim命令

时间:2009-08-14 06:55:53

标签: vim

我一直在Vim学习新命令,但我确信每个人偶尔都会学到新东西。我刚刚了解到这一点:

zz,zt,zb - 将光标定位在屏幕的中间,顶部或底部

您希望在很久以前学过什么其他有用或优雅的命令?

45 个答案:

答案 0 :(得分:309)

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

答案 1 :(得分:193)

我学到的最新“哇”技巧是一种复杂的搜索和替换方法。在过去,我经常有一个非常复杂的正则表达式进行替换而且它没有用。有一种更好的方法:

: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

这里的“技巧”(想要更好的词)是你可以使用搜索来创建正则表达式的方式(并且'incsearch'在你输入字符时突出显示它)然后在替换中使用空模式:空模式默认为最后一个搜索模式。

示例:

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

相当于:

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

请参阅:

:help 'incsearch'
:help :substitute

答案 2 :(得分:152)

我为我的一个朋友创建了这个最常用命令的引用。希望人们能找到有用的东西:

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.

答案 3 :(得分:137)

gi 切换到插入模式,将光标放在以前的位置。

答案 4 :(得分:103)

:q!

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

答案 5 :(得分:54)

^ X-F 使用当前目录中的文件名完成。不再需要从终端复制/粘贴或进行痛苦的双重检查。

^ X-P 使用当前文件中的文字完成

:set scrollbind 强制一个缓冲区与另一个缓冲区一起滚动。例如将窗口分成两个垂直窗格。在每个文件中加载一个文件(可能是同一文件的不同版本)。每个都:set scrollbind。现在当您滚动一个时,两个窗格将一起滚动。非常适合比较文件。

答案 6 :(得分:46)

您可以使用一整套命令来更改括号/括号/引号/标记内的文本。避免必须找到组的开始和结束是非常有用的。请尝试ci(, ci{, ci<, ci", ci', ct,具体取决于您要更改的对象类型。 ca(, ca{, ...变体也会删除括号/引号。

易于记忆:改变括号中的陈述/更改括号内的陈述。

答案 7 :(得分:46)

  1. 永远不要逃避逃生。 See this answer to learn why。如上所述,ctrl-c是更好的选择。我强烈建议将大写锁定键映射为escape。

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

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

  4. 在学习不良习惯之前,请注意有效使用动作命令。比如使用'dt'或'd3w'而不是多次按x。基本上任何时候你发现自己反复使用相同的键,可能会有更好/更快/更简洁的方法来完成同样的事情。

答案 8 :(得分:44)

ZZ(类似于:wq

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

set scrolloff=9999

答案 9 :(得分:42)

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

[ + Tab 将带您进入光标下的C函数定义。 (虽然并不总是奏效。)

答案 10 :(得分:40)

我最近添加到我的VIm脑库中的一些内容:

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

答案 11 :(得分:35)

:shell 从Vim启动shell控制台。例如,您希望在不退出Vim的情况下测试脚本时很有用。完成shell控制台后,只需点击 ^ d ,然后返回Vim和您编辑的文件。

答案 12 :(得分:34)

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

答案 13 :(得分:31)

总是让我振作起来

:help 42

答案 14 :(得分:29)

vimcryption

vim -x filename.txt

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

答案 15 :(得分:28)

从vim中构建和调试代码!

配置

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

编译

当你在vim中时,输入 :make 来调用shell,构建你的程序。输出滚动时不要担心;完成后只需按[Enter]即可返回vim。

魔术

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

  1. :cl 会列出错误,警告和其他消息。
  2. :cc 会在屏幕底部显示当前错误/警告消息,会跳转到代码中的违规行
  3. :cc n 跳转到n th 消息。
  4. :cn 前进到下一条消息。
  5. :cp 会跳转到上一条消息。
  6. 还有更多;如果您有兴趣,请在vim中输入 :help :cc

答案 16 :(得分:25)

^ P和^ N

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

^ O和^ I

转到上一个(^ O - “O”表示旧位置)或下一个(^ I - “I”接近“O”)。 当您执行搜索,编辑文件等时,您可以向前和向后浏览这些“跳转”。

<强>标记

ma (m-mark,a - 标记名称)。稍后返回位置类型`a

答案 17 :(得分:24)

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

答案 18 :(得分:21)

直到[character](t)。对于接受范围的任何命令都很有用。我最喜欢的是ct;ct),它会删除所有内容,直到后面的分号/右括号,然后将您置于插入模式。

此外,Ggg也很有用(分别转到底部和顶部)。

答案 19 :(得分:20)

^r^w将光标下的单词粘贴到命令模式中。 使用grep或替换命令时非常有用

答案 20 :(得分:17)

键入一个后跟gg的行号会转到该行。

答案 21 :(得分:17)

我希望我早些时候知道基本的视觉块模式。即使您不将VIM用于其他任何事情,也可以节省大量时间来在VIM中打开文件,仅用于某些块操作。我很确定我浪费了大量时间手动做这件事。

我发现的例子特别有用,比如说,一致地重构符号常量名称列表:

在Windows上输入Visual Block模式( Ctrl-Q 而不是 Ctrl-V

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

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

使用A代替I在每行上阻止插入文字。

此外 - 只需使用~切换视觉选择的大小,就可以节省大量时间。

当然,只需删除列,d

答案 22 :(得分:15)

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

答案 23 :(得分:14)

Q&LT;字母GT; - 记录一个宏。

@&LT;相同字母&GT; - 播放它。

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

答案 24 :(得分:12)

使用标签打开多个文件:

:tabe filepath

在打开的文件之间导航

gt and gT or :tabn and :tabp

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

:mksession session_file_name.vim

打开已创建的会话

vim -S session_file_name.vim

一次关闭所有文件

:qa

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

autocmd

它允许您对事件运行命令,以便您可以使用以下内容保存文件时运行命令make:

:autocmd BufWritePost *.cpp :make

答案 25 :(得分:12)

qx 将开始录制击键。你可以做任何编辑任务,Vim会记住它。完成后再次点击 q ,然后按 @x 重播您的按键。这对于重复编辑非常有用,这些编辑过于复杂而无法编写映射。您可以使用 x 以外的字符进行多次录制。

答案 26 :(得分:11)

我不得不说我最喜欢的一个是将帮助窗口放在一个新选项卡中:

:tab help <help_topic>

这会在新标签页面中显示帮助,而且正如喜欢vim标签的人一样,这非常有用。

答案 27 :(得分:9)

:b [any portion of a buffer name]来切换缓冲区。因此,如果你有两个缓冲区“somefile1.txt”和“someotherfile2.txt”,你可以只用":b 2.t<enter>"切换到第二个缓冲区。它还支持制表符完成,但不是必需的。

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

答案 28 :(得分:8)

<强>:%S,/搜索,/替换,

您可以使用除 / «之外的其他字符来分隔替换模式。这样您就不必转义文件路径的斜杠。

答案 29 :(得分:7)

<强> CW

更改单词 - 删除光标下的单词并将您置于插入模式以键入新单词。当然,这适用于其他移动键,因此您可以执行 c $ 之类的操作来更改为行尾。

f +字符

在当前行上查找下一个字符。因此,您可以执行 vft 选择当前行中下一个“t”的所有文本。它是另一个移动键,因此它也适用于其他命令。

答案 30 :(得分:7)

:x #(Save and Quit a File)

相同:wq或ZZ

答案 31 :(得分:7)

标签式界面
除了拆分Windows,您还可以使用选项卡式Windows。在转义模式下,键入:tabnew。您可以像这样打开多个标签。要在选项卡之间导航,请键入tabn。这将移至下一个标签。要移至选项卡式窗口,请键入:tabn2以移动第二个选项卡,依此类推。

要关闭标签,请键入:tabc或:tabclose或just:close。

如果你在终端模拟器(基本上是GUI中的终端),那么你可以尝试做:set mouse = a。完成后,您可以使用鼠标在编辑器内单击。这也可以帮助您通过单击在标签之间导航,也可以通过单击右侧的关闭按钮来关闭标签。

对齐您的代码 - 完整档案
只需在转义模式中键入G = gg。

折叠您的代码
假设您有一个已完成的功能。您希望最小化(或折叠)该部分代码,以便释放一些空间并减少混乱。只需选择代码即可。然后,输入:fold。

这将折叠代码。如果要扩展代码,只需转到那里,然后键入zo。要再次折叠,请键入zc。

答案 32 :(得分:6)

我很惊讶没有人提到Vim的窗口支持。 CTRL-W s几乎每次打开vim时都会使用{<1}}。

答案 33 :(得分:5)

我经常为编辑任务创建函数,并将它们存储在我的.vimrc中,以便我可以再次找到它们。例如,读取已转换为单行的.Net callstack:

function! FixCallStacks()
:%s;\[NLN\];\r;g
:%s;\[TAB\];\t;g
endfunction

答案 34 :(得分:5)

:墙和墙:关闭所有分屏

答案 35 :(得分:5)

将xcramps的建议更进一步,我不能告诉你我使用了多少次:

  

:%!sort

对文件中的项目列表进行排序。

<强>详细信息:

  

: 范围 ! 命令

将在指定的行范围内执行shell命令。范围通常指定为 start , end

  

示例:
  1,3指定前3行   'a,'b选择书签ab之间的文字   .,$选择整个文档(. =第一行; $ =最后一行)
  %.,$的快捷方式,也可以整理整个文档。

随意混合搭配数字,书签,.$

答案 36 :(得分:4)

ma
move cursor down
:'a,.!program

这将在您将标记(ma)设置为当前行(。)的位置之间的所有文本,通过程序运行它,并用结果替换标记区域的内容。您甚至可以通过创建一个空行,然后将光标放在该行上来使用它来查看目录的内容(例如),

:.!ls

哦,你可以为a-z(即ma)和

设置这样的标记
'a

会将您跳到标记为“a。”的位置。

/向前搜索,和?重复向后搜索而无需重新提供搜索模式。

Groovy的东西。 vi被低估了。一旦掌握了它,就不会想要使用IDE提供的编辑器。

答案 37 :(得分:4)

我在浏览vim帮助时发现了这个:

:help index

这会将您带到一个(可搜索的!)页面,其中包含所有模式的所有命令。

因此,如果您知道您尝试记住/学习的命令以某个击键开始或涉及某个击键,您可以搜索并翻转所有可能性。或者您可以浏览您感兴趣的模式,以查看/学习编辑的可能性。

我无法计算我完成:help CTRL-R或其他任何事情的次数,并且只获得了第一件事,这当然不是你想要的。这比:helpgrep IMO要好得多。

修改

进入.vimrc:

nnoremap <silent> <F1> :help normal-index<CR>
inoremap <silent> <F1> <C-O>:help insert-index<CR>

:help仍会让您进入默认的F1页面。

答案 38 :(得分:4)

评论一系列行:

  1. 首先在范围的开头设置书签: ma

  2. 转到范围中的最后一行

  3. 命令是 :'a,.s/^/# / 假设#是你的评论字符。

答案 39 :(得分:3)

:Te[xplore]

Tab&amp;探索(在生成浏览器窗口之前做一个tabnew)

答案 40 :(得分:3)

在bash中使用命令行上的vim-binding:

    set -o vi

在其他使用readline的程序中,点击control-alt-j从emacs切换到vim绑定。

答案 41 :(得分:2)

在我们的软件商店中,需要对变量声明进行排序。在我们使用的语言中,多个变量可以出现在同一行上。

new var1,var2,var3,etc

通过视觉尝试对每个变量进行排序是一种真正的痛苦。 Vim中的块突出显示和排序命令是我的朋友:

  1. 将光标移动到要排序的第一个变量。
  2. 发出v命令进入可视模式。
  3. 将光标移动到最后一个变量的末尾,在我的情况下,我输入$以转到行尾。)
  4. 执行!sort命令告诉Vim对突出显示的文本进行排序。
  5. 仅当它们在底层系统上存在“排序”命令时才会起作用。

答案 42 :(得分:1)

我知道这不完全是vim。但我发现cscope集成非常好,并且在攻击Linux内核时它对我有很大帮助。

Ctrl- \ g来达到函数的定义 按Ctrl- \ s查找函数/宏/变量的所有用法。

答案 43 :(得分:0)

设置确认允许您使用:q 优雅地退出vim。您不需要使用 ZZ 或其他盲目保存或放弃所有更改的严厉机制。

答案 44 :(得分:-2)

对于强迫性的vim配置,请查看https://github.com/jmcantrell/dotfiles-vim