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


Simple Vim commands you wish you'd known earlier

我一直在VIM中学习新的命令,但我确信每个人都会偶尔学习新的命令。我最近才知道:

ZZ、ZT、ZB-屏幕中间、顶部或底部的位置光标

你希望多年前学会的其他有用或优雅的命令是什么?


我真的希望我知道你可以使用ctrlc而不是esc来关闭插入模式。这对我来说真的是生产力的提升。


我学到的最新的"哇"技巧是一种进行复杂搜索和替换的方法。在过去的很多时候,我有一个非常复杂的regexp来做替换,但它不起作用。有更好的方法:

1
2
3
: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

这里的"诀窍"(为了得到更好的单词)是使用搜索创建regexp(并且"incsearch"在输入字符时突出显示它),然后在替换中使用空模式:空模式默认为最后一个搜索模式。

例子:

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

相当于:

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

见:

1
2
:help 'incsearch'
:help :substitute


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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切换到插入模式,将光标放置在与以前相同的位置。


1
:q!

我真希望在第一次使用vi之前就知道这一点


^ x-f使用当前目录中的文件名完成。不再从终端复制/粘贴或重复检查。

^ x-p完成在当前文件中使用单词

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


  • 永远不要按Escape键。看看这个答案来了解原因。如上所述,ctrl-c是更好的选择。我强烈建议映射您的Caps Lock键以进行转义。

  • 如果您正在编辑与ctags兼容的语言,使用标记文件和:ta、ctrl-]等是导航代码的好方法,甚至可以跨多个文件。另外,使用标记文件完成ctrl-n和ctrl-p是减少击键的一个很好的方法。

  • 如果你正在编辑一条因为比缓冲区宽而被包装的线,你可以使用gk和gj上下移动。

  • 在你学习坏习惯之前,试着集中精力有效地使用动作指令。像使用"dt"或"d3w"而不是多次按x。基本上,只要你发现自己反复地按同一个键,就可能有更好/更快/更简洁的方法来完成相同的事情。


  • 您可以使用一整套命令来更改括号/圆括号/引号/标记内的文本。避免找到团队的开始和结束是非常有用的。根据您要更改的对象类型,尝试ci(, ci{, ci<, ci", ci', ctca(, ca{, ...变体也删除了括号/引号。

    容易记住:在加括号的语句内更改/更改加括号的语句。


    ZZ(与:wq类似)

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

    1
    set scrolloff=9999


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

    [+t将带您进入光标下的C函数定义。(但并不总是有效。)


    我最新加入的Vim智能商店:

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


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


    GV启动视觉模式并自动选择您以前选择的内容。


    这总是让我高兴

    1
    :help 42


    虚拟化

    vim-x文件名.txt

    系统将要求您输入密码、编辑和保存。现在,每当您再次在vi中打开文件时,您必须输入密码才能查看。


    在vim中构建和调试代码!配置

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

    编译

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

    魔力

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

  • :cl列出了错误、警告和其他消息。
  • :cc在屏幕底部显示当前的错误/警告消息,并跳转到代码中的违规行。
  • :cc n跳到n第条消息。
  • :cn前进到下一条消息。
  • :cp跳到上一条消息。
  • 还有更多;如果您感兴趣,请在vim中键入:help :cc


    p和^ n

    完成上一个(^p)或下一个(^n)文本。

    ^和^ i

    转到上一个位置(^o-"o"代表旧位置)或下一个位置(^i-"i"靠近"o")。当您执行搜索、编辑文件等操作时,您可以前后浏览这些"跳转"。

    标志

    按m a(m-mark,a-mark的名称)。稍后返回到位置类型'A


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


    直到[字符](t)。适用于任何接受范围的命令。我最喜欢的是ct;ct),它删除了尾随分号/右括号之前的所有内容,然后将您置于插入模式。

    另外,Ggg也很有用(分别从下到上)。


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


    我希望我早点知道基本的视觉块模式。即使您不将vim用于任何其他用途,在vim中打开一个文件只用于某些块操作也可以节省大量时间。我很肯定我浪费了很多时间手工做这种事情。

    我发现的示例特别有用,例如,当一致地重构符号常量名列表时:

    进入可视块模式(CTRL Q for Me on Windows而不是CTRL V)

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

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

    使用A而不是I在每行的块后面插入文本。

    此外,使用~简单地切换视觉选择的情况可以节省大量时间。

    当然,使用d也可以简单地删除列。


    输入一个行号,然后输入gg,您将进入该行。


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


    Q-记录宏。

    @-回放。

    这些是到目前为止VIM中最有用的命令,因为您可以让计算机为您做大量的工作,甚至不必编写程序或任何东西。


    使用选项卡打开多个文件:

    1
    :tabe filepath

    在打开的文件之间导航

    1
    gt and gT or :tabn and :tabp

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

    1
    :mksession session_file_name.vim

    打开创建的会话

    1
    vim -S session_file_name.vim

    一次关闭所有文件

    1
    :qa

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

    1
    autocmd

    它允许您对事件运行命令,以便您可以在保存文件时运行命令make,方法如下:

    1
    :autocmd BufWritePost *.cpp :make

    QX将开始记录击键。你几乎可以做任何编辑任务,Vim会记住它。完成后再按q键,然后按@x键重放击键。这对于重复编辑非常有用,因为重复编辑太复杂,无法为其编写映射。您可以使用X以外的字符录制许多录音。


    我不得不说,我最喜欢的方法之一是将"帮助"窗口置于新的选项卡中:

    1
    :tab help <help_topic>

    这在一个新的标签中打开了帮助,并且,作为一个喜欢vim标签的人,这是非常有用的。


    :b [any portion of a buffer name]切换缓冲区。因此,如果您有两个缓冲区"somefile1.txt"和"someotherfile2.txt",则只需使用EDOCX1[1]即可切换到第二个缓冲区。它还支持选项卡完成,尽管这不是必需的。

    说到制表完成,设置:set wildmode=full wildmenu也很有帮助。它为命令模式启用了完整的制表符完成功能,以及在使用时所有可能匹配的非常有用的ncurses样式菜单。


    :%s,/搜索,/替换,

    您可以使用其他字符而不是??分离替代模式。这样就不必逃避文件路径的斜线。


    1
    :x #(Save and Quit a File)

    同:WQ或ZZ


    连续波

    更改单词-删除光标下的单词,并将您置于插入模式以键入新的单词。当然,这与其他的移动键一起工作,所以你可以做一些像C$这样的事情来改变行尾。

    F+字符

    查找字符在当前行上的下一个匹配项。因此,您可以使用vft来选择当前行上下一个"t"之前的所有文本。这是另一个移动键,所以它也可以与其他命令一起使用。


    标签介面除了拆分窗口外,还可以有选项卡式窗口。在Escape模式中,键入:tabNew。您可以像这样打开多个选项卡。要在选项卡之间导航,请键入tabn。这将移动到下一个选项卡。要移动到选项卡式窗口,请键入:tabn2以移动第二个选项卡,依此类推。

    要关闭选项卡,请键入:tabc或:tab close或just:close。

    如果您在终端仿真器中(基本上是GUI中的终端),那么您可以尝试这样做:设置鼠标=A。完成后,您可以用鼠标在编辑器中单击。这还可以帮助您通过单击在选项卡之间导航,也可以通过单击右侧的"关闭"按钮来关闭。

    对齐代码-完整文件只需在退出模式中键入g=gg。

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

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


    我很惊讶没人提到维姆的窗口支持。我几乎每次打开VIM时都会用到CTRL-W s


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

    1
    2
    3
    4
    5
    function! FixCallStacks()
    :%s;\[NLN\];
    ;g
    :%s;\[TAB\];\t;g
    endfunction


    更进一步,我不能告诉你我用过多少次了:

    :%!sort

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

    细节:

    :range!command

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

    Examples:
    1,3 specifies the first 3 lines
    'a,'b selects the text between bookmarks a and b
    .,$ selects the entire document (. = first line; $ = last line)
    % is a shortcut for .,$ and also selets the entire document.

    可以随意混合和匹配数字、书签、.$


    :qall和:wqall关闭所有拆分屏幕


    注释一系列行:

  • 首先在范围开始处设置书签:ma

  • 转到范围内的最后一行

  • 命令是
    :'a,.s/^/# /
    假设是您的评论角色。

  • 1
    2
    3
    ma
    move cursor down
    :'a,.!program

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

    1
    :.!ls

    哦,你可以为A-Z(即MA)设置这样的标记,还有

    1
    'a

    将跳转到标记为"A"的位置。

    /向前搜索,然后?向后重复搜索,而不必重新提供搜索模式。

    好东西。vi被严重低估。一旦你掌握了它的窍门,你就永远不会想使用由IDE提供的编辑器。


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

    1
    :help index

    这将带您进入单曲(可搜索!)页面上显示所有模式的所有命令。

    因此,如果您知道您试图记住/学习的命令是从某个按键开始的,或者涉及到某个按键,那么您可以搜索该命令并浏览所有可能的方法。或者你只需浏览你感兴趣的模式就可以看到/学习编辑的可能性。

    我不知道我做了多少次,只做了多少次,得到的只是第一件事,当然不是你想要的那件。这比:帮助我。

    编辑

    然后进入.vimrc:

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

    :help仍然可以进入默认的f1页面。


    1
    :Te[xplore]

    选项卡&explore(在生成浏览器窗口之前是否新建选项卡)


    在bash中的命令行上使用vim绑定:

    1
        set -o vi

    另一方面,使用程序读取行,点击control-alt-j从emacs切换到vim绑定。


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

    1
    new var1,var2,var3,etc

    在视觉上尝试对每一个变量进行排序是非常痛苦的。vim中的block highlighting和sort命令是我的朋友:

  • 将光标移动到要排序的第一个变量。
  • 发出v命令进入视觉模式。
  • 将光标移动到要排序的最后一个变量的末尾,在我的示例中,我输入$以转到行的末尾)。
  • 执行!sort命令告诉vim对突出显示的文本进行排序。
  • 只有在底层系统上存在"sort"命令时,这才有效。


    我知道这不完全是维姆。但是我发现CScope集成非常好,它在入侵Linux内核时帮助了我很多。

    ctrl-g以达到函数的定义ctrl-s查找函数/宏/变量的所有用法。


    set confirm允许您用:q优雅地退出vim。您不需要使用zz或其他笨重的机制来盲目保存或丢弃所有更改。


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