我一直在Vim学习新命令,但我确信每个人偶尔都会学到新东西。我刚刚了解到这一点:
zz,zt,zb - 将光标定位在屏幕的中间,顶部或底部
您希望在很久以前学过什么其他有用或优雅的命令?
答案 0 :(得分:309)
我真的希望我知道您可以使用 Ctrl C 而不是 Esc 来切换出插入模式。这对我来说是一次真正的生产力提升。
答案 1 :(得分:193)
我学到的最新“哇”技巧是一种复杂的搜索和替换方法。在过去,我经常有一个非常复杂的正则表达式进行替换而且它没有用。有一种更好的方法:
: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
答案 2 :(得分:152)
我为我的一个朋友创建了这个最常用命令的引用。希望人们能找到有用的东西:
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.
答案 3 :(得分:137)
gi 切换到插入模式,将光标放在以前的位置。
答案 4 :(得分:103)
:q!
我希望在第一次开始vi之前我知道
答案 5 :(得分:54)
^ X-F 使用当前目录中的文件名完成。不再需要从终端复制/粘贴或进行痛苦的双重检查。
^ X-P 使用当前文件中的文字完成
:set scrollbind 强制一个缓冲区与另一个缓冲区一起滚动。例如将窗口分成两个垂直窗格。在每个文件中加载一个文件(可能是同一文件的不同版本)。每个都:set scrollbind
。现在当您滚动一个时,两个窗格将一起滚动。非常适合比较文件。
答案 6 :(得分:46)
您可以使用一整套命令来更改括号/括号/引号/标记内的文本。避免必须找到组的开始和结束是非常有用的。请尝试ci(, ci{, ci<, ci", ci', ct
,具体取决于您要更改的对象类型。 ca(, ca{, ...
变体也会删除括号/引号。
易于记忆:改变括号中的陈述/更改括号内的陈述。
答案 7 :(得分:46)
永远不要逃避逃生。 See this answer to learn why。如上所述,ctrl-c是更好的选择。我强烈建议将大写锁定键映射为escape。
如果你正在编辑ctags兼容语言,使用标签文件和:ta,ctrl-]等是导航代码的好方法,即使是跨多个文件也是如此。此外,使用标签文件完成ctrl-n和ctrl-p是减少击键的好方法。
如果你正在编辑一条被包装的行,因为它比缓冲区宽,你可以使用gk和gj向上/向下移动。
在学习不良习惯之前,请注意有效使用动作命令。比如使用'dt'或'd3w'而不是多次按x。基本上任何时候你发现自己反复使用相同的键,可能会有更好/更快/更简洁的方法来完成同样的事情。
答案 8 :(得分:44)
ZZ
(类似于:wq
)
关于光标位置。我发现总是停留在屏幕中间的光标很酷
set scrolloff=9999
答案 9 :(得分:42)
星号键 * 将搜索光标下的单词。
[ + Tab 将带您进入光标下的C函数定义。 (虽然并不总是奏效。)
答案 10 :(得分:40)
我最近添加到我的VIm脑库中的一些内容:
^wi
:通过拆分窗口跳转到光标下的标签。cib/ciB
:分别更改当前括号()或大括号{}内的文本。:set listchars=tab:>-,trail:_ list
:显示与其他空格视觉上不同的制表符/尾随空格。使用Python编码帮助很多。答案 11 :(得分:35)
:shell 从Vim启动shell控制台。例如,您希望在不退出Vim的情况下测试脚本时很有用。完成shell控制台后,只需点击 ^ d ,然后返回Vim和您编辑的文件。
答案 12 :(得分:34)
gv 启动可视模式并自动选择您之前选择的内容。
答案 13 :(得分:31)
总是让我振作起来
:help 42
答案 14 :(得分:29)
vimcryption
vim -x filename.txt
您将被要求输入密码,编辑并保存。现在,无论何时再次在vi中打开文件,您都必须输入密码才能查看。
答案 15 :(得分:28)
不多,真的。您需要在当前目录中使用Makefile
。
当你在vim中时,输入 :make
来调用shell,构建你的程序。输出滚动时不要担心;完成后只需按[Enter]
即可返回vim。
回到vim中,您可以使用以下命令:
:cl
会列出错误,警告和其他消息。:cc
会在屏幕底部显示当前错误/警告消息,会跳转到代码中的违规行。:cc n
跳转到n
th 消息。:cn
前进到下一条消息。:cp
会跳转到上一条消息。还有更多;如果您有兴趣,请在vim中输入 :help :cc
。
答案 16 :(得分:25)
^ P和^ N
完成上一个(^ P)或下一个(^ N)文本。
^ O和^ I
转到上一个(^ O - “O”表示旧位置)或下一个(^ I - “I”接近“O”)。 当您执行搜索,编辑文件等时,您可以向前和向后浏览这些“跳转”。
<强>标记强>
按 ma (m-mark,a - 标记名称)。稍后返回位置类型`a
答案 17 :(得分:24)
当光标位于引号,填充,括号或大括号上时按%
以查找其匹配项。
答案 18 :(得分:21)
直到[character](t
)。对于接受范围的任何命令都很有用。我最喜欢的是ct;
或ct)
,它会删除所有内容,直到后面的分号/右括号,然后将您置于插入模式。
此外,G
和gg
也很有用(分别转到底部和顶部)。
答案 19 :(得分:20)
^r^w
将光标下的单词粘贴到命令模式中。
使用grep或替换命令时非常有用
答案 20 :(得分:17)
键入一个后跟gg
的行号会转到该行。
答案 21 :(得分:17)
我希望我早些时候知道基本的视觉块模式。即使您不将VIM用于其他任何事情,也可以节省大量时间来在VIM中打开文件,仅用于某些块操作。我很确定我浪费了大量时间手动做这件事。
我发现的例子特别有用,比如说,一致地重构符号常量名称列表:
在Windows上输入Visual Block模式( Ctrl-Q 而不是 Ctrl-V )
移动光标以突出显示所需的块。
然后,I whatever text
并按 Esc 将文本插入每行的块前面。
使用A
代替I
在每行上阻止插入文字。
此外 - 只需使用~
切换视觉选择的大小,就可以节省大量时间。
当然,只需删除列,d
。
答案 22 :(得分:15)
^ y 会复制光标上方的字符。
答案 23 :(得分:14)
Q&LT;字母GT; - 记录一个宏。
和
@&LT;相同字母&GT; - 播放它。
这是迄今为止vim中最有用的命令,因为你可以让计算机为你做很多工作,甚至你不需要编写程序或任何东西。
答案 24 :(得分:12)
使用标签打开多个文件:
: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
答案 25 :(得分:12)
qx 将开始录制击键。你可以做任何编辑任务,Vim会记住它。完成后再次点击 q ,然后按 @x 重播您的按键。这对于重复编辑非常有用,这些编辑过于复杂而无法编写映射。您可以使用 x 以外的字符进行多次录制。
答案 26 :(得分:11)
我不得不说我最喜欢的一个是将帮助窗口放在一个新选项卡中:
:tab help <help_topic>
这会在新标签页面中显示帮助,而且正如喜欢vim标签的人一样,这非常有用。
答案 27 :(得分:9)
:b [any portion of a buffer name]
来切换缓冲区。因此,如果你有两个缓冲区“somefile1.txt”和“someotherfile2.txt”,你可以只用":b 2.t<enter>"
切换到第二个缓冲区。它还支持制表符完成,但不是必需的。
说到制表符完成,设置:set wildmode=full wildmenu
也非常有用。它可以在命令模式下完成标签的完成,以及使用它时所有可能匹配的非常有用的ncurses风格菜单。
答案 28 :(得分:8)
<强>:%S,/搜索,/替换,强>
您可以使用除 / «之外的其他字符来分隔替换模式。这样您就不必转义文件路径的斜杠。
答案 29 :(得分:7)
<强> CW 强>
更改单词 - 删除光标下的单词并将您置于插入模式以键入新单词。当然,这适用于其他移动键,因此您可以执行 c $ 之类的操作来更改为行尾。
f +字符
在当前行上查找下一个字符。因此,您可以执行 vft 选择当前行中下一个“t”的所有文本。它是另一个移动键,因此它也适用于其他命令。
答案 30 :(得分:7)
:x #(Save and Quit a File)
相同:wq或ZZ
答案 31 :(得分:7)
标签式界面
除了拆分Windows,您还可以使用选项卡式Windows。在转义模式下,键入:tabnew。您可以像这样打开多个标签。要在选项卡之间导航,请键入tabn。这将移至下一个标签。要移至选项卡式窗口,请键入:tabn2以移动第二个选项卡,依此类推。
要关闭标签,请键入:tabc或:tabclose或just:close。
如果你在终端模拟器(基本上是GUI中的终端),那么你可以尝试做:set mouse = a。完成后,您可以使用鼠标在编辑器内单击。这也可以帮助您通过单击在标签之间导航,也可以通过单击右侧的关闭按钮来关闭标签。
对齐您的代码 - 完整档案
只需在转义模式中键入G = gg。
折叠您的代码
假设您有一个已完成的功能。您希望最小化(或折叠)该部分代码,以便释放一些空间并减少混乱。只需选择代码即可。然后,输入:fold。
这将折叠代码。如果要扩展代码,只需转到那里,然后键入zo。要再次折叠,请键入zc。
答案 32 :(得分:6)
我很惊讶没有人提到Vim的窗口支持。 CTRL-W s
几乎每次打开vim时都会使用{<1}}。
答案 33 :(得分:5)
我经常为编辑任务创建函数,并将它们存储在我的.vimrc中,以便我可以再次找到它们。例如,读取已转换为单行的.Net callstack:
function! FixCallStacks()
:%s;\[NLN\];\r;g
:%s;\[TAB\];\t;g
endfunction
答案 34 :(得分:5)
:墙和墙:关闭所有分屏
答案 35 :(得分:5)
将xcramps的建议更进一步,我不能告诉你我使用了多少次:
:%!sort
对文件中的项目列表进行排序。
<强>详细信息:强>
:
范围!
命令
将在指定的行范围内执行shell命令。范围通常指定为 start ,
end
示例:
1,3
指定前3行'a,'b
选择书签a
和b
之间的文字.,$
选择整个文档(.
=第一行;$
=最后一行)
%
是.,$
的快捷方式,也可以整理整个文档。
随意混合搭配数字,书签,.
和$
。
答案 36 :(得分:4)
ma
move cursor down
:'a,.!program
这将在您将标记(ma)设置为当前行(。)的位置之间的所有文本,通过程序运行它,并用结果替换标记区域的内容。您甚至可以通过创建一个空行,然后将光标放在该行上来使用它来查看目录的内容(例如),
:.!ls
哦,你可以为a-z(即ma)和
设置这样的标记'a
会将您跳到标记为“a。”的位置。
/向前搜索,和?重复向后搜索而无需重新提供搜索模式。
Groovy的东西。 vi被低估了。一旦掌握了它,就不会想要使用IDE提供的编辑器。
答案 37 :(得分:4)
我在浏览vim帮助时发现了这个:
:help index
这会将您带到一个(可搜索的!)页面,其中包含所有模式的所有命令。
因此,如果您知道您尝试记住/学习的命令以某个击键开始或涉及某个击键,您可以搜索并翻转所有可能性。或者您可以浏览您感兴趣的模式,以查看/学习编辑的可能性。
我无法计算我完成:help CTRL-R
或其他任何事情的次数,并且只获得了第一件事,这当然不是你想要的。这比:helpgrep IMO要好得多。
修改强>
进入.vimrc:
nnoremap <silent> <F1> :help normal-index<CR>
inoremap <silent> <F1> <C-O>:help insert-index<CR>
:help
仍会让您进入默认的F1页面。
答案 38 :(得分:4)
评论一系列行:
首先在范围的开头设置书签:
ma
转到范围中的最后一行
:'a,.s/^/# /
假设#是你的评论字符。答案 39 :(得分:3)
:Te[xplore]
Tab&amp;探索(在生成浏览器窗口之前做一个tabnew)
答案 40 :(得分:3)
在bash中使用命令行上的vim-binding:
set -o vi
在其他使用readline的程序中,点击control-alt-j从emacs切换到vim绑定。
答案 41 :(得分:2)
在我们的软件商店中,需要对变量声明进行排序。在我们使用的语言中,多个变量可以出现在同一行上。
new var1,var2,var3,etc
通过视觉尝试对每个变量进行排序是一种真正的痛苦。 Vim中的块突出显示和排序命令是我的朋友:
仅当它们在底层系统上存在“排序”命令时才会起作用。
答案 42 :(得分:1)
我知道这不完全是vim。但我发现cscope集成非常好,并且在攻击Linux内核时它对我有很大帮助。
Ctrl- \ g来达到函数的定义 按Ctrl- \ s查找函数/宏/变量的所有用法。
答案 43 :(得分:0)
设置确认允许您使用:q 优雅地退出vim。您不需要使用 ZZ 或其他盲目保存或放弃所有更改的严厉机制。
答案 44 :(得分:-2)
对于强迫性的vim配置,请查看https://github.com/jmcantrell/dotfiles-vim