我听过很多关于Vim的消息,包括优点和缺点.看起来你应该(作为开发人员)使用Vim比使用任何其他编辑器更快.我正在使用Vim来做一些基本的东西,而且我最好用Vim的效率低 10倍.
当你谈论速度时你应该关心的两件事(你可能不太关心它们,但你应该这么做)是:
这里有两个例子,说明为什么我对Vim的效率低得多.
复制/剪切和粘贴.我一直这样做.使用所有当代编辑器,您可以Shift 用左手按下,然后用右手移动光标以选择文本.然后Ctrl+ C副本,你移动光标和Ctrl+ V贴.
有了Vim,它太可怕了:
yy 复制一行(你几乎不想要整行!)[number xx]yy将xx行复制到缓冲区中.但你永远不知道你是否选择了你想要的东西.我经常做的[number xx]dd,然后u撤消!另一个例子?搜索和替换.
/,然后键入要搜索的内容,然后如果\在每个特殊字符前放置了一些特殊字符,则按Enter.与Vim的一切都是这样的:似乎我不知道如何以正确的方式处理它.
我的问题是:
你使用Vim的方式是什么让你比现代编辑更有效率?
Jim*_*nis 2862
你提到切割yy并抱怨你几乎从不想切割整条线.事实上,编程源代码的程序员经常想要在整行,行范围和代码块上工作.但是,yy只是将文本移入匿名复制缓冲区(或在vi中调用"注册")的许多方法之一.
vi的"禅" 是你说的一种语言.最初y是一个动词.该声明yy是其同义词y_.将y是成倍上涨,使之更容易输入,因为它是这样一个常见的操作.
这也可以表示为dd P(删除当前行并将副本粘贴回原位;将副本留在匿名寄存器中作为副作用).在y与d"动词"采取任何行动作为他们的"主题".因此yW,"从这里(光标)猛拉到当前/下一个(大)单词的结尾",y'a并且"从这里拉到包含名为' a ' 的标记的行."
如果您只了解基本的向上,向下,向左和向右光标移动,那么vi将不会比您的"记事本"副本更高效.(好吧,你仍然会有语法高亮和处理文件大于大约45KB左右的文件;但是在这里和我一起工作).
vi有26个"标记"和26个"寄存器".使用该m命令将标记设置为任何光标位置.每个标记由单个小写字母指定.因此ma将" a "标记设置为当前位置,并mz设置" z "标记.您可以使用'(单引号)命令移动到包含标记的行.因此'a移动到包含' a '标记的行的开头.您可以使用`(反引号)命令移动到任何标记的精确位置.因此`z将直接移动到' z '标记的确切位置.
因为这些是"运动",所以它们也可以用作其他"陈述"的主题.
因此,削减任意文本选择的一种方法是删除标记(我通常使用' a '作为我的"第一"标记,' z '作为我的下一个标记,' b '作为另一个标记,' e '作为另一个(我不记得曾经在使用vi的 15年中交互式地使用了超过四个标记;一个人创建了一个关于如何不干扰一个人的交互环境的宏使用标记和寄存器的约定.)然后我们去到我们想要的文本的另一端;我们可以从任何一端开始,没关系.然后我们可以简单地使用d`a剪切或y`a复制.因此整个过程有5个击键开销(如果我们开始"插入"则为6个) "模式并需要Esc输出命令模式."一旦我们剪切或复制,然后粘贴副本是一个单击:p.
我说这是剪切或复制文本的一种方法.但是,它只是其中之一.通常,我们可以更简洁地描述文本范围,而无需移动光标并删除标记.例如,如果我在文本段落中,我可以分别使用{和}移动到段落的开头或结尾.因此,为了移动一段文字,我使用{ d}(3次击键)剪切它.(如果我碰巧已经在段落的第一行或最后一行,那么我可以简单地使用d}或d{分别使用.
"段落"的概念默认为通常直观合理的东西.因此它通常适用于代码和散文.
我们经常知道一些模式(正则表达式),它标记了我们感兴趣的文本的一端或另一端.向前或向后搜索是vi中的移动.因此,它们也可以在我们的"陈述"中用作"主语".所以我可以使用d/foo从当前行切换到包含字符串"foo"的下一行,并y?bar从当前行复制到包含"bar"的最新(上一行)行.如果我不想要整行,我仍然可以使用搜索动作(作为他们自己的语句),删除我的标记并使用`x前面描述的命令.
除了"动词"和"主语"之外,vi还具有"对象"(在术语的语法意义上).到目前为止,我只描述了匿名寄存器的使用.但是,我可以通过在"对象"引用前加上"(双引号修饰符)来使用26个"命名"寄存器中的任何一个.因此,如果我使用"add我将当前行切换到' a '寄存器,如果我使用"by/foo那么我将从这里将文本的副本拖到包含"foo"的下一行到' b '寄存器中.要从寄存器中粘贴,我只需使用相同的修饰符序列为粘贴添加前缀:"ap将" a "寄存器内容"bP的副本粘贴到光标后面的文本中,并将副本从" b " 粘贴到当前行之前.
这种"前缀"概念还将语法"形容词"和"副词"的类似物添加到我们的文本操作语言中.大多数命令(动词)和动作(动词或对象,取决于上下文)也可以使用数字前缀.3J表示"加入接下来的三行",d5}表示"从当前行到第五段末尾从此处删除".
这都是中级vi.它们都不是特定于Vim的,如果您准备好学习它们,那么vi中有更多高级技巧.如果您只掌握这些中间概念,那么您可能会发现很少需要编写任何宏,因为文本操作语言足够简洁和富有表现力,可以使用编辑器的"本机"语言轻松完成大多数事情.
有许多:命令,最值得注意的是:% s/foo/bar/g全局替换技术.(这不是先进的,但其他:命令可以).整个:命令集在历史上由vi以前的版本继承为ed(行编辑器)和后来的ex(扩展行编辑器)实用程序.实际上vi是如此命名的,因为它是ex的可视化界面.
:命令通常在文本行上运行. ed和ex是在终端屏幕不常见且许多终端都是"电传打字"(TTY)设备的时代写的.所以通常使用文本的打印副本,通过极其简洁的界面使用命令(常见的连接速度为110波特,或大约每秒11个字符 - 这比快速打字员要慢;通常滞后很常见)多用户交互式会话;另外,通常有一些节省纸张的动机).
因此,大多数:命令的语法包括地址或地址范围(行号),后跟命令.当然,人们可以使用文字行号::127,215 s/foo/bar在127和215之间的每一行上将第一次出现的"foo"改为"bar".也可以分别使用一些缩写,例如.或$分别用于当前和最后一行.也可以使用相对前缀+并-分别在有效线之前或之前引用偏移.因此::.,$j意思是"从当前行到最后一行,将它们全部连接成一行". :%是:1,$(所有行)的同义词.
在:... g和:... v他们是非常强大的命令承担一些解释. :... g是"全局"的前缀,用于将后续命令应用于与模式(正则表达式)匹配的所有行,同时:... v将这样的命令应用于与给定模式不匹配的所有行(来自"conVerse"的"v").与其他ex命令一样,这些命令可以通过寻址/范围引用作为前缀.因此:.,+21g/foo/d意味着"删除包含字符串"foo"的任何行,从当前的一行到下一行21",同时:.,$v/bar/d意味着"从这里到文件的末尾",删除任何不包含字符串"bar"的行.
有趣的是,常见的Unix命令grep实际上是受这个ex命令启发的(并且以它的记录方式命名).该前命令:g/re/p(grep的)是他们记载如何"全局","正则表达式打印"包含线""(重新)的方式.当使用ed和ex时,该:p命令是任何人学习的第一个命令,通常是编辑任何文件时使用的第一个命令.这是你打印当前内容的方式(通常只使用一页:.,+25p或一些这样的页面).
请注意:% g/.../d或(它的reVerse/conVerse对应::% v/.../d是最常见的使用模式.但是还有一些ex值得记住的其他命令:
我们可以m用来移动线条和j连接线条.例如,如果你有一个列表并且想要将所有匹配的东西分开(或者相反地不匹配某些模式)而不删除它们,那么你可以使用类似的东西::% g/foo/m$...并且所有"foo"行都将被移动到文件的结尾.(注意关于使用文件末尾作为临时空间的另一个提示).这将保留所有"foo"行的相对顺序,同时从列表的其余部分中提取它们.(这相当于执行以下操作1G!GGmap!Ggrep foo<ENTER>1G:1,'a g/foo'/d:(将文件复制到自己的尾部,过滤尾部grep,并从头部删除所有内容).
为了连接线,通常我可以找到需要连接到其前任的所有线的模式(例如,所有以"^"开头的行而不是某些项目符号列表中的"^*").对于这种情况,我会使用:( :% g/^ /-1j对于每个匹配的行,上一行并加入它们).(顺便说一句:对于子弹名单试图寻找子弹线,并加入到下的一对夫妇的原因不工作...它可以加入一个子弹一行到另一个,而且不会加入任何子弹线,所有的它的延续;它只会在匹配上成对使用).
几乎不用说,你可以使用我们的老朋友s(替代)g和v(global/converse-global)命令.通常你不需要这样做.但是,请考虑某些情况,您只想在匹配其他模式的行上执行替换.通常,您可以使用带有捕获的复杂模式,并使用返回引用来保留您不想更改的行的部分.但是,将匹配与替换分开通常会更容易::% g/foo/s/bar/zzz/g- 对于包含"foo"的每一行,将所有"bar"替换为"zzz".(类似的:% s/\(.*foo.*\)bar\(.*\)/\1zzz\2/g情况只适用于那些"bar"在同一条线上被"foo"预告的情况;它已经足够笨拙了,并且必须进一步修复以捕获所有"bar"之前的情况"富")
问题的关键是,有不仅仅是p,s以及d在线路ex命令集.
该:地址也可以参考标志.因此:'a,'bg/foo/j,如果它位于' a '和' b '标记之间的行之间,则可以使用:将包含字符串foo的任何行连接到其后续行.(是的,所有前面的ex命令示例都可以通过添加这些类型的寻址表达式来限制文件行的子集).
这是非常模糊的(在过去的15年里,我只使用了几次这样的东西).但是,我会自由地承认,如果我花时间思考正确的咒语,我经常以迭代和交互方式做事,这可能会更有效率地完成.
另一个非常有用的vi或ex命令是:r读入另一个文件的内容.因此::r foo在当前行插入名为"foo"的文件的内容.
:r!命令更强大.这将读取命令的结果.它与暂停vi会话,运行命令,将其输出重定向到临时文件,恢复vi会话以及从temp中读取内容相同.文件.
!(bang)和:... !(ex bang)命令更强大.这些也执行外部命令并将结果读入当前文本.但是,他们还通过命令过滤我们文本的选择!我们可以使用1G!Gsort(G是vi "goto"命令对文件中的所有行进行排序;它默认为转到文件的最后一行,但可以用行号作为前缀,例如1,第一行).这相当于ex变体:1,$!sort.作者经常使用!Unix fmt或fold实用程序来重新格式化或"自动换行"选择文本.一个非常常见的宏是{!}fmt(重新格式化当前段落).程序员有时会使用它来通过缩进或其他代码重新格式化工具来运行代码,或者只是部分代码.
使用:r!和!命令意味着可以将任何外部实用程序或过滤器视为编辑器的扩展.我偶尔使用这些脚本从数据库中提取数据,或者使用从网站上提取数据的wget或lynx命令,或从远程系统中提取数据的ssh命令.
另一个有用的ex命令是:so(简称:source).这将读取文件的内容作为一系列命令.当你正常启动vi时,隐式地执行:sourceon ~/.exinitrc文件(Vim通常会自动执行此操作~/.vimrc,自然就足够了).使用此方法的是,您可以通过简单地获取一组新的宏,缩写和编辑器设置来动态更改编辑器配置文件.如果您偷偷摸摸,您甚至可以将其用作存储前编辑命令序列的技巧,以便按需应用于文件.
例如,我有一个七行文件(36个字符),它通过wc运行一个文件,并在包含该字数统计数据的文件顶部插入一个C风格的注释.我可以使用如下命令将"宏"应用于文件:vim +'so mymacro.ex' ./mytarget
(vi和Vim的+命令行选项通常用于在给定的行号处开始编辑会话.但是,一个鲜为人知的事实是,可以遵循任何有效的ex命令/表达式,例如"source"命令,如我在这里完成了;举一个简单的例子,我有调用的脚本:在我重新映像一组服务器时,以非交互方式从我的SSH已知主机文件中删除一个条目.+vi +'/foo/d|wq!' ~/.ssh/known_hosts
通常使用Perl,AWK,sed编写这样的"宏"要容易得多(事实上,就像grep是受ed命令启发的实用程序).
该@命令可能是最模糊的vi命令.偶尔教授近十年的高级系统管理课程,我遇到的人很少见过. @执行寄存器的内容,就像它是vi或ex命令一样.
示例:我经常使用::r!locate ...在我的系统上查找某个文件并将其名称读入我的文档.从那里我删除任何无关的命中,只留下我感兴趣的文件的完整路径.而不是费力地Tab遍历路径的每个组件(或者更糟糕的是,如果我碰巧卡在没有Tab完成支持的机器上在其vi副本中我只是使用:
0i:r(将当前行转换为有效的:r命令),"cdd (删除行到"c"寄存器)和@c 执行该命令.这只是10次击键(表达式"cdd @c对我来说实际上是一个手指宏,因此我几乎可以像任何常见的六个字母一样快速输入).
我只是抓住了vi的力量,我在这里所描述的一切都不是vim命名的"改进"的一部分!我在这里描述的所有内容都应该适用于20或30年前的任何旧版本的vi.
有些人比以往任何时候都更多地使用了vi的力量.
CMS*_*CMS 505
你在谈论文本选择和复制,我认为你应该看看Vim可视模式.
在可视模式下,您可以使用Vim命令选择文本,然后您可以使用选择执行任何操作.
请考虑以下常见情况:
您需要选择下一个匹配的括号.
你可以这样做:
v% 如果光标在开始/结束括号上vib 如果光标在括号内
您想要在引号之间选择文本:

你想选择一个花括号块(在C风格的语言中很常见):
viBvi{
您想要选择整个文件:
ggVG 可视块选择是另一个非常有用的功能,它允许您选择文本的矩形区域,您只需按Ctrl- V启动它,然后选择所需的文本块并执行任何类型的操作,如yank,delete,粘贴,编辑等.编辑面向列的文本非常棒.

vdb*_*oor 207
一些生产力提示:
聪明的动作
*并 #向前/向后搜索光标下的单词.w 到下一个字W 到下一个以空格分隔的单词b/ e到当前单词的开头/结尾.(B/ E仅用于空格分隔)gg/ G跳转到文件的开头/结尾.% 跳转到匹配的{..}或(..)等.{/ }跳到下一段.'. 跳回到最后编辑的行.g; 跳回最后编辑的位置.快速编辑命令
I 在开头插入.A 追加到底.o/ O在当前之后/之前打开一个新行.v/ V/ Ctrl+V视频模式(选择文本!)Shift+R 替换文字C 改变线的剩余部分.组合命令
大多数命令接受数量和方向,例如:
cW =改变直到结束3cW =改变3个字BcW =开始全字,改变全字ciW =改变内心的话.ci" =改变".."之间的内在ci( =更改文本(..)ci<=在<..>之间更改文本(需要set matchpairs+=<:>在vimrc中)4dd =删除4行3x =删除3个字符.3s =替换3个字符.有用的程序员命令
r替换一个字符(例如rd替换当前的字符d).~ 改变案例.J 加入两行. 重复上一个命令(一个简单的宏)== 修复行缩进> 缩进块(在可视模式下)< unindent block(在可视模式下)宏录制
q[ key ]开始录制.q停止录制.@[ key ].通过使用非常具体的命令和动作,VIM可以为下一行重播那些确切的动作.(例如A用于追加到结尾,b/ e用于将光标分别移动到单词的开头或结尾)
精心设置的设置示例
# reset to vim-defaults
if &compatible # only if not set before:
set nocompatible # use vim-defaults instead of vi-defaults (easier, more user friendly)
endif
# display settings
set background=dark # enable for dark terminals
set nowrap # dont wrap lines
set scrolloff=2 # 2 lines above/below cursor when scrolling
set number # show line numbers
set showmatch # show matching bracket (briefly jump)
set showmode # show mode in status bar (insert/replace/...)
set showcmd # show typed command in status bar
set ruler # show cursor position in status bar
set title # show file in titlebar
set wildmenu # completion with menu
set wildignore=*.o,*.obj,*.bak,*.exe,*.py[co],*.swp,*~,*.pyc,.svn
set laststatus=2 # use 2 lines for the status bar
set matchtime=2 # show matching bracket for 0.2 seconds
set matchpairs+=<:> # specially for html
# editor settings
set esckeys # map missed escape sequences (enables keypad keys)
set ignorecase # case insensitive searching
set smartcase # but become case sensitive if you type uppercase characters
set smartindent # smart auto indenting
set smarttab # smart tab handling for indenting
set magic # change the way backslashes are used in search patterns
set bs=indent,eol,start # Allow backspacing over everything in insert mode
set tabstop=4 # number of spaces a tab counts for
set shiftwidth=4 # spaces for autoindents
#set expandtab # turn a tabs into spaces
set fileformat=unix # file mode is unix
#set fileformats=unix,dos # only detect unix file format, displays that ^M with dos files
# system settings
set lazyredraw # no redraws in macros
set confirm # get a dialog when :q, :w, or :wq fails
set nobackup # no backup~ files.
set viminfo='20,\"500 # remember copy registers after quitting in the .viminfo file -- 20 jump links, regs up to 500 lines'
set hidden # remember undo after quitting
set history=50 # keep 50 lines of command history
set mouse=v # use mouse in visual mode (not normal,insert,command,help mode
# color settings (if terminal/gui supports it)
if &t_Co > 2 || has("gui_running")
syntax on # enable colors
set hlsearch # highlight search (very useful!)
set incsearch # search incremently (search while typing)
endif
# paste mode toggle (needed when using autoindent/smartindent)
map <F10> :set paste<CR>
map <F11> :set nopaste<CR>
imap <F10> <C-O>:set paste<CR>
imap <F11> <nop>
set pastetoggle=<F11>
# Use of the filetype plugins, auto completion and indentation support
filetype plugin indent on
# file type specific settings
if has("autocmd")
# For debugging
#set verbose=9
# if bash is sh.
let bash_is_sh=1
# change to directory of current file automatically
autocmd BufEnter * lcd %:p:h
# Put these in an autocmd group, so that we can delete them easily.
augroup mysettings
au FileType xslt,xml,css,html,xhtml,javascript,sh,config,c,cpp,docbook set smartindent shiftwidth=2 softtabstop=2 expandtab
au FileType tex set wrap shiftwidth=2 softtabstop=2 expandtab
# Confirm to PEP8
au FileType python set tabstop=4 softtabstop=4 expandtab shiftwidth=4 cinwords=if,elif,else,for,while,try,except,finally,def,class
augroup END
augroup perl
# reset (disable previous 'augroup perl' settings)
au!
au BufReadPre,BufNewFile
\ *.pl,*.pm
\ set formatoptions=croq smartindent shiftwidth=2 softtabstop=2 cindent cinkeys='0{,0},!^F,o,O,e' " tags=./tags,tags,~/devel/tags,~/devel/C
# formatoption:
# t - wrap text using textwidth
# c - wrap comments using textwidth (and auto insert comment leader)
# r - auto insert comment leader when pressing <return> in insert mode
# o - auto insert comment leader when pressing 'o' or 'O'.
# q - allow formatting of comments with "gq"
# a - auto formatting for paragraphs
# n - auto wrap numbered lists
#
augroup END
# Always jump to the last known cursor position.
# Don't do it when the position is invalid or when inside
# an event handler (happens when dropping a file on gvim).
autocmd BufReadPost *
\ if line("'\"") > 0 && line("'\"") <= line("$") |
\ exe "normal g`\"" |
\ endif
endif # has("autocmd")
Run Code Online (Sandbox Code Playgroud)
设置可以存储在~/.vimrc系统中,也可以存储在系统中/etc/vimrc.local,然后通过以下方式从/etc/vimrc文件中读取:
source /etc/vimrc.local
Run Code Online (Sandbox Code Playgroud)
(您必须更换#注释字符"才能使其在VIM中工作,我想在此处提供正确的语法突出显示).
我在这里列出的命令非常基本,到目前为止我使用的主要命令.他们已经让我更有成效,而不必知道所有花哨的东西.
kev*_*kev 98
的Control+ R机制是非常有用的:-)在任一插入模式或命令模式(即,在:线路输入命令时),继续进行编号或命名的寄存器:
请参阅:help i_CTRL-R并:help c_CTRL-R了解更多详情,并在附近窥探更多CTRL-R的优点.
Ben*_*son 91
这里有很多好的答案,还有一个关于vi禅的惊人答案.我没有看到提到的一件事是vim通过插件是非常可扩展的.有脚本和插件可以让它做原始作者从未考虑过的各种疯狂的事情.以下是一些非常方便的vim插件示例:
Rails.vim是由tpope编写的插件.对于进行rails开发的人来说,这是一个令人难以置信的工具.它做了神奇的上下文敏感的事情,允许您轻松地从控制器中的方法跳转到关联的视图,到模型,然后到该模型的单元测试.作为rails开发人员,它已经节省了数十个甚至数百小时.
此插件允许您以可视模式选择文本区域,并键入快速命令将其发布到gist.github.com.这样可以轻松访问pastebin,如果您通过IRC或IM与某人合作,这将非常方便.
此插件为空格键提供特殊功能.它将空格键变成类似于句点的东西,但不是重复动作而是重复动作.这对于以动态定义的方式快速浏览文件非常方便.
此插件使您能够处理以某种方式分隔的文本.它为您提供了表示内容中的内容,引号内的内容等的对象.它可以派上用场来操作分隔文本.
此脚本为vim带来了精美的选项卡完成功能.自动完成的东西已经存在于vim的核心,但这会将它带到快速选项卡而不是多个不同的多键快捷方式.非常方便,使用起来非常有趣.虽然它不是VS的智能感知,但它是一个很好的一步,它带来了你希望从标签完成工具中获得的大量功能.
该工具将外部语法检查命令带入vim.我没有亲自使用它,但我听说过它很棒,这个概念很难被击败.无需手动检查语法就可以节省大量时间,并且可以帮助您在引入语法错误时捕获语法错误,而不是在最终停止测试时.
从vim内部直接访问git.同样,我没有使用过此插件,但我可以看到实用程序.不幸的是,我处在一种svn被认为是"新"的文化中,所以我很可能会在相当长一段时间内看到git在工作.
vim的树浏览器.我最近开始使用它,它非常方便.它允许您将树视图放在垂直拆分中并轻松打开文件.这对于包含大量源文件的项目非常有用.
这是一个不受维护的插件,但仍然非常有用.它提供了使用"模糊"描述语法打开文件的功能.这意味着在稀疏的文件树中,您只需键入足够的字符来消除您对其余部分感兴趣的文件的歧义.
vim有很多令人难以置信的工具.我敢肯定,我只是在这里表面上看,并且非常值得搜索适用于您的域名的工具.传统vi强大的工具集,vim对它的改进,以及进一步扩展vim的插件的组合,它是编辑曾经构思过的文本的最强大的方法之一.Vim很容易像emacs,eclipse,visual studio和textmate一样强大.
感谢duwanis他的vim配置,我从中学到了很多,并借用了这里列出的大部分插件.
小智 53
. 重复上一个文本更改命令
我用这个节省了很多时间.
之前提到过可视模式,但在文本文件中编辑固定大小的列时,块可视模式为我节省了大量时间.(使用Ctrl-V访问).
dim*_*mba 48
GI
转到上次编辑的位置(如果您执行了一些搜索并且想要返回编辑,则非常有用)
^ P和^ N.
完成上一个(^ P)或下一个(^ N)文本.
^ O和^ I
转到上一个(^O- "O"旧)位置或下一个(^I- "I"接近"O").当您执行搜索,编辑文件等时,您可以向前和向后浏览这些"跳转".
Ron*_*del 46
我最近(有)发现了这个网站:http://vimcasts.org/
这是非常新的,非常好.正在运行该站点的人从textmate切换到vim,并在特定的vim主题上提供非常好的和简洁的演员.看看这个!
hcs*_*s42 42
CTRL+A递增您所站的数字.
Eri*_*ith 38
全部处于正常模式:
f <char>移动到当前行上特定字符的下一个实例,并且; 重复.
F <char>移动到当前行上特定字符的前一个实例; 重复.
如果智能地使用,上面两个可以让你快速移动一行.
*在一个单词上搜索下一个实例.
#在单词上搜索上一个实例.
agf*_*fe2 34
一个.保存会议
:mks sessionname
湾 强制保存会话
:MKS!SESSIONNAME
C.加载会话
gvim或vim -S sessionname
一个.添加和减去
CTRL-A;将[count]添加到光标处或之后的数字或字母字符处.{不在Vi
CTRL-X;从光标处或之后的数字或字母字符中减去[count].{Vi无此功能}
湾 窗口键解除映射
在窗口中,Ctrl-A已映射为需要在rc文件中取消映射的整个文件选择.mark mswin.vim CTRL-作为注释的映射部分或使用unmap添加您的rc文件
C.随着宏
CTRL-A命令在宏中非常有用.示例:使用以下步骤创建编号列表.
- 创建第一个列表条目,确保它以数字开头.
- qa - 开始录制到缓冲区'a'
- Y - 猛拉参赛作品
- p - 将条目的副本放在第一个下面
- CTRL-A - 增加数字
- q - 停止录制
- @a - 重复猛拉,放置和增加时间
Dav*_*rby 32
上周,我们的项目从另一个项目继承了很多Python代码.遗憾的是,代码不适合我们现有的架构 - 它全部使用全局变量和函数完成,这在多线程环境中无效.
我们有大约80个文件需要重新编写为面向对象 - 所有函数都移动到类中,参数更改,导入语句添加等等.我们有一个列表,需要对每个文件执行大约20种类型的修复.我估计手工做一个人每天可能做2-4次.
所以我手工完成了第一个,然后编写了一个vim脚本来自动化更改.其中大部分是vim命令列表,例如
" delete an un-needed function "
g/someFunction(/ d
" add wibble parameter to function foo "
%s/foo(/foo( wibble,/
" convert all function calls bar(thing) into method calls thing.bar() "
g/bar(/ normal nmaf(ldi(`aPa.
Run Code Online (Sandbox Code Playgroud)
最后一个值得一点解释:
g/bar(/ executes the following command on every line that contains "bar("
normal execute the following text as if it was typed in in normal mode
n goes to the next match of "bar(" (since the :g command leaves the cursor position at the start of the line)
ma saves the cursor position in mark a
f( moves forward to the next opening bracket
l moves right one character, so the cursor is now inside the brackets
di( delete all the text inside the brackets
`a go back to the position saved as mark a (i.e. the first character of "bar")
P paste the deleted text before the current cursor position
a. go into insert mode and add a "."
Run Code Online (Sandbox Code Playgroud)
对于一些更复杂的转换,例如生成所有import语句,我将一些python嵌入到vim脚本中.
经过几个小时的工作后,我有一个脚本将至少完成95%的转换.我只是在vim中打开一个文件然后运行:source fixit.vim,文件在眨眼间转换.
我们仍然需要改变剩余的5%不值得自动化和测试结果的工作,但是通过花一天时间编写这个脚本,我估计我们已经节省了数周的工作.
当然,使用像Python或Ruby这样的脚本语言可以实现自动化,但是编写它会花费更长的时间并且灵活性会降低 - 最后一个例子本来就很困难,因为单凭正则表达式无法处理嵌套括号,例如转换bar(foo(xxx))为foo(xxx).bar().Vim非常适合这项任务.
sou*_*rge 28
使用内置文件资源管理器!该命令是:Explore,它允许您非常快速地浏览您的源代码.我在这里有这些映射.vimrc:
map <silent> <F8> :Explore<CR>
map <silent> <S-F8> :sp +Explore<CR>
Run Code Online (Sandbox Code Playgroud)
资源管理器也允许您进行文件修改.我会发布一些我最喜欢的按键,按下<F1>会给你完整列表:
cd ..)Jef*_*ege 25
我是美国密码学会的成员.双月刊杂志包括100多种各种密码.其中大约15个是"密码" - 用字母代替数字的各种类型的算术问题.其中两个或三个是sudokus,除了字母而不是数字.当网格完成时,九个不同的字母将拼写出一些或多个单词,在某些线条,对角线,螺旋等上,在网格中的某处.
我没有使用铅笔或手工输入问题,而是从他们网站的成员区域下载问题.
当使用这些sudokus时,我使用vi,因为我使用的是vi拥有的其他编辑器所拥有的设施.主要是将字母网格转换为编号网格,因为我发现它更容易解决,然后完成的编号网格返回字母网格以找到解决方案的单词.
问题被格式化为九组九个字母,-s代表空白,用两行写成.第一步是将这些格式化为九行,每行九个字符.这没有什么特别的,只需在适当的位置插入八个换行符.
结果将如下所示:
T-O-----C
-E-----S-
--AT--N-L
---NASO--
---E-T---
--SPCL---
E-T--OS--
-A-----P-
S-----C-T
Run Code Online (Sandbox Code Playgroud)
因此,将其转换为数字的第一步是列出不同的字母.首先,我复制一下这个块.我将光标定位在块的顶部,然后键入:y}}p. :让我进入命令模式,y猛拉下一个移动命令.由于}是移动到下一段的末尾,因此y}将该段落移动. }然后将光标移动到段落的末尾,并p粘贴我们刚刚在光标后拉出的东西.因此,y}}p创建下一段的副本,最后在两个副本之间使用光标.
接下来,我将其中一个副本转换为不同字母的列表.该命令有点复杂:
:!}tr -cd A-Z | sed 's/\(.\)/\1\n/g' | sort -u | tr -d '\n'
Run Code Online (Sandbox Code Playgroud)
:再次让我进入命令模式. !表示下一个yank的内容应该通过命令行传送. }猛拉下一段,然后在命令行使用tr命令,以汽提出除了大写字母应有尽有,sed命令打印在一行上的每个字母,并且sort向那些行进行排序的命令,删除重复,然后tr剔除换行符,将九个不同的字母留在一行中,替换原来构成段落的九行.在这种情况下,字母是:ACELNOPST.
下一步是制作网格的另一个副本.然后使用我刚刚确定的字母用1到9的数字替换每个字母.这很简单::!}tr ACELNOPST 0-9.结果是:
8-5-----1
-2-----7-
--08--4-3
---4075--
---2-8---
--7613---
2-8--57--
-0-----6-
7-----1-8
Run Code Online (Sandbox Code Playgroud)
然后可以通常的方式解决这个问题,或者输入您可能更喜欢的任何数独求解器.然后可以将完成的解决方案转换回字母:!}tr 1-9 ACELNOPST.
vi中的力量与极少数其他力量相匹配.最大的问题是,只有极少数的vi教程书籍,网站,帮助文件等,所做的不仅仅是触及可能的表面.
jqn*_*qno 23
批量文本操作!
通过宏:
qqq@q第一次),@@之后.20@@或者通过正则表达式:
:%s/[fo]+/bar/g(但要注意:如果你做后者,你将有2个问题:).)
Dav*_*ope 23
我最近发现了q:.它打开"命令窗口"并显示最近的ex-mode(命令模式)命令.您可以在窗口中照常移动,然后按下<CR>执行命令.你也可以编辑等.当你搞乱一些复杂的命令或正则表达式并且你不想重新输入整个事物,或者你想要做的复杂事情是3个命令时,我们无价.它几乎就像bash一样set -o vi,但对于vim本身(嘿!).
查看:help q:更多有趣的信息来回.
tfm*_*aes 20
这些不是快捷方式,但它们是相关的:
它们提高了我的生产力
小智 19
我经常使用的另一个有用的vi"快捷方式"是'xp'.这会将光标下的字符与下一个字符交换.
小智 18
<Ctrl> + W,V垂直分割屏幕
<Ctrl> + W,W在窗口之间切换
!python%[args]运行我在此窗口中编辑的脚本
ZF在可视模式下折叠任意线条
小智 18
视觉模式
正如其他几位人士所说,视觉模式是您复制/剪切和粘贴问题的答案.Vim给你'v','V'和Cv.vim中的小写'v'与记事本中的shift键基本相同.好消息是你不必把它压低.您可以使用任何移动技术有效地导航到选择的开始(或结束)点.然后点击"v",再次使用高效的移动技术导航到选择的另一端.然后'd'或'y'允许您剪切或复制该选择.
vim的视觉模式的优势超过了Jim Dennis对vi中剪切/复制/粘贴的描述,即你不必完全正确地获取位置.有时候使用快速移动来到达你想去的地方附近,然后通过其他动作进行优化,而不是想出一个更复杂的单一移动命令,让你准确到达你想去的地方.
以这种方式广泛使用可视化模式的缺点是,它可能成为您一直使用的拐杖,这会阻止您学习可能允许您更有效地执行操作的新vi(m)命令.但是,如果您非常积极地学习vi(m)的新方面,那么这可能不会对您产生太大影响.
我还将再次强调,视觉线和视觉块模式可以为您提供相同主题的变化,这些主题可以非常强大......尤其是视觉块模式.
关于键盘的有效使用
我也不同意你的说法,交替使用手是使用键盘的最快方法.它有一个真实的元素.一般来说,重复使用相同的东西是很慢的.这个原则的最重要的例子是用同一个手指键入的连续键击非常慢.你的断言可能源于在这种模式下使用s/finger/hand/transformation的自然倾向.在某种程度上它是正确的,但在效率谱的极高端,这是不正确的.
请问任何钢琴家.询问他们是否可以更快地连续交替使用几个音符或依次使用单手的连续手指.键入4次击键的最快方法不是交替,而是用同一只手的4个手指按升序或降序键入它们(称之为"运行").一旦你考虑到这种可能性,这应该是不言而喻的.
更困难的问题是为此进行优化.在键盘上优化绝对距离非常容易.Vim那样做.这是更难在"运行"级进行优化,但六(米),它的模式编辑给你能够做到这一点比任何非模态的方式有更好的机会(啊哈,emacs的)都做不到.
在Emacs上
为了避免emacs狂热者因为最后的括号评论完全无视我的整篇文章,我觉得我必须描述emacs和vim宗教之间差异的根源.我从未在编辑大战中说过话,我可能不会再这样做了,但我从来没有听过有人用这种方式描述差异,所以就这样吧.区别在于以下权衡:
Vim为您提供无与伦比的原始文本编辑效率Emacs为您提供了无与伦比的自定义和编程编辑器的能力
盲人vim狂热者会声称vim有脚本语言.但它是一种模糊的,特殊的语言,旨在为编辑服务.Emacs有Lisp!说够了.如果你不理解最后两句话的意义,或者想要充分学习函数式编程和Lisp来发展这种欣赏,那么你应该使用vim.
emacs狂热者将声称emacs具有viper模式,因此它是vim的超集.但是viper模式并不标准.我的理解是大多数emacs用户都没有使用viper模式.由于它不是默认值,因此大多数emacs用户可能不会对模态范例的好处产生真正的认识.
在我看来,这些差异是正交的.我相信vim和emacs的好处,正如我所说的那样,都是有效的.这意味着终极编辑器尚不存在.emacs可能是最简单的平台,可以作为最终编辑器的基础.但模态编辑并没有在emacs心态中根深蒂固.emacs社区可能会在未来以这种方式移动,但这似乎不太可能.
因此,如果您想要原始编辑效率,请使用vim.如果您想要编写脚本和编程的最终环境,请使用emacs.如果您希望其中一些都强调可编程性,请使用带有viper模式的emacs(或编写您自己的模式).如果你想要两全其美,那你现在运气不好.
kon*_*ryd 17
花费30分钟做vim教程(在终端中运行vimtutor而不是vim).您将学习基本动作和一些击键,这将使您至少与vim一样高效,就像您之前使用的文本编辑器一样.在那之后,再次阅读Jim Dennis的回答:)
kev*_*kev 16
\c在搜索中的任何位置使用以忽略大小写(覆盖您的ignorecase或smartcase设置).例如,/\cfoo或/foo\c将匹配foo,Foo,fOO,FOO,等.
\C在搜索中的任何位置使用以强制大小写匹配.例如/\Cfoo或/foo\C将只匹配foo.
Bra*_*cox 16
奇怪没有人提到ctags.下载"exuberant ctags"并将其置于搜索路径中已有的预装版本之前.镉到你正在做的任何事情的根源; 例如Android内核分发.输入"ctags -R".在名为"tags"的文件中构建该目录下任何位置的源文件索引.这包含所有标签,无论是语言还是dir中的位置,在一个文件中,因此跨语言工作很容易.
然后在该文件夹中打开vim并阅读:help ctags以获取某些命令.我经常使用的一些:
将光标放在方法调用上并键入CTRL-]以转到方法定义.
键入:ta name转到name的定义.
Dav*_*dge 14
自动缩进:
gg(转到文档开头)
=(缩进时间!)
shift-g(转到文档末尾)
您需要在文件中使用'filetype plugin indent' .vimrc,并且可能需要适当的'shiftwidth'和'expandtab'设置.
小智 14
你问过有效的快捷方式,但我认为你真正的问题是:vim值得吗?这个stackoverflow问题的答案是 - >"是"
你必须注意到两件事.Vim很强大,而vim很难学.它的大部分功能在于它的可扩展性和无穷无尽的命令组合.不要感到不知所措.慢点来.一个命令,一次一个插件.不要过头了.
你投入到vim的所有投资都将偿还一千倍.在你死之前的许多小时,你将会在文本编辑器中.Vim将成为你的伴侣.
Ste*_*ini 13
多个缓冲区,特别是它们之间的快速跳转,以比较两个文件:bp和:bn(正确地重新映射到单个Shift+ p或Shift+ n)
vimdiff 模式(分成两个垂直缓冲区,颜色显示差异)
区域复制Ctrl+v
最后,标签完成标识符(搜索"mosh_tab_or_complete").那是改变生活的方式.
Dav*_*ver 12
同意顶级海报 - :r!命令非常有用.
我经常使用它来"粘贴"东西:
:r!cat
**Ctrl-V to paste from the OS clipboard**
^D
Run Code Online (Sandbox Code Playgroud)
这样我就不必乱动了:set paste.
Wil*_*ell 10
使编辑更快的第三个标准是所需的击键次数.我想说这比你的其他更重要2.在vim中,几乎所有操作都需要的键击次数比我熟悉的其他编辑器少.
你提到你在剪切和粘贴方面遇到了麻烦,但听起来你需要更多使用vim中的一般动作命令的经验.猛拉3个字:y3w从光标到下一个分号:yf; 下次出现最近一次搜索:yn所有这些都比在按住修改键时尝试使用鼠标导航要快得多.此外,正如CMS的响应中的一些示例所示,vim的运动命令针对C和C++源代码中的高效导航进行了高度优化.
至于"如何使用vim让我更有效率?"的问题,我希望答案是:"有效".
Eri*_*son 10
我最有成效的vi/Vim技巧是:
:%s
Run Code Online (Sandbox Code Playgroud)
我喜欢能够动态使用正则表达式来替换文件中我想要的任何内容.每个文本编辑器都应该支持正则表达式IMHO.
kgu*_*est 10
您可以在替换字符串中使用\ =,这是我经常做的事情.
如果你在vim中有一个基本上无序的列表,比如使用#作为标记,你可以将它转换为有序列表.
# CSSLINT
# PHPCS
# Charlie
# Delta
Run Code Online (Sandbox Code Playgroud)
如果它从第一行开始,你就可以做到
:1,6s/#/\=line(".")/g
Run Code Online (Sandbox Code Playgroud)
把它转换成
1 CSSLINT
2 PHPCS
3 Charlie
4 Delta
Run Code Online (Sandbox Code Playgroud)
如果它不是从第一行开始,只需做数学:
:16,20s/#/\=line(".") - 15/g
Run Code Online (Sandbox Code Playgroud)
更多信息:help sub-replace-expression
将以下内容映射到简单的键组合后,以下内容对我非常有用:
在其路径上跳转到文件
gf
Run Code Online (Sandbox Code Playgroud)
获取现有文件的完整路径名
:r!echo %:p
Run Code Online (Sandbox Code Playgroud)
获取现有文件的目录
:r!echo %:p:h
Run Code Online (Sandbox Code Playgroud)
运行代码:
:!ruby %:p
Run Code Online (Sandbox Code Playgroud)
ruby缩写:
ab if_do if end<esc>bi<cr><esc>xhxO
ab if_else if end<esc>bi<cr><esc>xhxO else<esc>bhxA<cr> <esc>k$O
ab meth def method<cr>end<esc>k<esc>:s/method/
ab klas class KlassName<cr>end<esc>k<esc>:s/KlassName/
ab mod module ModName<cr>end<esc>k<esc>:s/ModName/
Run Code Online (Sandbox Code Playgroud)
运行当前程序:
map ,rby :w!<cr>:!ruby %:p<cr>
Run Code Online (Sandbox Code Playgroud)
检查当前程序的语法:
map ,c :w!<cr>:!ruby -c %:p<cr>
Run Code Online (Sandbox Code Playgroud)
运行当前规范程序的所有规范:
map ,s :w!<cr>:!rspec %:p<cr>
Run Code Online (Sandbox Code Playgroud)
破解它打开irb:
map ,i :w!<cr>:!irb<cr>
Run Code Online (Sandbox Code Playgroud)
rspec abreviations:
ab shared_examples shared_examples_for "behavior here" do<cr>end
ab shared_behavior describe "description here" do<cr> before :each do<cr>end<cr>it_should_behave_like "behavior here"<cr><bs>end<cr>
ab describe_do describe "description here" do<cr>end
ab context_do describe "description here" do<cr>end
ab it_do it "description here" do<cr>end
ab before_each before :each do<cr>end<cr>
Run Code Online (Sandbox Code Playgroud)
rails缩写:
用户认证:
ab userc <esc>:r $VIMRUNTIME/Templates/Ruby/c-users.rb<cr>
ab userv <esc>:r $VIMRUNTIME/Templates/Ruby/v-users.erb<cr>
ab userm <esc>:r $VIMRUNTIME/Templates/Ruby/m-users.rb<cr>
Run Code Online (Sandbox Code Playgroud)
在firefox中打开视觉选择的url:
"function
function open_url_in_firefox:(copy_text)
let g:open_url_in_firefox="silent !open -a \"firefox\" \"".a:copy_text."\""
exe g:open_url_in_firefox
endfunction
"abbreviations
map ,d :call open_url_in_firefox:(expand("%:p"))<cr>
map go y:call open_url_in_firefox:(@0)<cr>
Run Code Online (Sandbox Code Playgroud)
rspec:运行包含当前行的规范:
"function
function run_single_rspec_test:(the_test)
let g:rake_spec="!rspec ".a:the_test.":".line(".")
exe g:rake_spec
endfunction
"abbreviations
map ,s :call run_single_rspec_test:(expand("%:p"))<cr>
Run Code Online (Sandbox Code Playgroud)
rspec-rails:运行包含当前行的规范:
"function
function run_single_rails_rspec_test:(the_test)
let g:rake_spec="!rake spec SPEC=\"".a:the_test.":".line(".")."\""
exe g:rake_spec
endfunction
"abbreviations
map ,r :call run_single_rails_rspec_test:(expand("%:p"))<cr>
Run Code Online (Sandbox Code Playgroud)
rspec-rails:使用调试运行包含当前行的规范:
"function
function run_spec_containing_current_line_with_debugging:(the_test)
let g:rake_spec="!rake spec SPEC=\"".a:the_test.":".line(".")." -d\""
exe g:rake_spec
endfunction
"abbreviations
map ,p :call run_spec_containing_current_line_with_debugging:(expand("%:p")) <cr>
Run Code Online (Sandbox Code Playgroud)
HTML
"abbreviations
"ab htm <html><cr><tab><head><cr></head><cr><body><cr></body><cr><bs><bs></html>
ab template_html <script type = 'text/template' id = 'templateIdHere'></script>
ab script_i <script src=''></script>
ab script_m <script><cr></script>
ab Tpage <esc>:r ~/.vim/templates/pageContainer.html<cr>
ab Ttable <esc>:r ~/.vim/templates/listTable.html<cr>
"function to render common html template
function html:()
call feedkeys( "i", 't' )
call feedkeys("<html>\<cr> <head>\<cr></head>\<cr><body>\<cr> ", 't')
call feedkeys( "\<esc>", 't' )
call feedkeys( "i", 't' )
call include_js:()
call feedkeys("\<bs>\<bs></body>\<cr> \<esc>hxhxi</html>", 't')
endfunction
Run Code Online (Sandbox Code Playgroud)
JavaScript的
"jasmine.js
"abbreviations
ab describe_js describe('description here', function(){<cr>});
ab context_js context('context here', function(){<cr>});
ab it_js it('expectation here', function(){<cr>});
ab expect_js expect().toEqual();
ab before_js beforeEach(function(){<cr>});
ab after_js afterEach(function(){<cr>});
"function abbreviations
ab fun1 function(){}<esc>i<cr><esc>ko
ab fun2 x=function(){};<esc>hi<cr>
ab fun3 var x=function(){<cr>};
"method for rendering inclusion of common js files
function include_js:()
let includes_0 = " <link type = 'text\/css' rel = 'stylesheet' href = '\/Users\/johnjimenez\/common\/stylesheets\/jasmine-1.1.0\/jasmine.css'\/>"
let includes_1 = " <link type = 'text\/css' rel = 'stylesheet' href = '\/Users\/johnjimenez\/common\/stylesheets\/screen.css'\/>"
let includes_2 = "<script type = 'text\/javascript' src = '\/Users\/johnjimenez\/common\/javascripts\/jquery-1.7.2\/jquery-1.7.2.js'><\/script>"
let includes_3 = "<script type = 'text\/javascript' src = '\/Users\/johnjimenez\/common\/javascripts\/underscore\/underscore.js'><\/script>"
let includes_4 = "<script type = 'text\/javascript' src = '\/Users\/johnjimenez\/common\/javascripts\/backbone-0.9.2\/backbone.js'><\/script>"
let includes_5 = "<script type = 'text\/javascript' src = '\/Users\/johnjimenez\/common\/javascripts\/jasmine-1.1.0\/jasmine.js'><\/script>"
let includes_6 = "<script type = 'text\/javascript' src = '\/Users\/johnjimenez\/common\/javascripts\/jasmine-1.1.0\/jasmine-html.js'><\/script>"
let includes_7 = "<script>"
let includes_8 = " describe('default page', function(){ "
let includes_9 = "it('should have an html tag', function(){ "
let includes_10 = " expect( $( 'head' ).html() ).not.toMatch(\/^[\\s\\t\\n]*$\/);"
let includes_11 = "});"
let includes_12 = "});"
let includes_13 = "$(function(){"
let includes_14 = "jasmine.getEnv().addReporter( new jasmine.TrivialReporter() );"
let includes_15 = "jasmine.getEnv().execute();"
let includes_16 = "});"
let includes_17 = "\<bs>\<bs><\/script>"
let j = 0
while j < 18
let entry = 'includes_' . j
call feedkeys( {entry}, 't' )
call feedkeys( "\<cr>", 't' )
let j = j + 1
endwhile
endfunction
"jquery
"abbreviations
ab docr $(document).ready(function(){});
ab jqfun $(<cr>function(){<cr>}<cr>);
Run Code Online (Sandbox Code Playgroud)
这里是另一个网站,我发现在学习Vim的帮助.这也很有趣!:)
VIM Adventures是一款基于VIM键盘快捷键(命令,动作和操作符)的在线游戏.这是"塞尔达语与文本编辑"游戏.这是一个练习和记忆VIM命令的益智游戏(当然也包括好的旧VI).这是一种学习VIM的简单方法,没有陡峭的学习曲线.
在代码中插入一些文本:
ctrl + v, (selecting text on multiple lines), I, (type something I want), ESC
Run Code Online (Sandbox Code Playgroud)
录制宏以编辑文本并运行N次:
q, a (or some other letter), (do the things I want to record), q, ESC,
(type N, as in the number of times I want to run the macro), @, a
Run Code Online (Sandbox Code Playgroud)
暂时忽略这个问题(我的答案如下),可能有助于解决你的问题的一些事情:
:map <C-F> /\V
Run Code Online (Sandbox Code Playgroud)
这将使Ctrl-F以搜索的第一个字符开始搜索\V,这将关闭所有"魔法",因此您不必逃避任何事情(就像PsPad一样).
" CTRL-X and SHIFT-Del are Cut
vnoremap <C-X> "+x
vnoremap <S-Del> "+x
" CTRL-C and CTRL-Insert are Copy
vnoremap <C-C> "+y
vnoremap <C-Insert> "+y
" CTRL-V and SHIFT-Insert are Paste
map <C-V> "+gP
map <S-Insert> "+gP
cmap <C-V> <C-R>+
cmap <S-Insert> <C-R>+
Run Code Online (Sandbox Code Playgroud)
(从Vim发行版直接从mswin.vim中获取).这将为您提供Ctrl-C,Ctrl-V等复制和粘贴功能.
就个人而言,我发现使用标准的Vim可以更好地复制和粘贴.在Vim中,我可以将光标放在一行上,键入yy以复制它,10p粘贴它的10个副本.使用Align插件,我可以使用Ctrl-V(假设上面没有使用上面的窗口映射)可视块阻止选择已创建的数字列; :II然后自动递增该列数字.同样地,使用YankRing,我可以一个接一个地复制10行(或更多行)然后将它们一个接一个地粘贴回来.
至于Vim让我提高效率的方式,我会说标签文件是我不能再做的一件事.当光标在标签上时,我可以按Ctrl-]下去转到功能(和Ctrl-T返回,尽可能多的级别)或,p打开预览窗口中的功能或宏定义(或其他)(可以然后快速关闭:pcl)或[i只显示状态栏上的宏定义.对于导航复杂的源代码,这些工具非常宝贵.
预览窗口确实依赖于.vimrc中的映射,但是:
:map ,p :ptag <C-R><C-W><CR>
Run Code Online (Sandbox Code Playgroud)
标签文件还允许使用一些(我的)插件,这些插件可以更清晰地显示错误(通过突出显示已识别的标签而不突出显示无法识别的标签),并在将鼠标移到关键字上时标记签名.
Ctrl-w Ctrl-f ............ open file under cursor in new window
Ctrl-6 ................... alternate file
'0 ....................... open last file
:x ....................... close if save
Run Code Online (Sandbox Code Playgroud)
对于复制/剪切和粘贴,使用可视模式可以更容易地适应其他编辑器.所以我通常剪切和粘贴的方式是:
v - 打开视觉模式w,e和b是有用的(移动到下一个单词,结束下一个字,并分别将本/前一个单词的开头).d- 剪切文本(y如果要复制文本,请使用)p- 粘贴(粘贴在当前字符之后,P粘贴在当前字符之前.同样有用的是V进入可视模式(线),它自动选择整行,光标在线上.
http://www.viemu.com/a-why-vi-vim.html是一篇很好的宣传文章.它解释了使用.命令重复上次编辑的强大功能.
复制/剪切和粘贴.我一直这样做.使用所有经典编辑器,您可以用左手按Shift键,然后用右手移动光标以选择文本.然后按Ctrl + C复制,移动光标并按Ctrl + V粘贴.
有了Vim,它太可怕了:
Run Code Online (Sandbox Code Playgroud)* yy to copy one line (you almost never want the whole line!) * [number xx]yy to copy xx lines into the buffer. But you never know确切地说,如果你选择了你想要的.我经常要做[编号xx] dd然后你撤消!
我确信其他答案已经解释得更好了,但你做错了.我经常使用视觉模式来选择要移动或删除的文本,这类似于你的shift + select示例,但是Vim在这里有一个明显的优势,因为你的手永远不会离开主行去做.yy是一个伟大的命令,但我经常做Vy,如果我想要拉一整行.
实际上我总是丢失我的缓冲区,所以我通常复制一系列行的方法是将它写入临时文件,然后在适当的位置读取它.
例如
ka(设置标记)
'一个,.w ^!t(将所有标记复制到文件中t)
..移动光标..
:.rt(读入当前位置).
这可能涉及比使用缓冲区更少的击键,更容易跟踪,并且您可以使用长寿命粘贴文件.为了速度,我通常使用1个字母的名字作为文件.
这个快速的关键原因是要移动光标你只需使用搜索功能"/",如果在到达目的地之前遇到另一种模式,则使用"n".
放入你的.vimrc:
nnoremap; :
这种方式输入commmandmode更容易:
;q或者;w工作,而不仅仅是:q或:w.
两次击键而不是三次击键,你经常会需要它.
系统管理员不好,因为他们需要开箱即用的相同功能,在每个盒子上都是相同的.
但对于使用vi的程序员来说,这是一个巨大的改进.