我一直在VIM学习新的命令,但我确信每个人都会偶尔学到新东西.我刚刚了解到这一点:
zz,zt,zb - 将光标定位在屏幕的中间,顶部或底部
你希望你多年前学到的其他一些有用或优雅的命令是什么?
yal*_*tar 314
我真的希望我知道你可以使用CtrlC而不是Esc切换出插入模式.这对我来说是一次真正的生产力提升.
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)
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)
Cyb*_*ira 141
gi切换到插入模式,将光标放在先前的位置.
Mic*_*ski 104
:q!
在我第一次开始vi之前,我希望我知道
Bri*_*new 55
^ XF使用当前目录中的文件名完成.不再从终端复制/粘贴或痛苦的双重检查.
^ XP完成使用当前文件中的单词
:set scrollbind强制一个缓冲区与另一个缓冲区一起滚动.例如,将窗口分成两个垂直窗格.在每个文件中加载一个文件(可能是同一文件的不同版本).不要:set scrollbind
只.现在当您滚动一个时,两个窗格将一起滚动.非常适合比较文件.
ant*_*ony 47
永远不要逃避逃生.请参阅此答案以了解原因.如上所述,ctrl-c是更好的选择.我强烈建议将大写锁定键映射到escape.
如果您正在编辑ctags兼容语言,使用标签文件和:ta,ctrl-]等是导航代码的好方法,甚至可以跨多个文件.此外,使用标签文件ctrl-n和ctrl-p完成是减少击键的好方法.
如果你正在编辑一条被包装的行,因为它比缓冲区宽,你可以使用gk和gj向上/向下移动.
在学习坏习惯之前,请注意有效使用动作命令.比如使用'dt'或'd3w'而不是按xa次.基本上任何时候你发现自己重复使用相同的键,可能有更好/更快/更简洁的方法来完成同样的事情.
Pet*_*ter 47
您可以使用一整套命令来更改括号/括号/引号/标记内的文本.避免必须找到组的开始和结束是非常有用的.尝试ci(, ci{, ci<, ci", ci', ct
根据您想要更改的对象类型.而ca(, ca{, ...
变种删除括号/引号为好.
易于记忆:改变括号内的声明/改变括号内的陈述.
may*_*eye 43
ZZ
(像那样:wq
)
关于光标位置.我发现总是停留在屏幕中间的光标很酷
set scrolloff=9999
Run Code Online (Sandbox Code Playgroud)
Wal*_*ter 41
我对VIm脑库的一些最新补充:
^wi
:通过拆分窗口跳转到光标下的标签.cib/ciB
:分别更改当前括号()或大括号{}内的文本.:set listchars=tab:>-,trail:_ list
:显示与其他空格视觉上不同的制表符/尾随空格.使用Python编码有很多帮助.小智 34
:shell从Vim启动shell控制台.例如,您希望在不退出Vim的情况下测试脚本时很有用.完成shell控制台后,只需点击^ d,然后返回Vim和您编辑的文件.
ant*_*rsa 29
vimcryption
vim -x filename.txt
系统会要求您输入密码,编辑并保存.现在,无论何时再次在vi中打开文件,您都必须输入密码才能查看.
Ada*_*iss 28
真的不多.您需要Makefile
在当前目录中.
当你在vim中时,键入:make
以调用shell,构建你的程序.输出滚动时不要担心; 只需按下:cl
它完成后返回到vim.
回到vim中,您可以使用以下命令:
:cc
列出错误,警告和其他消息.:cc n
显示屏幕底部的当前错误/警告消息,并跳转到代码中的违规行.n
跳到:cn
第二条消息.:cp
前进到下一条消息.:help :cc
跳转到上一条消息.还有更多; 如果你有兴趣,请Makefile
在vim中输入.
dim*_*mba 25
^ P和^ N.
完成上一个(^ P)或下一个(^ N)文本.
^ O和^ I
转到上一个(^ O - "O"表示旧位置)或下一个(^ I - "I"接近"O").当您执行搜索,编辑文件等时,您可以向前和向后浏览这些"跳转".
分数
按ma(m标记,a - 标记名称).后来返回位置类型`a
Mig*_*MoS 21
直到[character](t
).对于接受范围的任何命令都很有用.我最喜欢的是ct;
和ct)
它删除一切都交给尾随分号/右括号,然后放置在你插入模式.
此外,G
并且gg
很有用(分别转到底部和顶部).
Ano*_*non 17
我希望我早些时候知道基本的视觉块模式.即使您不将VIM用于其他任何事情,也可以节省大量时间来在VIM中打开文件,仅用于某些块操作.我很确定我浪费了大量时间手动做这种事情.
我发现的例子特别有用,比如说,一致地重构符号常量名称列表:
进入Visual Block模式(Ctrl-Q在Windows上为我而不是Ctrl-V)
移动光标以突出显示所需的块.
然后,I whatever text
按Esc,将文本插入每行的块前面.
使用A
而不是I
在每行上的块之后插入文本.
此外 - 简单地切换视觉选择的情况~
可以节省大量时间.
当然,简单地删除列也是如此d
.
xas*_*tor 17
键入后面的行号gg
将带您到该行.
lee*_*d00 14
q <letter> - 记录一个宏.
和
@ <同信> - 播放它.
这些是迄今为止vim中最有用的命令,因为你可以让计算机为你做很多工作,你甚至不必编写程序或任何东西.
too*_*php 12
qx将开始录制击键.你可以做任何编辑任务,Vim会记住它.完成后再次点击q,然后按@x重播你的击键.这对于重复编辑非常有用,这些编辑过于复杂而无法编写映射.您可以使用x以外的字符进行多次录制.
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标签一样,这非常有用.
:b [any portion of a buffer name]
切换缓冲区.因此,如果你有两个缓冲区"somefile1.txt"和"someotherfile2.txt",你可以简单地切换到第二个缓冲区":b 2.t<enter>"
.它还支持制表符完成,但不是必需的.
说到标签完成,该设置:set wildmode=full wildmenu
也非常有用.它可以为命令模式完成标签完成,以及使用它时所有可能匹配的非常有用的ncurses风格菜单.
CW
更改单词 - 删除光标下的单词并将您置于插入模式以键入新单词.当然,这适用于其他移动键,因此您可以执行c $之类的操作以更改为行尾.
f +字符
在当前行上查找下一个字符.所以你可以做vft来选择当前行上下一个"t"的所有文本.它是另一个移动键,因此它也适用于其他命令.
:%S,/搜索/替换,
您可以使用除» / « 之外的其他字符来分隔替换模式.这样您就不必转义文件路径的斜杠.
选项卡式界面
除拆分Windows外,您还可以使用选项卡式Windows.在转义模式下,键入:tabnew.您可以像这样打开多个标签.要在选项卡之间导航,请键入tabn.这将移至下一个标签.要移至选项卡式窗口,请键入:tabn2以移动第二个选项卡,依此类推.
要关闭选项卡,请键入:tabc或:tabclose或just:close.
如果您在终端仿真器(基本上是GUI中的终端),那么您可以尝试:set mouse = a.完成后,您可以使用鼠标在编辑器内单击.这也可以帮助您通过单击在标签之间导航,也可以通过单击右侧的关闭按钮来关闭标签.
对齐代码 - 完整文件
只需在转义模式下输入G = gg即可.
折叠你的代码
假设你有一个完成的功能.您希望最小化(或折叠)该部分代码,以便释放一些空间并减少混乱.只需选择代码即可.然后,输入:fold.
这将折叠代码.如果要扩展代码,只需转到那里,然后键入zo.要再次折叠,请键入zc.
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 提供的编辑器。
我经常为编辑任务创建函数,并将它们存储在我的.vimrc中,以便我可以再次找到它们.例如,读取已转换为单行的.Net callstack:
function! FixCallStacks()
:%s;\[NLN\];\r;g
:%s;\[TAB\];\t;g
endfunction
Run Code Online (Sandbox Code Playgroud)
小智 5
注释掉一系列行:
首先在范围的开头设置一个书签:
ma
转到范围内的最后一行
命令是:
:'a,.s/^/# /
Run Code Online (Sandbox Code Playgroud)
假设#
是您的评论字符。
把xcramps的建议更进一步,我不能告诉你我用了多少次:
:%!sort
排序文件中的项目列表.
细节:
:
范围!
命令
将在指定的行范围内执行shell命令.范围通常指定为起始,
端
示例:
1,3
指定前3行
'a,'b
选择书签之间的文本a
并b
.,$
选择整个文档(.
=第一行;$
=最后一行)
%
是一个快捷方式,.,$
并且还会分隔整个文档.
随意混合和匹配数字,书签.
,和$
.