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

Lin*_*Lin 377 vim

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

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

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

yal*_*tar 314

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

  • 哇靠.15年的vi和我从来不知道这个...... (113认同)
  • 我将我的Caps-Lock重新映射到了Esc.这比普通的Esc和Ctrl-C都容易 (91认同)
  • 使用'jk'作为@ claytron的变种.如果你在不知不觉中已经处于INSERT模式,jk会让你离开你所在的地方,所以你可以随时点击它(信用:别人......不是我的想法). (41认同)
  • 另一个流行的是使用'jj'进行ESC.到目前为止,我喜欢这种方法.:地图!jj <ESC> (31认同)
  • 你也可以使用CTRL- [(我喜欢它,因为它既是小手指......也只是双手的一点旋转). (24认同)
  • 请记住,使用`Ctrl-c`退出插入模式不会触发`InsertLeave`自动命令事件.如果你有任何插件或脚本取决于它,它们将无法正常工作.见`:h i_CTRL-C`. (9认同)
  • 这是一个很好的提示,但要小心:它打破了VISUAL BLOCK功能.您必须按ESC而不是Ctrl-C才能正确插入块新文本,而不是仅在一行上. (6认同)
  • @Emile我喜欢将`jk`和`kj`映射到<Esc>,这样我就可以同时击中两个并且我碰巧先按下哪一个并不重要.这几乎就像一次击键. (6认同)
  • @gsk @Shrikant看起来像CTRL- [适用于visual block和`InsertLeave`.感谢对这个答案的评论,这就是我要坚持的东西(我将不得不学习ESC ......). (4认同)
  • 我更喜欢CTRL- [,它是适用于所有地方的标准vim热键 (3认同)
  • 只是在这里成为"那个人",并且与"jk"让你处于正常模式的地方的说法略有矛盾.当您位于缓冲区的第一个xor最后一行时,情况并非如此.(虽然它是*如果它们是同一个,那就是真的,因为你没有任何地方可以继续下去.) (2认同)

DrA*_*rAl 195

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

: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
Run Code Online (Sandbox Code Playgroud)

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

例:

/blue\(\d\+\)
:%s//red\1/
Run Code Online (Sandbox Code Playgroud)

相当于:

:%s/blue\(\d\+\)/red\1/
Run Code Online (Sandbox Code Playgroud)

看到:

:help 'incsearch'
:help :substitute
Run Code Online (Sandbox Code Playgroud)

  • 对于真正喜欢这个的人,尝试点击`<Ctrl-R> /`来插入最后一个搜索查询.(参见`:help i_CTRL-R`)对于类似上面的内容非常有用,但是你想要捕获部分搜索结果.(像这样:`%s:/ \\([fF] rank \\)和mary/marie和\ 1/g`) (26认同)
  • `:%s // ...`也适用于`*`(在光标下搜索单词).一个名为visual-star-search的插件扩展了`*`的功能,以匹配视觉选择的整个文本,这使得搜索和替换所选文本变得容易,例如`v3e`(在视觉上选择3个单词)`*`(搜索)和`:%s // replacement/g`(用"替换"替换所有出现的事件).我经常使用这个,我有一个全局替换命令的映射:`:nmap <Leader> s:%s /// g <left> <left>`. (4认同)

bri*_*man 154

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

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.
Run Code Online (Sandbox Code Playgroud)

  • 用于块选择的Ctrl-Q是mswin.vim的特性,允许CTRL-V粘贴.大多数vim用户会认为这是邪恶的并禁用mswin.vim."+ P或Ctrl-R +并不难以输入以插入剪贴板内容. (11认同)
  • 我使用VIM,但没有使用插件.然而; 使用选择块功能使其相对容易.很高兴您发现该列表很有用!〜布赖恩 (6认同)
  • 这个清单很好,但我真的想知道你是怎么画这张桌子的?与VIM?哪个插件?我正在寻找一个. (5认同)

Cyb*_*ira 141

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

  • 当我发现'g;'时,我很高兴.现在这让我感动得流泪了:-) (28认同)
  • Vim的直观性永远不会让我印象深刻.因为@PonyEars提到了`g;`我试过,如果它的"反面"是"g",那么我们可以回头往前走! (13认同)
  • 仅供参考,g; (上面提到的@PatrickOscity)将光标放在编辑的位置.您可以多次使用它来回溯历史.在这里注意到这一点,因为我的vim帮助并没有提到这一点,原因有些奇怪. (7认同)

Mic*_*ski 104

:q!

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

  • 我记得在同一天第一次尝试vim和emacs,不知道如何退出.我心想_这些人到底怎么了!?_ (29认同)
  • 作为一个emacs人,这是我读过的最有趣的评论.不确定你是不是意味着它.你今天让我开心. (23认同)
  • +1.第一次启动vim时,默认消息应为"write:q to quit".我会节省很多时间哈哈 (13认同)
  • @ivy_lynx是的,你可能是对的,但只有你打开没有文件的vim.通常,第一次打开vim是因为你需要在Unix中编辑配置文件,所以你写"$ vim文件"而你却找不到出路.或者我是唯一的一个? (5认同)
  • @JoséRamón但如果你输入vim而没有打开文件,它默认会在屏幕上显示它.这是最近增加的吗?我可以清楚地记得几年前尝试过vim,它已经存在了.如果你尝试退出而不保存缓冲区,它还会告诉你使用`:q!`. (2认同)
  • @danielpops这不是一个巨魔,这是一个流行的笑话,第一次(或意外)打开vim的人往往不知道如何再次退出. (2认同)

Bri*_*new 55

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

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

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

  • **^ XP**优先于文件中的前一个单词,**^ XN**优先于文件中的下一个单词. (7认同)
  • *jinxed_coder*:`:set noscb`将其关闭并使用`:set scb`将其打开(不是`:scrollbind`).`:h scrollbind` (2认同)

ant*_*ony 47

  1. 永远不要逃避逃生.请参阅此答案以了解原因.如上所述,ctrl-c是更好的选择.我强烈建议将大写锁定键映射到escape.

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

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

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

  • 如果这是一个如此好的朋友,为什么它在键盘上如此遥远? (27认同)
  • #3太棒了!还在学习新事物...... (15认同)
  • 不要使用Escape?这是异端邪说.Escape是你最好的朋友,无论是在工作中还是在工作之外. (11认同)
  • 我的键盘上的Escape与其他键分开了几英寸.你不能错过它. (5认同)

Pet*_*ter 47

您可以使用一整套命令来更改括号/括号/引号/标记内的文本.避免必须找到组的开始和结束是非常有用的.尝试ci(, ci{, ci<, ci", ci', ct根据您想要更改的对象类型.而ca(, ca{, ...变种删除括号/引号为好.

易于记忆:改变括号内的声明/改变括号内的陈述.

  • 这不仅仅适用于`c`.你可以用'd`删除(例如di(或da(),`y`到yank,'v`来选择等等). (15认同)
  • 这个提示是我在第一时间切换到vi的唯一原因:) (2认同)

may*_*eye 43

ZZ(像那样:wq)

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

set scrolloff=9999
Run Code Online (Sandbox Code Playgroud)

  • 不完全准确.像`:x`一样工作,只有在有变化时才保存文件,而`:wq`总是保存文件. (18认同)
  • 不知道那个.`:x`也是如此 (2认同)

smc*_*ron 42

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

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

  • #键将反向搜索光标下的单词 (21认同)

Wal*_*ter 41

我对VIm脑库的一些最新补充:

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

  • cib相当于输入"ci(".你也可以用"ci [","ci {"或(如果你的vimrc设置正确)"ci <",用于其他类型的括号. (5认同)
  • 这需要更多的选票!`cib`很棒. (4认同)
  • 另外,"cit"用于更改标签内的文本.在使用XML/HTML时非常有用. (2认同)

too*_*php 35

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


小智 34

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

  • Ctrl-Z切换到shell,fg <ENTER>返回vim. (6认同)

dog*_*ane 31

这总是让我振作起来

:help 42
Run Code Online (Sandbox Code Playgroud)


ant*_*rsa 29

vimcryption

vim -x filename.txt

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

  • 但请注意,除非你设置cryptmethod = blowfish`(仅适用于7.3+),否则它将使用具有可笑强度的算法.有关更多详细信息,请参阅"help encryption". (15认同)
  • 请不要使用vim加密,加密不好,安全性差也不是最好的.更多信息:https://github.com/neovim/neovim/issues/694 (3认同)
  • https://dgl.cx/2014/10/vim-blowfish meta-tldr:"修复于Vim 7.4.399 [https://groups.google.com/forum/#!msg/vim_dev/D8FyRd0EwlE/bkBOo-hzTzoJ ],出于向后兼容的原因,它需要是一个新的cryptmethod,所以使用`:set cm = blowfish2`" (2认同)

Ada*_*iss 28

从vim内构建和调试代码!

组态

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

编译

当你在vim中时,键入:make以调用shell,构建你的程序.输出滚动时不要担心; 只需按下:cl它完成后返回到vim.

魔法

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

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

还有更多; 如果你有兴趣,请Makefile在vim中输入.


dim*_*mba 25

^ P和^ N.

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

^ O和^ I

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

分数

ma(m标记,a - 标记名称).后来返回位置类型`a

  • 在我注意到我想再次编辑最后编辑的文件后打开Vim时,我经常使用^ O ^ O. 节省大量时间! (2认同)

Ada*_*iss 24

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

  • 如果光标没有超过任何一个,它会向右移动直到它击中其中一个. (19认同)

Mig*_*MoS 21

直到[character](t).对于接受范围的任何命令都很有用.我最喜欢的是ct;ct)它删除一切都交给尾随分号/右括号,然后放置在你插入模式.

此外,G并且gg很有用(分别转到底部和顶部).


Can*_*pus 20

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


Ano*_*non 17

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

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

进入Visual Block模式(Ctrl-Q在Windows上为我而不是Ctrl-V)

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

然后,I whatever textEsc,将文本插入每行的块前面.

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

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

当然,简单地删除列也是如此d.


xas*_*tor 17

键入后面的行号gg将带您到该行.

  • :后面跟行号相同:42行到第42行 (30认同)
  • 键入行号后跟G具有相同的效果. (12认同)
  • `<number> go`转到文件中的`<number>第th个字符. (3认同)

inn*_*naM 15

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

  • ...和^ E将在光标下方插入字符 (6认同)

lee*_*d00 14

q <letter> - 记录一个宏.

@ <同信> - 播放它.

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

  • @Mei`qa`没有运行它; `q`记录它,`@ a`运行它.确实,您可以用纯文本编写一个宏,将它存储在寄存器`a`中,并使用``ad $`,然后用`@a`执行它,但这是相当多的工作.剪切和粘贴以及记录和运行之间的根本区别. (2认同)

too*_*php 12

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

  • 'q'记录宏命令和命名的剪贴板("x ...)之间共享相同的字符'x'.您可以在文件周围留下宏的片段并将它们复制到命名剪贴板(例如"xyy" )然后播放它们(@x). (5认同)

Man*_*uro 12

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

:tabe filepath
Run Code Online (Sandbox Code Playgroud)

在打开的文件之间导航

gt and gT or :tabn and :tabp
Run Code Online (Sandbox Code Playgroud)

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

:mksession session_file_name.vim
Run Code Online (Sandbox Code Playgroud)

打开已创建的会话

vim -S session_file_name.vim
Run Code Online (Sandbox Code Playgroud)

一次关闭所有文件

:qa
Run Code Online (Sandbox Code Playgroud)

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

autocmd
Run Code Online (Sandbox Code Playgroud)

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

:autocmd BufWritePost *.cpp :make
Run Code Online (Sandbox Code Playgroud)


Rob*_*oli 11

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

:tab help <help_topic>
Run Code Online (Sandbox Code Playgroud)

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

  • 缓冲区是vim的标签.vim工作流程可以更好地支持它们.我怀疑标签只是添加到vim,因为太多人不理解缓冲区. (2认同)

Mic*_*ael 9

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

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


Ada*_*eal 8

CW

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

f +字符

在当前行上查找下一个字符.所以你可以做vft来选择当前行上下一个"t"的所有文本.它是另一个移动键,因此它也适用于其他命令.


hfs*_*hfs 8

:%S,/搜索/替换,

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

  • 哦,是的。我知道 `sed` 有这个,但不知道 `vim`。知道的越多**♒☆** (2认同)

jmo*_*ohr 7

:x #(Save and Quit a File)
Run Code Online (Sandbox Code Playgroud)

相同:wq或ZZ


Nik*_*iga 7

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

要关闭选项卡,请键入:tabc或:tabclose或just:close.

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

对齐代码 - 完整文件
只需在转义模式下输入G = gg即可.

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

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


Kri*_*ins 6

我很惊讶没有人提到Vim的窗口支持.__CODE__几乎每次打开vim时我都会使用它.

  • 我也使用CTRL-W v:D (2认同)

xcr*_*mps 5

ma
move cursor down
:'a,.!program
Run Code Online (Sandbox Code Playgroud)

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

:.!ls
Run Code Online (Sandbox Code Playgroud)

哦,你可以为 az(即 ma)设置这样的标记,然后

'a
Run Code Online (Sandbox Code Playgroud)

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

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

时髦的东西。vi 被严重低估了。一旦掌握了窍门,您将永远不想使用 IDE 提供的编辑器。


Igo*_*kin 5

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

function! FixCallStacks()
:%s;\[NLN\];\r;g
:%s;\[TAB\];\t;g
endfunction
Run Code Online (Sandbox Code Playgroud)


小智 5

注释掉一系列行:

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

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

  3. 命令是:

    :'a,.s/^/# /
    
    Run Code Online (Sandbox Code Playgroud)

    假设#是您的评论字符。

  • 此外,使用 CTRL+V 或 CTRL+Q 选择范围内每一行中的第一列,然后使用 I(在选择之前插入)在每列的开头插入 #,然后使用 # (5认同)
  • 或者 SHIFT+V,选择一个范围,然后 :'&lt;,'&gt;normal I# (4认同)

Ada*_*iss 5

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

:%!sort

排序文件中的项目列表.

细节:

:范围!命令

将在指定的行范围内执行shell命令.范围通常指定为起始,

示例:
1,3指定前3行
'a,'b选择书签之间的文本ab
.,$选择整个文档(.=第一行; $=最后一行)
%是一个快捷方式,.,$并且还会分隔整个文档.

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

  • 我更喜欢vim的内置:%sort.:帮助排序列出了许多美味的选择. (4认同)

Vij*_*Dev 5

:qall和:wqall关闭所有分屏

  • 不确定是否假设短格式,但如果它们不是:qa和:wqa做同样的事情. (2认同)