人们谈论常见技巧的问题很多,特别是“Vim+ctags提示和技巧”。
然而,我并没有提到Vim新手会觉得很酷的常用快捷方式。我所说的是一位经验丰富的Unix用户(无论是开发人员、管理员,还是两者都有),他们认为自己知道99%的人从未听说过或梦想过的东西。这不仅让他们的工作更容易,而且很酷,很粗糙。毕竟,Vim位于世界上最黑暗的角落丰富的操作系统中,因此它应该具有只有少数特权人士知道并想与我们分享的复杂性。
人们谈论常见技巧的问题很多,特别是“Vim+ctags提示和技巧”。
然而,我并没有提到Vim新手会觉得很酷的常用快捷方式。我所说的是一位经验丰富的Unix用户(无论是开发人员、管理员,还是两者都有),他们认为自己知道99%的人从未听说过或梦想过的东西。这不仅让他们的工作更容易,而且很酷,很粗糙。毕竟,Vim位于世界上最黑暗的角落丰富的操作系统中,因此它应该具有只有少数特权人士知道并想与我们分享的复杂性。
当前回答
为vim 7.3设置colorcolumn=+1或设置cc=+1
其他回答
:r! <command>
将外部命令的输出粘贴到缓冲区中。
做一些数学运算,直接在文本中得到结果:
:r! echo $((3 + 5 + 8))
获取编写Makefile时要编译的文件列表:
:r! ls *.c
不要在维基百科上查找你阅读的事实,直接将其粘贴到你正在编写的文档中:
:r! lynx -dump http://en.wikipedia.org/wiki/Whatever
:设置本地自动读取
自动重新加载当前缓冲区。。在查看日志文件时特别有用,它几乎可以从vim中为unix中的“tail”程序提供功能。
从vim中检查编译错误。根据perl语言设置makeprg变量
:setlocal makeprg=perl\-c\%
对于PHP
设置makeprg=php\-l\%设置错误格式=%m\\%f\\line\%l
发出“:make”将运行相关的makeprg,并在快速修复窗口中显示编译错误/警告,并可以轻松导航到相应的行号。
以下两项都不是真正的顽固,但我发现它非常有用。
琐碎的捆绑,但我不能没有。它在插入模式下启用hjkl风格的移动(使用ctrl键)。在正常模式下:ctrl-k/j向上/向下滚动半个屏幕,ctrl-l/h转到下一个/上一个缓冲区。µ和ù映射特别适用于AZERTY键盘,并转到下一个/上一个错误。
imap <c-j> <Down>
imap <c-k> <Up>
imap <c-h> <Left>
imap <c-l> <Right>
nmap <c-j> <c-d>
nmap <c-k> <c-u>
nmap <c-h> <c-left>
nmap <c-l> <c-right>
nmap ù :cp<RETURN>
nmap µ :cn<RETURN>
我编写了一个小函数来突出显示函数、全局、宏、结构和typedef。(对于非常大的文件可能会很慢)。每种类型都有不同的突出显示(请参阅“:help group name”了解当前颜色主题的设置)用法:使用ww(默认“\ww”)保存文件。你需要做这个。
nmap <Leader>ww :call SaveCtagsHighlight()<CR>
"Based on: http://stackoverflow.com/questions/736701/class-function-names-highlighting-in-vim
function SaveCtagsHighlight()
write
let extension = expand("%:e")
if extension!="c" && extension!="cpp" && extension!="h" && extension!="hpp"
return
endif
silent !ctags --fields=+KS *
redraw!
let list = taglist('.*')
for item in list
let kind = item.kind
if kind == 'member'
let kw = 'Identifier'
elseif kind == 'function'
let kw = 'Function'
elseif kind == 'macro'
let kw = 'Macro'
elseif kind == 'struct'
let kw = 'Structure'
elseif kind == 'typedef'
let kw = 'Typedef'
else
continue
endif
let name = item.name
if name != 'operator=' && name != 'operator ='
exec 'syntax keyword '.kw.' '.name
endif
endfor
echo expand("%")." written, tags updated"
endfunction
我有编写大量代码和函数的习惯,我不喜欢为它们编写原型。所以我做了一些函数,在C样式源文件中生成原型列表。它有两种风格:一种是删除形式参数的名称,另一种是保留它。每次需要更新原型时,我都会刷新整个列表。它避免了原型和函数定义不同步。还需要ctags。
"Usage: in normal mode, where you want the prototypes to be pasted:
":call GenerateProptotypes()
function GeneratePrototypes()
execute "silent !ctags --fields=+KS ".expand("%")
redraw!
let list = taglist('.*')
let line = line(".")
for item in list
if item.kind == "function" && item.name != "main"
let name = item.name
let retType = item.cmd
let retType = substitute( retType, '^/\^\s*','','' )
let retType = substitute( retType, '\s*'.name.'.*', '', '' )
if has_key( item, 'signature' )
let sig = item.signature
let sig = substitute( sig, '\s*\w\+\s*,', ',', 'g')
let sig = substitute( sig, '\s*\w\+\(\s)\)', '\1', '' )
else
let sig = '()'
endif
let proto = retType . "\t" . name . sig . ';'
call append( line, proto )
let line = line + 1
endif
endfor
endfunction
function GeneratePrototypesFullSignature()
"execute "silent !ctags --fields=+KS ".expand("%")
let dir = expand("%:p:h");
execute "silent !ctags --fields=+KSi --extra=+q".dir."/* "
redraw!
let list = taglist('.*')
let line = line(".")
for item in list
if item.kind == "function" && item.name != "main"
let name = item.name
let retType = item.cmd
let retType = substitute( retType, '^/\^\s*','','' )
let retType = substitute( retType, '\s*'.name.'.*', '', '' )
if has_key( item, 'signature' )
let sig = item.signature
else
let sig = '(void)'
endif
let proto = retType . "\t" . name . sig . ';'
call append( line, proto )
let line = line + 1
endif
endfor
endfunction
de按删除单词末尾的所有内容。在你心中的愿望。
ci(xyz[Esc]——这是一个奇怪的例子。这里,“i”并不意味着插入模式。相反,它意味着在括号内。因此,这个序列剪切了括号内的文本,并将其替换为“xyz”。它也适用于方括号和数字括号内——只需相应地执行ci[或ci{。自然,您可以执行di(如果你只想删除所有文本而不键入任何内容。如果你想删除括号而不仅仅是括号内的文本,你也可以用a代替i。
ci“-剪切当前引号中的文本
ciw-剪切当前单词。这与前一个工作原理相同,只是(被替换为w。
C-切割线路的其余部分并切换到插入模式。
ZZ—保存并关闭当前文件(关闭当前选项卡的速度比Ctrl-F4快得多!)
ddp-将当前行向下移动一行
xp—将当前字符向右移动一个位置
U-大写,所以viwU大写
~-切换大小写,因此viw~将反转整个单词的大小写
Ctrl+u/Ctrl+d向上或向下滚动页面半个屏幕。这似乎比通常的全屏分页更有用,因为它更容易看到两个屏幕之间的关系。对于那些仍然希望一次滚动整个屏幕的用户,Ctrl+f表示向前,Ctrl+b表示向后。Ctrl+Y和Ctrl+E一次向下或向上滚动一行。
疯狂但非常有用的命令是zz——它滚动屏幕使这一行显示在在中间。这非常适合将您正在处理的代码放在您的注意力中心。Sibling命令——zt和zb——使这一行成为sreen上的最上面或最下面的一行,这并不太有用。
%找到并跳转到匹配的括号。
de--从光标删除到单词末尾(也可以执行de删除,直到下一个空格)
bde--删除当前单词,从左到右分隔符
df[space]—删除直到并包括下一个空格
日期——删除到下一个点
dd--删除整行
ye(或ye)--将文本从这里拖到单词末尾
ce-贯穿单词的结尾
bye--复制当前单词(让我想知道“hi”是什么意思!)
yy--复制当前行
cc——剪切当前行,也可以改为S。还有较低的大写字母,用于剪切当前字符并切换到插入模式。
viwy或viwc。修改或更改当前单词。多次单击w以继续选择每个后续单词,使用b向后移动
vi{-选择图括号中的所有文本。va{-选中包括{}s的所有文本
vi(p-突出显示()s中的所有内容,并替换为粘贴的文本
b和e一个字一个字地移动光标,类似于Ctrl+箭头通常的操作。但是,单词的定义有点不同,因为连续的几个三角形被视为一个单词。如果你从一个单词的中间开始,按b键将始终转到当前单词的开头,而每个连续的b键将跳转到下一个单词开头。同样,容易记住的是,e将光标指向当前单词的末尾,以及随后的每个单词。
与b/e类似,大写字母b和e仅使用空格作为分隔符逐词移动光标。
大写D(深呼吸)删除光标右侧的行的其余部分,与普通编辑器中的Shift+End/Del相同(注意2个键--Shift+D--而不是3)
为了使vim更像一个IDE编辑器:
为左边空白处的行号设置nu。set cul-高亮显示包含光标的行。