您希望早已知道的简单的Vim命令[关闭]


378

我一直在学习Vim中的新命令,但是我确信每个人都会不时地学到一些新东西。我最近才了解到这一点:

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

您希望在很久以前就学到其他有用或优雅的命令吗?


46
从技术上讲,zz,zt,zb会将屏幕定位在光标位于中间/顶部/底部的位置。使用M,H或L 将光标定位在中间/顶部/底部。这两组命令都非常有用!
彼得

1
此后几个月或一年前的这篇文章每天都对我有帮助。dap是我每小时用来多次移动段落的东西,这要归功于这篇文章。
Funkodebat

33
我从未从标记为非建设性的页面上挑选过很多技巧:)谢谢。
Tasos Bitsios

Answers:


315

我真的希望我知道您可以使用CtrlC而不是Esc退出插入模式。对我而言,这确实是生产力的提升。


93
我将Caps-Lock重新映射为Esc。这比普通的Esc和Ctrl-C都更容易
Kasper

114
哇靠。15年的vi,我从不知道...
克里斯·K

31
另一个流行的是将“ jj”用于ESC。到目前为止,我喜欢这种方法。:地图!jj <ESC>
claytron

27
您也可以使用CTRL-[(我喜欢这是因为它既是小指,又是两只手的一点旋转)。
杰森·唐

42
使用'jk'作为@claytron的变体。如果您在不知不觉中已经处于INSERT模式,则jk会将您留在原处,因此您可以在任何时候击中它(来源:别人...不是我的主意)。
凯尔2012年

197

我了解到的最新“哇”技巧是一种进行复杂的搜索和替换的方法。在过去,我经常使用非常复杂的正则表达式来进行替换,但这种方法不起作用。有一个更好的方法:

: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

1
哇...我一直在寻找这样的东西
figurassa

1
是的,我希望我早点知道。但是话又说回来,这就是我所说的关于vim的新知识。
罗伯特·马赛奥利

26
对于真正喜欢此方法的人,请尝试按一下<Ctrl-R>/以插入最后一个搜索查询。(请参阅参考资料:help i_CTRL-R)对于类似于上面的内容确实很有用,但是您希望捕获部分搜索结果。(这样的:%s:/\\([fF]rank\\) and mary/marie and \1/g
idbrii

4
:%s//...也可以使用*(光标下的搜索词)。名为visual-star-search的插件扩展了的功能,*以匹配视觉选择的整个文本,从而使搜索和替换所选文本变得容易,例如v3e(视觉上选择3个单词)*(搜索)和:%s//replacement/g(将所有出现的位置替换为“替代”)。我经常使用它,以致于有一个全局替换命令的映射::nmap <Leader>s :%s///g<left><left>
Patrick Oscity

1
@idbrii,因为人们阅读的可能是Vim新手(我),%s:应该是:%s,对于我的系统,我需要的\(\)不是\\(\\)
Charlie Gorichanaz

155

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

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.

您列出“〜X”以转到名称为X的标记。这对我不起作用-而是我使用“'X”(单引号)。

哇。你绝对正确 当我输入指南时,我想我的眼睛只看到波浪线并在后back上蒙上了一层光泽。我将进行相应的更新。感谢您的注意。
布赖恩·纽曼

5
这个列表不错,但是我真的想知道你是怎么画这张桌子的?与VIM?哪个插件?我目前正在寻找一个。
肯特2010年

6
我使用了VIM,但没有插件。然而; 使用选择块功能使其相对容易。很高兴您发现该列表有用!〜brian
brian newman 2010年

11
Ctrl-Q用于块选择是mswin.vim的一种特殊功能,它允许CTRL-V进行粘贴。大多数vim用户会认为这很有害,并禁用mswin.vim。“ + P或Ctrl-R +并不难键入以插入剪贴板内容
Benoit

144

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


29
当我发现g;现在令我感动的时候,我感到非常高兴:-)
Patrick Oscity 2013年

@longdeqidao一点也不。它返回到最后一个插入点。因此,您可以滚动浏览您的内心内容,它将把您拉回到上次插入的位置。
网络奥利维拉2015年

9
仅供参考,g;(上面提到的@PatrickOscity)将光标置于进行编辑的位置。您可以多次使用它来追溯历史。在这里指出这一点是因为我的vim帮助出于某种奇怪的原因没有提及这一点。
PonyEars,2015年

13
Vim的直觉力永远不会打动我。由于@PonyEars提到过,g;我尝试过将其g,与“对立” 相望,所以我们可以往回走!
Cyber​​ Oliveira 2015年

a更短。:)但是gi确实很直观,g通常是相反的操作。
Erwin Rooijakkers 2016年

105
:q!

我希望我在第一次启动vi之前就知道这一点。


23
作为emacs家伙,这是我读过的最有趣的评论。不确定您的意思是。你今天让我开心。
pjammer 2012年

29
我记得同一天第一次尝试vim和emacs,却不知道如何退出。我心想,这些人到底是怎么了!?
PhysicsMichael

13
+1。第一次启动vim时,默认消息应为“ write:q to quit”。我会节省大量的时间洛尔
何塞·拉蒙

2
@JoséRamón但它确实表明它在默认情况下在屏幕上,如果你输入的vim无需打开文件。这是最近添加的吗?我可以清楚地记得几年前尝试过vim,而且它已经存在了。它还告诉您使用:q!是否尝试退出而不保存缓冲区。
mechalynx 2014年

5
@ivy_lynx是的,您可能是正确的,但是仅当您打开没有文件的vim时。通常,第一次打开vim是因为您需要在Unix中编辑配置文件,因此您编写“ $ vim文件”,而找不到出路。还是我是唯一的一个?
何塞·拉蒙

56

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

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

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


启用滚动绑定后如何禁用它?
09年

2
jinxed_coder:set noscb将其关闭并用于:set scb将其打开(不是:scrollbind)。:h scrollbind
jmdeldin

哎呀 更正了':set scrollbind'的问题。
布赖恩·阿格纽

7
^ XP优先选择文件中的前一个单词,^ XN优先选择文件中的下一个单词。
u0b34a0f6ae

您也可以通过打开file1并运行:diffsplit file2或仅以vim来启动diff文件vim -d file1 file2。Vim自动滚动绑定这两个文件。
Brian McCutchon 2014年

51

您可以使用整套命令来更改方括号/括号/引号/标记内的文本。避免必须找到组的开始和结束非常有用。尝试ci(, ci{, ci<, ci", ci', ct根据要更改的对象类型进行选择。并且ca(, ca{, ...变体也会删除方括号/引号。

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


16
这不仅是为了c。您可以d通过删除来进行此操作(例如di(或da(),y拉动,v选择等
。– Nathan Fellman

你好!我想知道那里正在使用的文档:help吗?我在任何地方都找不到。> _ <
Matej

1
@Peter我之前已经检查过这些内容,但是找不到提及“内部+分隔符”行为的信息。原来是:help motion.txt!谢谢!
2012年

2
这是我首先切换到vi的唯一原因:)
Justin L.

1
如果您正在编辑HTML或XML,则可以使用它cit来更改当前标记的内容。例如,在中<span>Some text</span>,如果光标位于“ m”上,则可以dit获取<span></span>
乔纳森·波特

47
  1. Esc永远不要按。查看此答案以了解原因。如上所述,Ctrl+ C是更好的选择。我强烈建议您映射Caps Lock密钥以进行转义。

  2. 如果您要编辑与Ctags兼容的语言,则使用标签文件和:taCtrl+ ]等是浏览代码的好方法,即使跨多个文件也是如此。另外,使用标记文件的Ctrl+ NCtrl+ P完成是减少击键的好方法。

  3. 如果要编辑的行比缓冲区宽,则换行时,可以使用gk和gj上下移动。

  4. 在学习不良习惯之前,尝试着重于有效使用运动命令。诸如使用'dt'或'd3w'之类的事情而不是按x多次。基本上,每当您发现自己反复按相同的键时,可能会有更好/更快/更简洁的方法来完成同一件事。


11
不使用逃逸?那是异端。无论工作上班还是下班,Escape都是您最好的朋友。
xcramps

28
如果是这么好的朋友,为什么在键盘上这么远?
安东尼

因为99%的人从不使用它。
Stefano Borini,2009年

5
键盘上的Escape与其他键分开了几英寸。你不能错过。
布赖恩·卡珀

15
#3很棒!仍在学习新事物……
brian newman

45

星号键*将会在光标下方搜索单词。

[+ Tab将带您进入光标下方的C函数的定义。(不过,它并不总是有效。)


1
如果您正在使用* nix来学习如何生成“标签”文件,请尝试使用“ man ctags”,该文件告诉vim如何找到除C以外的多种语言的任何函数或变量的定义。使用ctrl +]查找定义光标下的令牌,或使用:tag tokenToFind查找它知道的任何令牌。您甚至可以使用“ vim -t tokenToFind”来启动vim,以打开相应的文件并将光标定位在您需要编辑的函数上。
亚当·利斯

23
#键将反向搜索光标下方的单词
Funkodebat 2013年

github.com/bronson/vim-visual-star-search启用星号搜索以进行视觉选择。我不想再错过了。
Patrick Oscity

[ + Tab 当您path使用所需的文件夹扩展set path+=path/to/files
dlmeetei 2016年

43

ZZ(像:wq

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

set scrolloff=9999

2
不知道 :x也会做到这一点
sa125 2012年

18
并不完全准确。就像一样工作:x,仅在发生更改时:wq保存文件,而始终保存文件。
Erik B

ZQ(类似于:q!)
xialu

42

我在Vim Brainstore中最新添加的一些功能:

  • ^wi:通过拆分窗口跳到光标下方的标签。
  • cib/ciB:分别更改当前括号()或大括号{}中的文本。
  • :set listchars=tab:>-,trail:_ list:显示选项卡/后跟空格在视觉上与其他空格不同。它对Python编码有很大帮助。

4
这需要更多票! cib是很棒的。
马特·帕克

还:ciw更改当前单词(或caw,相同但仅左手使用)ciW更改当前W = o。(rd)与v相同而不是c会在视觉上选择而不是替换
lajarre 2012年

5
CIB相当于键入“词(”你也可以做“CI [”,“CI {”,或者(如果你的vimrc设置正确)“CI <”,对于其他类型的支架。
汤主

2
另外,“ cit”用于更改标签内的文本。使用XML / HTML时非常有用。
Walter

还值得一提的是,如果您愿意,可以在后括号中加上后括号。另外,我刚刚了解了ci}cit-哇,这将非常有用。vi[m]证明是一个非常令人兴奋的程序!
underscore_d 2015年


34

:shell从Vim启动Shell控制台。例如,当您要测试脚本而不退出Vim时很有用。在完成Shell控制台后,只需按^ d,然后返回Vim和已编辑的文件。


我想:!sh太难了。我更喜欢,因为它使用的寄存器/完井从当前缓冲区或例如使用更容易撰写命令行%/ %:h对当前文件名/目录名等
sehe

1
这个很酷。我每天都使用它..它是在这之前,:WQ,做CLI的东西,重新使用vim的同一个文件..大优化
闪光类

7
Ctrl-Z切换到shell,fg <ENTER>返回vim。
Mario G.

map <Esc>! :shell<CR>你的.vimrc,你可以只是ALT +!或ALT + SHIFT + 1启动外壳。(助记符:使用shell :!{cmd}执行{cmd}。)
musiphil

:shell将会开始一个新的嵌套外壳层。而ctrl-z没有。
wisbucky


31

病毒加密

vim -x filename.txt

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


将其与您的保管箱同步,您将获得一个非常不错的密码管理器;-)
Luis Nell 2012年

15
但请注意,除非您set cryptmethod=blowfish(仅在7.3+中可用),否则它将使用具有可笑强度的算法。请参阅help encryption以获取更多详细信息。
AB

3
请不要使用vim加密,它不是很好的加密,而糟糕的安全性要比没有更糟。更多信息:github.com/neovim/neovim/issues/694
rodrigoq 2014年

2
dgl.cx/2014/10/vim-blowfish meta-tldr:“已在Vim 7.4.399中修复[ groups.google.com/forum/#!msg/vim_dev/D8FyRd0EwlE/bkBOo-hzTzoJ],出于向后兼容的原因,它需要成为新的加密方法,因此请使用:set cm=blowfish2
underscore_d

28

在Vim中构建和调试代码!

组态

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

编译

在Vim中时,键入:make以调用Shell并构建程序。当输出滚动时,请不要担心。Enter完成操作后按即可返回Vim。

魔术

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

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

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


1
不仅可以编译代码,还可以使用。也就是说,用makefile编写的任何任务都非常有用。
德怀特·斯宾塞

25

^ P和^ N

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

^ O和^ I

转到上一个(^ O-“ O”为旧位置)或下一个位置(^ I-“ I”,紧邻“ O”)。

执行搜索,编辑文件等时,可以前后浏览这些“跳转”。

分数

ma(m-标记,a-标记名称)。稍后返回到位置,输入`a


1
哇,我不知道^ O和^ I:太棒了。:help jump-motions如果有人需要更多信息,可能值得在答案中包含等。
DrAl

查看ShowMarks vim.org/scripts/script.php?script_id=152。它将帮助您记住所有标记在缓冲区中的位置和位置。您可以使用\ mt
测试器

我没有^ P和^ N之间的区别……
lajarre 2012年

@lajarre,他们以相反的方向循环显示可用完工清单
Patrick Oscity 2013年

2
注意到我想再次编辑上次编辑的文件后,在打开Vim时经常使用^ O ^ O。节省大量时间!
Patrick Oscity


22

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

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


这里最好的一个,尽管其他一些也有用,但我已经知道了所有这些信息
Funkodebat

1
同样f代替t,它将通过该角色继续动作。例如,将光标放在函数参数的开头,df,将会删除它(当然是用合适的语言)。
Actorclavilis 2013年

t和f非常适合编辑camelCase变量的一部分。例如,如果您只是复制一行,并且需要将firstVariable更改为secondVariable,请将光标置于firstVariable的开头,然后将ctV
Greg

1
T和F也起作用,但方向相反。
2016年

20

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

使用grep或replace命令时,它确实很有用。


如果这是您想要的唯一单词,那么在正常模式下,*将在光标下方搜索该单词。
idbrii 2010年


17

我希望我早些了解基本的可视块模式。即使您不使用Vim进行其他操作,仅出于某些块操作的目的,在Vim中打开文件也可以节省大量时间。我敢肯定,我浪费了很多时间手动做这种事情。

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

(进入可视块模式Ctrl+ Q在Windows,而不是为我Ctrl+ V

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

然后,I whatever textEsc将文本插入到每一行的代码块前面。

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

而且-只需切换视觉选择的情况~就可以节省大量时间。

d当然,也只需删除列。


15

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


6
...和^ E会在光标下方插入字符
过多的PHP

不适用于我,它只是将光标移动到文本的开头
Alex

14

q <letter>-记录一个宏。

@ <相同字母>-播放。

这些是到目前为止Vim中最有用的命令,因为您可以让计算机为您完成很多工作,甚至不必编写程序或执行任何操作。


使用的q只是保存到一个名为缓冲区的缓冲区命令:简化的问题,但你使用它并不需要"-例如,使用缓冲a- "ad$......

@Mei q记录一个宏;宏可以包含命令,而不仅仅是文本,因此"ad$与有所不同qa
Brian McCutchon 2014年

@Sortofabeginner在这里无关紧要。命令“广告$将文本写入缓冲区和QA运行它。

2
@Mei qa没有运行它;qa记录并@a运行它。确实可以用纯文本编写宏,将其存储在a诸如中的寄存器中"ad$,然后使用来执行@a,但这要花很多时间。剪切和粘贴与记录和运行之间有根本的区别。
Brian McCutchon 2014年

h!我知道。感谢您的更正
Mei

13

使用标签页打开多个文件

: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

12

qx将开始记录击键。您几乎可以执行任何编辑任务,Vim会记住它。命中q再次,当你完成,然后按@x重播您的击键。这对于太复杂而无法编写映射的重复编辑非常有用。您可以使用x以外的其他字符来录制许多唱片。


5
同样,在'q'记录宏命令和命名剪贴板(“ x ...”)之间共享相同的字符'x'。您可以在文件周围保留宏片段,并将其复制到命名剪贴板(例如“ xyy ),然后播放(@x)。
Cyber​​ Oliveira

而且,如果您曾经创建过一个很棒的宏,则可以使用“ let @x =“”“(将该宏放在”“中)将该剪贴板粘贴到_vimrc中,并将其永久保存!
Kearns

11

我不得不说,我的最爱之一是将帮助窗口放到新标签中:

:tab help <help_topic>

这在新标签页中打开了帮助,对于喜欢Vim标签页的人来说,这非常有用。


2
缓冲区是vim的选项卡。vim工作流更好地支持它们。我怀疑标签只是添加到了vim中,因为太多的人不了解缓冲区。
still_dreaming_1 2015年

这么说后很快,我发现在vim中使用制表符。的确,如果每个选项卡使用一个缓冲区,则需要了解缓冲区。这不是在vim中使用制表符的方式。大多数高级vim用户使用缓冲区的方式与大多数程序中使用选项卡的方式相同。许多人认为标签应该在vim中被命名为layouts。它们主要用于在不同的选项卡中打开不同的窗口集合。您还可能有一个特定的缓冲区,您可以在一个选项卡中返回很多未使用的缓冲区,然后使用另一个选项卡来查看所有其他缓冲区。
still_dreaming_1 2015年

9

连续波

更改单词-删除光标下方的单词,并使您进入插入模式以键入一个新单词。当然,这可以与其他移动键配合使用,因此您可以执行c $之类的操作来更改到行尾。

f +字符

查找当前行中下一个出现的字符。因此,您可以执行vft选择所有文本,直到当前行的下一个“ t”为止。这是另一个移动键,因此也可以与其他命令一起使用。


9

:b [any portion of a buffer name]切换缓冲区。因此,如果您有两个缓冲区“ somefile1.txt”和“ someotherfile2.txt”,则可以使用简单地切换到第二个缓冲区":b 2.t<enter>"。它也支持制表符补全,尽管不是必需的。

说到选项卡完成,该设置:set wildmode=full wildmenu也非常有帮助。它启用了命令模式下的完整制表符补全,以及使用时非常有用的ncurses样式菜单,其中包含所有可能的匹配项。


9

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

您可以使用除/(斜杠)以外的其他字符来分隔替换图案。这样,您不必逃避文件路径的斜线。


2
哦,是的。我知道sed有这个,但没有vim。你知道的越多♒☆
Beerbajay 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.