简单的Vim命令,你希望你'd早知道

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

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

还有什么其他有用或优雅的命令是你希望很久以前就学会的?

122309 次浏览

ZZ(类似于:wq)

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

set scrolloff=9999

^P和^N

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

^O和^I

转到先前的(^O - "O"旧)位置或到下一个(^I - "I"就在"O";)。

当您执行搜索、编辑文件等时,您可以通过这些“跳转”进行导航。向前和向后。

标志着

(m- mark, a - name of mark)。稍后要返回到该位置,键入“一个

^即xf使用当前目录中的文件名完成。不再从终端复制/粘贴或痛苦的双重检查。

^ xp使用当前文件中的单词完成

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

:壳从Vim启动一个shell控制台。例如,当您想在不退出Vim的情况下测试一个脚本时,它很有用。当你完成shell控制台时,只需点击^维,然后你回到Vim和你编辑的文件。

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

ma
move cursor down
:'a,.!program

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

:.!ls

哦,你可以像这样为a-z(即ma)设置标记,以及

'a

会跳到你标记为"a "的位置

/向前搜索,和?重复向后搜索,而不需要补充搜索模式。

Groovy的东西。Vi被严重低估了。一旦你掌握了它的窍门,你就再也不想使用IDE提供的编辑器了。

我为我的一个朋友创建了我最常用的命令的参考:

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.

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

  1. 永远不要按Esc请看这个答案来了解为什么。如上所述,Ctrl + C是更好的选择。我强烈建议映射您的Caps Lock键来转义。

  2. 如果你正在编辑一个Ctags兼容语言,使用标签文件和:taCtrl + ]等是一个很好的方法来浏览代码,甚至跨多个文件。此外,Ctrl + NCtrl + P使用标签文件完成是减少击键的好方法。

  3. 如果您正在编辑一行,因为它比缓冲区宽而被自动换行,您可以使用gk和gj上下移动。

  4. 在你养成坏习惯之前,试着专注于有效地使用动作命令。比如使用'dt'或'd3w'而不是多次按x。基本上,任何时候你发现自己重复按同一个键,都可能有更好/更快/更简洁的方式来完成同样的事情。

^r^w在命令模式中将单词粘贴到光标下。

它在使用grep或replace命令时非常有用。

我经常创建用于编辑任务的函数,并将它们存储在.vimrc文件中,这样我就可以再次找到它们。

例如,读取已转换为单行的.NET调用栈:

function! FixCallStacks()
:%s;\[NLN\];\r;g
:%s;\[TAB\];\t;g
endfunction
:x #(Save and Quit a File)

与:wq或ZZ相同

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

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

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

+选项卡将带您到光标下的C函数的定义。(不过,这种方法并不总是有效。)

vimcryption

Vim -x filename.txt

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

qx、将开始记录击键。你几乎可以做任何编辑任务,Vim都记得。当你完成时再次点击,并按@x来回放你的击键。这对于过于复杂而无法编写映射的重复编辑非常有用。你可以使用x以外的字符进行多次记录。

全球之声启动可视模式并自动选择您先前选择的内容。

组确认允许你用:问优雅地退出Vim。你不需要使用ZZ或其他盲目保存或丢弃所有更改的笨拙机制。

:b [any portion of a buffer name]来切换缓冲区。所以如果你有两个缓冲区," someotherfile1 .txt"和"someotherfile2.txt",你可以简单地用":b 2.t<enter>"切换到第二个缓冲区。它还支持制表符补全,尽管这不是必需的。

说到制表符自动完成,设置:set wildmode=full wildmenu也是非常有用的。它为命令模式提供了完全的选项卡补全功能,在使用它时还提供了非常有用的ncurses风格菜单,其中包含所有可能的匹配。

注释掉一系列行:

  1. ma < / p > < / >

  2. 走射程内的最后一行

  3. 命令为:

    :'a,.s/^/# /
    

    假设#是你的注释字符

您可以使用一整套命令来更改括号/圆括号/引号/标记内的文本。这对于避免寻找群组的起点和终点非常有用。尝试ci(, ci{, ci<, ci", ci', ct,这取决于你想改变什么类型的对象。而ca(, ca{, ...变量也会删除括号/引号。

容易记住:change inside a bracasted statement /更改一个括号内语句。

进一步使用xcramps的建议,我无法告诉你我使用了多少次:

:%!sort

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

细节:

:范围!命令

将在指定的行范围上执行shell命令。范围通常指定为开始,结束

< p >例子:< br > 1,3指定前3行
'a,'b选择书签ab
之间的文本 .,$选择整个文档(. =第一行;$ = last line)
%.,$的快捷方式,也会选择整个文档

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

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

我知道这并不完全是Vim。但我发现cscope集成真的很好,它帮助了我很多黑客Linux内核。

  • Ctrl + \g达到函数定义

  • Ctrl + \s查找函数、宏或变量的所有用法。

我最近学到的令人惊叹的技巧是一种进行复杂搜索和替换的方法。在过去,我经常有一个非常复杂的regexp来进行替换,但它不起作用。有一个更好的方法:

: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'突出显示它),然后在替换中使用空模式:空模式默认为最后一个搜索模式。

例子:

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

等价于:

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

看到的:

:help 'incsearch'
:help :substitute

我希望我能早点知道基本的视觉块模式。即使你不使用Vim做其他的事情,在Vim中打开一个文件仅仅是为了一些块操作也可以节省大量的时间。我很确定我在手动做这种事情上浪费了大量的时间。

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

进入可视化块模式(在Windows上为我的Ctrl + 而不是Ctrl + V)

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

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

使用A代替I将文本插入到每行的块之后。

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

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

:qall:wqall关闭所有的分割屏幕。

q< letter>-记录宏。

而且

@< same-letter>-回放。

这些是到目前为止在Vim中最有用的命令,因为你可以让计算机为你做很多工作,你甚至不需要写一个程序或任何东西。

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

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

连续波

更改单词-删除光标下的单词,并将您置于插入模式下键入一个新的单词。当然,这也适用于其他移动键,所以你可以做加元这样的事情来改变到行尾。

F +字符

查找当前行上字符的下一个出现位置。因此,您可以执行音频电报来选择当前行上下一个“t”之前的所有文本。这是另一个移动键,所以它也适用于其他命令。

这句话总是让我高兴起来:

:help 42
:q!

I wish I knew that before I started vi for the first time.

从Vim中构建和调试代码!

配置

没什么,真的。当前目录中需要Makefile

要编译

在Vim中,键入:make来调用shell并构建程序。当输出滚动时,不要担心;当它完成返回Vim时,只需按输入

神奇的

在Vim中,您可以使用以下命令:

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

还有更多;如果你感兴趣,在Vim中键入:help :cc

输入行号后跟gg将带您到该行。

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

new var1,var2,var3,etc

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

  1. 将光标移动到要排序的第一个变量。
  2. 发出v命令进入可视模式。
  3. 将光标移动到最后一个要排序的变量的末尾(在我的例子中,我输入$到行末尾)。
  4. 执行!sort命令告诉Vim对突出显示的文本进行排序。

只有在底层系统上存在'sort'命令时,这才会起作用。

胃肠道切换到插入模式,将光标放置在之前的相同位置。

:Te[xplore]

选项卡,探索(在生成浏览器窗口之前执行tabnew)

对于强制Vim配置,请查看https://github.com/jmcantrell/dotfiles-vim

我不得不说,我最喜欢的一个方法是把帮助窗口放在一个新标签中:

:tab help <help_topic>

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

我很惊讶没有人提到Vim的窗口支持。Ctrl + W年代是我几乎每次打开Vim都会用到的东西。

在Bash的命令行上使用Vim绑定:

    set -o vi

在其他使用readline的程序中,点击Ctrl + Alt + J从Emacs切换到Vim绑定。

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

:help index

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

所以,如果你知道你要记住/学习的命令是从某个按键开始或涉及到某个按键,你可以搜索并浏览所有的可能性。或者你可以浏览你感兴趣的模式,看看/学习编辑的可能性。

我数不清有多少次我只做了:help Ctrl + R或任何东西,只得到了第一个东西,这当然不是你想要的。在我看来,这比:helpgrep好多了。

然后进入。vimrc:

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

:help仍然会让你到达默认的F1页面。

选项卡式界面

除了分开的窗口,您还可以有选项卡窗口。在转义模式中,键入tabnew。你可以像这样打开多个标签。要在选项卡之间导航,输入tabn。这将移动到下一个选项卡。要移动到一个选项卡窗口,输入tabn2来移动第二个选项卡,以此类推。

要关闭一个选项卡,输入tabctabcloseclose即可。

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

对齐您的代码-完整的文件

只需在转义模式中键入G=gg

折叠代码

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

这将折叠代码。如果你想扩展代码,只需到那里,并键入zo。要再次折叠,输入zc

使用选项卡打开多个文件

:tabe filepath

在打开的文件之间导航

gt and gT or :tabn and :tabp

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

:mksession session_file_name.vim

打开已创建的会话

vim -S session_file_name.vim

立即关闭所有文件

:qa

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

autocmd

它允许你在一个事件上运行命令,所以你可以在保存文件时使用如下命令:

:autocmd BufWritePost *.cpp :make

: % s /搜索/替换,

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