What is your most productive shortcut with Vim?
我听说过很多关于Vim的事,包括利弊。实际上,作为一个开发人员,使用VIM应该比使用任何其他编辑器都快。我用VIM做一些基本的工作,我用VIM的效率最多降低10倍。
当你谈论速度时,你应该关心的只有两件事(你可能对速度不够关心,但你应该关心):
下面有两个例子说明了为什么我对VIM的工作效率要低得多。
复制/剪切和粘贴。我总是这么做。对于所有当代的编辑器,您可以用左手按shift,然后用右手移动光标以选择文本。然后复制ctrl+c,移动光标并粘贴ctrl+v。
对维姆来说,这很可怕:
yy 复制一行(几乎不需要整行!)[number xx]yy 将xx 行复制到缓冲区中。但你永远不知道你是否选择了你想要的。我经常要先做[number xx]dd ,然后再做u ,才能撤销!
另一个例子?搜索和替换。
- 在pspad:ctrl+f中,键入要搜索的内容,然后按enter。
- 在vim:
/ 中,键入要搜索的内容,然后如果有一些特殊字符将\ 放在每个特殊字符之前,则按enter。
维姆的一切都是这样的:似乎我不知道如何正确地处理它。
注意:我已经读过VIM备忘表了。)
我的问题是:
你使用VIM的方式是什么,使你比当代编辑更有效率?
你对维姆的问题是你不摸摸维伊。
你提到用
vi的"禅"就是你说的是一种语言。开头的
这也可以表示为
如果您只了解基本的上、下、左、右光标移动,那么vi将不会比您的"记事本"副本更有效率。(好的,您仍然可以突出显示语法,并且能够处理大于大约45kb的文件;但是请在这里与我一起工作)。好的。
vi有26个"标记"和26个"寄存器"。使用
因为这些是"运动",它们也可以用作其他"陈述"的主题。好的。
因此,剪切任意文本选择的一种方法是删除一个标记(我通常使用"a"作为"第一"标记,使用"z"作为下一个标记,使用"b"作为另一个标记,使用"e"作为另一个标记(我不记得在使用vi的15年中交互使用了超过四个标记;一种方法创建了自己关于mac如何使用标记和寄存器的约定不会干扰人的互动环境的ROS)。然后我们转到所需文本的另一端;我们可以从任意一端开始,这无关紧要。然后我们可以简单地使用
我说这是剪切或复制文本的一种方法。然而,它只是众多中的一个。通常,我们可以更简洁地描述文本的范围,而无需移动光标和删除标记。例如,如果我在一段文字中,我可以分别使用
"段落"的概念默认为通常凭直觉是合理的。因此,它常常适用于代码和散文。好的。
我们经常知道一些模式(正则表达式),它标志着我们感兴趣的文本的一端或另一端。向前或向后搜索是vi中的运动,因此在我们的"语句"中它们也可以用作"主语"。因此,我可以使用
除了"动词"和"主语"之外,vi还有"宾语"(在这个术语的语法意义上)。到目前为止,我只描述了匿名寄存器的使用。但是,我可以通过在"object"引用前面加上
"前缀"这一概念也为我们的文本操作"语言"添加了语法"形容词"和"副词"的类似词。大多数命令(动词)和动作(动词或对象,取决于上下文)也可以使用数字前缀。因此,
这都是中级六级。没有一个是特定于vim的,而且如果你准备好学习的话,在vi中还有很多高级技巧。如果你仅仅掌握了这些中间概念,那么你可能会发现你很少需要编写任何宏,因为文本操作语言足够简洁和表达,可以使用编辑器的"本机"语言轻松地完成大多数事情。好的。更高级技巧的示例:
有许多
因此,大多数
有趣的是,普通的unix命令grep实际上是受到这个ex命令的启发(并以文档中的方式命名)。ex命令EDOCX1(grep)是他们记录如何"全局"打印包含"正则表达式"(re)的行的方式。当使用ed和ex时,
请注意,
我们可以用
为了连接线条,通常我可以找到所有需要连接到其前一行的线条的模式(例如,在某些项目符号列表中,所有以"^"开头而不是"^*"开头的线条)。对于这种情况,我将使用:
几乎不用说,您可以使用我们的老朋友
问题是,在
这很难理解(在过去的15年里我只使用过几次类似的东西)。不过,我可以自由地承认,我经常重复和互动地做一些事情,如果我花时间思考正确的咒语,可能会更有效地完成这些事情。好的。
另一个非常有用的vi或ex命令是
更强大的是
更强大的是
使用
另一个有用的ex命令是
例如,我有一个七行文件(36个字符),它通过wc运行一个文件,并在包含该字数数据的文件顶部插入一个C样式的注释。我可以使用如下命令将该"宏"应用于文件:
(vi和vim的
通常,使用perl、awk、s ed(实际上,就像grep一样,grep是一个受ed命令启发的实用程序)编写这样的"宏"要容易得多。好的。
这只需要10次击键(对于我来说,表达式
我只触及了vi的力量的表面,这里我所描述的甚至都不是vim命名的"改进"的一部分!我在这里描述的所有内容都应该适用于20或30年前的任何旧版本的vi。好的。
有些人使用了比我任何时候都要多的vi的力量。好的。好啊。
你说的是文本的选择和复制,我认为你应该看看VIM的视觉模式。
在可视模式下,您可以使用VIM命令选择文本,然后您可以对所选内容进行任何操作。
考虑以下常见情况:
您需要选择到下一个匹配的括号。
你可以这样做:
- 如果光标在开始/结束括号上,则返回
v% 。 - 如果光标在括号内,则返回
vib 。
要在引号之间选择文本:
- 六"双引号
- 单引号
您要选择一个大括号块(在C样式语言中非常常见):
vib vi{
要选择整个文件:
ggVG
可视块选择是另一个非常有用的功能,它允许你选择一个矩形的文本区域,你只需要按ctrl vbkbd启动它,然后选择你想要的文本块,执行任何类型的操作,如扬克、删除、粘贴、编辑等等。编辑面向列的文本是很好的。
一些生产率提示:
灵巧动作
* 和# 在光标下向前/向后搜索单词。- 接下一个词
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< =在<..>(需要VIMRC中的set matchpairs+=<:> )4dd =删除4行3x =删除3个字符。3s =替换3个字符。
有用的程序员命令
r 替换一个字符(如rd 用d 替换当前字符)。~ 变更案例。J 连接两条线- ctrl+a/ctrl+x递增/递减数字。
. 重复上一个命令(简单宏)== 固定行缩进> 缩进块(视觉模式)< 无凹痕块(视觉模式)
宏记录
- 按
q[ key ] 开始录制。 - 然后按
q 停止录制。 - 宏可以与
@[ key ] 一起使用。
通过使用非常具体的命令和动作,VIM可以为下一行重放这些精确的动作。(例如,a表示追加到结束,
构建良好的设置示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 | # 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") |
这些设置可以存储在
1 | source /etc/vimrc.local |
(您必须用
我在这里列出的命令非常基本,到目前为止我使用的主要命令。他们已经让我更有效率了,不用知道所有的花哨的东西。
control+r机制非常有用:在插入模式或命令模式下(即在键入命令时在
- a-zabbkbd命名寄存器
- "未命名的寄存器,包含最后一次删除或扬克的文本。
- %当前文件名
- 备用文件名
- *剪贴板内容(x11:主选择)
- +剪贴板内容
- /最后一个搜索模式
- :最后一条命令行
- .最后插入的文本
- 最后一个小的(少于一行)删除
- =5*5在文本中插入25(迷你计算器)
更多细节见
VIM插件
这里有很多很好的答案,还有一个关于vi的禅的很好的答案。我没有看到提到的一件事是vim通过插件是非常可扩展的。有一些脚本和插件可以让它做一些原始作者从未考虑过的疯狂的事情。以下是一些非常方便的VIM插件示例:
铁路公司rails.vim是tpope编写的插件。对于从事Rails开发的人来说,这是一个难以置信的工具。它做了一些神奇的上下文敏感的事情,可以让您轻松地从控制器中的一个方法跳到相关的视图,跳到一个模型,然后跳到该模型的单元测试。作为一名Rails开发人员,它已经节省了几十个小时甚至数百个小时。
吉姆这个插件允许您在可视模式下选择一个文本区域,并键入一个快速命令将其发布到gist.github.com。这样可以方便地访问Pastebin,如果您通过IRC或IM与某人协作,这非常方便。
空间vim这个插件为空格键提供了特殊的功能。它把空格键变成类似于周期的东西,但它不是重复动作而是重复动作。这对于以您即时定义的方式快速浏览文件非常方便。
围绕着这个插件使您能够处理以某种方式分隔的文本。它为您提供对象,这些对象表示parens中的内容、引号中的内容等。它可以方便地操作定界文本。
超级表vim这个脚本为VIM带来了花哨的选项卡完成功能。自动完成功能已经存在于VIM的核心中,但是这使得它成为一个快速的标签,而不是多个不同的多键快捷方式。非常方便,而且使用起来非常有趣。虽然它不是VS的IntelliSense,但它是一个很好的步骤,并带来了许多您希望从选项卡完成工具中获得的功能。
同步电动机此工具将外部语法检查命令引入VIM。我没有亲自使用过它,但我听说过很多关于它的东西,而且这个概念很难被打破。不必手动检查语法是一个很好的节省时间的方法,它可以帮助您在引入语法错误时捕获它们,而不是在最后停止测试时。
逃亡从VIM内部直接访问Git。同样,我还没有使用这个插件,但是我可以看到这个实用程序。不幸的是,我所处的文化中,SVN被认为是"新的",所以很长一段时间内我不太可能在工作中看到Git。
涅特雷特维姆VIM的树浏览器。我最近开始用这个,它真的很方便。它允许您将树视图垂直拆分并轻松打开文件。对于一个有很多源文件的项目来说,这是很好的选择。
fuzzyfinderextmate.vim这是一个未维护的插件,但仍然非常有用。它提供了使用"模糊"描述语法打开文件的能力。这意味着,在一个稀疏的文件树中,您只需要键入足够的字符,就可以将您感兴趣的文件从其余的cruft中消除歧义。
结论有很多难以置信的工具可用于VIM。我敢肯定我只是在这里划破了表面,这是非常值得搜索的工具适用于您的领域。传统的vi强大的工具集,vim对它的改进,以及能进一步扩展vim的插件的结合,是编辑有史以来最强大的文本方法之一。vim和emacs、eclipse、Visual Studio和textmate一样强大。
谢谢多亏了Duwanis的vim配置,我从中学到了很多东西,并借用了这里列出的大多数插件。
我用这个节省了很多时间。
前面提到了视觉模式,但是块视觉模式在编辑文本文件中的固定大小列时节省了我很多时间。(使用ctrl-v访问)。
胃肠道
转到上次编辑的位置(如果执行了某些搜索,但不想返回编辑状态,则非常有用)
p和^ n
完成上一个(^p)或下一个(^n)文本。
^和^ i
去上一个(旧的
最近我(有)发现了这个网站:http://vimcasts.org /
这是很新的,真的真的很好。这家伙谁是切换到运行的网站在TextMate Vim和主机位置特异性和简明casts在Vim的主题。检查出来!
ctrl+a使您所站的数字递增。
全部处于正常模式:
f
f
如果使用得当,以上两个可以让你杀手快速移动在一条线上。
*在一个词上搜索下一个实例。
#在一个词上搜索上一个实例。
会话
保存会话
:mks sessionname
B.强制保存会话
:mks! sessionname
负载会话
gvim or vim -S sessionname
加减法
A.加减法
CTRL-A ;Add [count] to the number or alphabetic character at
or after the cursor. {not in ViCTRL-X ;Subtract [count] from the number or alphabetic
character at or after the cursor. {not in Vi}
b.窗口键取消映射
In window,
Ctrl-A already mapped for whole file selection you need to unmap in rc file.
mark mswin.vim CTRL-A mapping part as comment
or
add your rc file with unmap
C.用宏
The CTRL-A command is very useful in a macro. Example:
Use the following steps to make a numbered list.Create the first list entry, make sure it starts with a number. qa - start recording into buffer 'a' Y - yank the entry p - put a copy of the entry below the first one CTRL-A - increment the number q - stop recording @a - repeat the yank, put and increment times
上周在工作中,我们的项目从另一个项目继承了许多Python代码。不幸的是,代码不适合我们现有的体系结构——它都是用全局变量和函数完成的,而这些变量和函数在多线程环境中不起作用。
我们有大约80个文件需要重新编写为面向对象的-所有的函数都被转移到类中,参数被更改,导入语句被添加等等。我们有大约20种类型的修复需要对每个文件进行。我估计一个人用手做一天大概可以做2-4次。
所以我手工做了第一个,然后编写了一个VIM脚本来自动进行更改。其中大部分是VIM命令列表,例如
1 2 3 4 5 6 7 8 | " 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. |
最后一个应该解释一下:
1 2 3 4 5 6 7 8 9 10 | 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"." |
对于一些更复杂的转换,比如生成所有的导入语句,我将一些Python嵌入到VIM脚本中。
经过几个小时的工作,我有了一个脚本,可以完成至少95%的转换。我刚在vim中打开一个文件,然后运行
我们仍在努力改变剩下的5%,这不值得自动化和测试结果,但是通过花一天时间编写这个脚本,我估计我们已经节省了数周的工作。
当然,用python或ruby这样的脚本语言可以实现自动化,但是编写起来要花更长的时间,灵活性也会降低——上一个例子可能会很困难,因为仅regex就不能处理嵌套的括号,例如将
使用内置文件资源管理器!命令是
1 2 | map <silent> <F8> :Explore<CR> map <silent> <S-F8> :sp +Explore<CR> |
资源管理器也允许您修改文件。我会发布一些我最喜欢的键,按
- -:最有用的:更改为上目录(
cd .. ) - MF:马克文件
- D:删除标记的文件或光标所在的文件(如果没有标记)。
- R:重命名光标所在的文件。
- D:在当前目录中创建一个新目录
- %:在当前目录中创建新文件
我是美国密码协会的会员。双月刊包括100多种密码。其中大约有15个是"密码学"——用字母代替数字的各种算术问题。其中两到三个是数独,除了字母而不是数字。当网格完成时,九个不同的字母将在网格中的某个位置,在某些直线、对角线、螺旋线等上拼写出一个或多个单词。
我不使用铅笔,也不手工输入问题,而是从他们网站的成员区下载问题。
在处理这些数独的时候,我使用vi,仅仅是因为我使用的是vi拥有的工具,而其他编辑几乎没有。主要是把字母网格转换成数字网格,因为我发现它更容易解决,然后把完整的数字网格重新转换成字母网格来找到解决方案的单词。
这个问题的格式是九组九个字母,其中
结果如下:
1 2 3 4 5 6 7 8 9 | T-O-----C -E-----S- --AT--N-L ---NASO-- ---E-T--- --SPCL--- E-T--OS-- -A-----P- S-----C-T |
所以,把它转换成数字的第一步是列出不同的字母。首先,我复制一个块。我将光标放在块的顶部,然后键入
接下来,我将这些副本中的一个转换成一组不同的字母。这个命令有点复杂:
1 2 3 | :!}tr -cd A-Z | sed 's/\(.\)/\1 /g' | sort -u | tr -d ' ' |
下一步是制作网格的另一个副本。然后用我刚刚识别的字母,用1到9之间的数字替换每一个字母。很简单:
1 2 3 4 5 6 7 8 9 | 8-5-----1 -2-----7- --08--4-3 ---4075-- ---2-8--- --7613--- 2-8--57-- -0-----6- 7-----1-8 |
然后可以用通常的方法解决这个问题,或者输入任何你可能喜欢的数独解算器。完成的解决方案可以用
在vi中,只有很少的其他人能与之匹敌。最大的问题是,只有极少数的vi教程书籍、网站、帮助文件等,能够做的不仅仅是触摸表面的可能。
我最近发现了
请参阅
批量文本操作!
通过宏:
- 从录制开始:
qq 。 - 做东西
- 停止录制:
q 。 - 重复:
@q (第一次),之后是@@ 。 - 重复20次:
20@@ 。
或通过正则表达式:
- 更换材料:
:%s/[fo]+/bar/g 。
(但要注意:如果你这样做,你会有两个问题。)
前几天我发现了Vim的无所不在,虽然我承认我有点搞不清是怎么回事,但我已经取得了令人惊讶的好结果,只是把CtrL+CtrL+U或插入模式下的ctrl+n/ctrl+p。这不是很明智,但我仍在学习。
试试看!
这些不是快捷方式,但它们是相关的:
它们提高了我的工作效率。
我经常使用的另一个有用的vi"快捷方式"是"xp"。这将把光标下的字符与下一个字符交换。
!python%[args]运行我在此窗口中编辑的脚本
ZF在视觉模式下折叠任意线条
视觉模式好的。
正如其他一些人所说,视觉模式是您复制/剪切和粘贴问题的答案。VIM为您提供"V"、"V"和C-V。VIM中的小写"V"与记事本中的SHIFT键基本相同。好的是你不必把它压住。您可以使用任何移动技术有效地导航到所选内容的起始(或结束)点。然后点击"V",再次使用有效的移动技术导航到你选择的另一端。然后"d"或"y"允许您剪切或复制该选择。好的。
Vim的视觉模式比Jim Dennis在vi中对剪切/复制/粘贴的描述有一个优势,那就是你不必精确地找到正确的位置。有时,使用快速移动来到达你想去的地方的大致附近,然后用其他移动来完善它,比想出一个更复杂的单一移动命令来精确地到达你想去的地方更有效。好的。
以这种方式广泛使用视觉模式的缺点是,它可以成为您一直使用的拐杖,这会阻止您学习新的vi(m)命令,从而使您能够更有效地执行操作。但是,如果您非常积极地学习vi(m)的新方面,那么这可能不会对您产生太大影响。好的。
我还要再次强调的是,视觉线条和视觉块模式在同一个主题上给了你不同的效果,这是非常强大的…尤其是视觉块模式。好的。
论键盘的有效使用好的。
我也不同意你的观点,即交替的手是使用键盘的最快方式。它包含着一种真理的元素。一般来说,重复使用同样的东西是缓慢的。这个原则最重要的例子是,用同一个手指连续敲击键盘的速度非常慢。您的断言可能源于在这个模式上使用S/手指/手/转换的自然倾向。在某种程度上,这是正确的,但在效率谱的极端高端,这是不正确的。好的。
问问任何钢琴家。询问他们是否能更快地演奏连续的几个音符,交替用手或用一只手连续的手指按顺序演奏。输入4个击键的最快方法不是交替的手,而是用同一只手的4个手指按升序或降序来输入(称之为"运行")。一旦你考虑过这种可能性,这应该是不言而喻的。好的。
更困难的问题是为此进行优化。在键盘上优化绝对距离非常容易。维姆做到了。在"运行"级别进行优化要困难得多,但是使用模式编辑的vi(m)比任何非模式方法(ahem、emacs)都能提供更好的机会。好的。
关于Emacs好的。
在电子邮件Zealots完全解析了我在帐户上的整个邮件,这是最后一个家长式的方式,我觉得我必须描述一下邮件和贵族宗教之间的区别。我从来没有在编辑战争中爆发过,我可能不会再这样了,但我从来没有听说过任何人描述这种不同的方式,所以就在这里。The difference is the following tradeoff:
okay.
VIM gives you unmatched raw text editing efficiency电子邮件给你不匹配的用户能力和编辑程序
okay.
The blind vim zealots will claim that vim has a scripting language.但这是一种黑暗的语言,是为编辑设计的。电子邮件有列表!Enough said.如果你不欣赏最后两项裁决的意义,或者不想充分了解功能编程和编制清单以发展这种评价,那么你就应该使用VIM。
okay.
电子邮件Zealots会说电子邮件有毒蛇模式,所以它是一个毒蛇的超级集。但毒蛇时尚不是标准我的理解是,毒蛇的方式没有被大多数的电子邮件用户使用。自从这不是防御,大多数使用者的电子邮件可能并没有对模式范式的好处作出真正的评估。
okay.
在我看来,这些差异是正统的。我相信VIM和EMACS的好处,就像我说过的一样。这意味着终极编辑不存在很可能电子邮件会成为一个简单的平台,以最终的编辑为基础。但模态编辑并没有进入电子邮件的心灵。电子邮件社区可以在未来的道路上移动,但似乎不太喜欢。
okay.
所以如果你想提高编辑效率,就使用VIM。如果你想要最后的环境来拼写和编程你的编辑使用电子邮件。如果你想要的都是一个侧重于编程能力的电子邮件,使用的是毒蛇模式(或程序自己的模式)。如果你想要世界上最好的,你现在就走运了。
okay.好吧
花30分钟做个教程本教程VIM VIM中运行"终端)。你将学习基本的运动,和一些keystrokes,本想让你至少是为生产和Vim文本编辑器的使用在你的酒店。在这之后,我读了,吉姆回答:丹尼斯)
奇怪的是没人提到过CTags。下载"丰富的ctags",把它放在搜索路径中已经安装的蹩脚的预装版本之前。CD到您正在处理的任何内容的根目录;例如Android内核发行版。键入"ctags-r."在名为"tags"的文件中,在该目录下的任何位置建立源文件索引。它包含了所有的标签,不标记语言,也不标记目录中的位置,在一个文件中,所以跨语言工作很容易。
然后打开那个文件夹中的vim并阅读:帮助ctags获取一些命令。我经常使用的一些:
将光标放在方法调用上,然后键入ctrl-]转到方法定义。
键入:ta name转到名称定义。
在搜索中的任意位置使用
在搜索中的任意位置使用
What is the way you use Vim that makes
you more productive than with a
contemporary editor?
能够执行复杂、重复的编辑,只需很少的按键(通常使用宏)。看看VimGolf,见证Vim的力量!
经过十多年的日常使用,很难想象使用任何其他编辑器。
我惊讶地发现没有人提到江户十一〔54〕运动。我经常将它与参数列表一起使用,形式是
你问过有效率的捷径,但我认为你真正的问题是:维姆值得吗?这个stackoverflow问题的答案是->是的
你一定注意到了两件事。Vim很强大,很难学习。它的大部分功能在于它的可扩展性和无休止的命令组合。不要感到不知所措。走慢一点。一次一个命令,一个插件。别过分了。
你投入VIM的所有投资都将得到1000倍的回报。在你死之前,你会在一个文本编辑器里呆上好几个小时。维姆将是你的同伴。
自动缩进:
在
多个缓冲区,尤其是它们之间的快速跳转,以便与
使用ctrl+vbkbd进行区域复制
最后,标签完成标识符(搜索"mosh_tab_or_complete")。那是一个改变生活的人。
同意上面的海报-R!命令非常有用。
我经常用它来"粘贴"东西:
1 2 3 | :r!cat **Ctrl-V to paste from the OS clipboard** ^D |
这样我就不必再摆弄
我最有效的vi/vim技巧是:
1 | :%s |
我喜欢能够动态地使用正则表达式来替换文件中我想要的任何内容。每个文本编辑器都应该支持正则表达式imho。
使编辑更快的第三个标准是所需的击键次数。我想说这比你另外两个更重要。在VIM中,几乎所有操作所需的击键次数都比我熟悉的任何其他编辑器都要少。
您提到您在剪切和粘贴方面遇到问题,但听起来您需要在VIM中使用常规运动命令方面有更多的经验。扬克3个字:y3w扬克从光标到下一个分号:yf;扬克到你最近搜索的下一次出现:yn所有这些都比按住修改键的同时用鼠标导航快得多。此外,如CMS响应中的一些例子所见,VIM的运动命令在C和C++源代码中被高效地优化导航。
关于"我如何使用VIM使我更有效率"的问题?我希望答案是:"高效"。
您可以在替换字符串中使用=,这是我经常做的事情。
如果您在vim中有一个本质上是无序列表的东西,比如使用作为标记,您可以将其转换为有序列表。
1 2 3 4 | # CSSLINT # PHPCS # Charlie # Delta |
如果从第一行开始,你可以
1 | :1,6s/#/\=line(".")/g |
把它转换成
1 2 3 4 | 1 CSSLINT 2 PHPCS 3 Charlie 4 Delta |
如果不是从第一行开始,只需做数学:
1 | :16,20s/#/\=line(".") - 15/g |
详细信息位于:帮助子替换表达式
CIT–在插入模式下转换时清空标记的内容
YIT–复制标签内容
将下面的内容映射到一个简单的组合键后,以下内容对我非常有用:
跳过文件路径时跳到文件中
1 | gf |
获取现有文件的完整路径名
1 | :r!echo %:p |
获取现有文件的目录
1 | :r!echo %:p:h |
运行代码:
1 | :!ruby %:p |
红宝石缩写:
1 2 3 4 5 | 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/ |
运行当前程序:
1 | map ,rby :w!<cr>:!ruby %:p<cr> |
检查当前程序的语法:
1 | map ,c :w!<cr>:!ruby -c %:p<cr> |
运行当前规范程序的所有规范:
1 | map ,s :w!<cr>:!rspec %:p<cr> |
打开IRB:
1 | map ,i :w!<cr>:!irb<cr> |
RSPEC缩写:
1 2 3 4 5 6 | 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> |
轨道缩写:
用户身份验证:
1 2 3 | 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> |
在Firefox中打开可视选定的URL:
1 2 3 4 5 6 7 8 9 | "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> |
rspec:运行包含当前行的规范:
1 2 3 4 5 6 7 8 | "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> |
rspec rails:运行包含当前行的规范:
1 2 3 4 5 6 7 8 | "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> |
rspec rails:运行包含当前线路的规范并进行调试:
1 2 3 4 5 6 7 8 | "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> |
HTML
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | "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'> ab script_i <script src=''> ab script_m <cr> 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 |
JavaScript
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | "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 ="" 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\ ]*$\/);" 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>); |
这是另一个我发现有助于学习VIM的站点。太有趣了!:)
VIM Adventures is an online game based on VIM's keyboard shortcuts
(commands, motions and operators). It's the"Zelda meets text editing"
game. It's a puzzle game for practicing and memorizing VIM commands
(good old VI is also covered, of course). It's an easy way to learn
VIM without a steep learning curve.
暂时忽略这个问题(我的答案如下),一些可能有助于你解决Vim问题的事情:
1 | :map <C-F> /\V |
这将使ctrl-f开始一个搜索,搜索的第一个字符是
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | " 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>+ |
(直接从VIM分布的mswin.vim中取出)。这将为您提供用于复制和粘贴的ctrl-c、ctrl-v等。
就我个人而言,我发现使用标准VIM可以更好地复制和粘贴。在vim中,我可以将光标放在一行上,输入
至于vim使我更有效率的方式,我会说标记文件是我不能再没有的一件事。当光标位于标记上时,我可以按
但是,预览窗口1依赖于.vimrc中的映射:
1 | :map ,p :ptag <C-R><C-W><CR> |
标记文件还允许使用两个(我的)插件,当您将鼠标移到关键字上时,这些插件提供更清晰地显示错误的语法突出显示(通过突出显示已识别的标记,而不是突出显示未识别的标记)和标记签名。
1 2 3 4 | Ctrl-w Ctrl-f ............ open file under cursor in new window Ctrl-6 ................... alternate file '0 ....................... open last file :x ....................... close if save |
将文本插入代码中的某个位:
1 | ctrl + v, (selecting text on multiple lines), I, (type something I want), ESC |
录制宏以编辑文本并运行n次:
1 2 | 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 |
对于特定的复制/剪切和粘贴,使用视觉模式可以更容易地从其他编辑器中进行调整。所以我通常剪切和粘贴的方式是:
- esc-退出插入模式(如果已经处于正常模式,则跳过)
v —打开视觉模式- 移动文件以选择所需的文本-视觉模式将显示所选的字符。对于一些单词,
w ,e 和b 是有用的(分别移动到下一个单词的开头、下一个单词的结尾和前一个单词的开头)。 d —剪切文本(如果要复制文本,请使用y )- 移动到希望文本移动的位置
p 粘贴(粘贴在当前字符之后,p 粘贴在当前字符之前)。
同样有用的是使用
www.viemu.com http:/ / / a-why-vi-vim.html是一个良好的宣传文章。它解释了在权力的使用.重复命令到最后的编辑。
Copy/Cut & paste. I do it all the
time. With all the classical editors
you press Shift with the left hand,
and you move the cursor with your
right hand to select text. Then Ctrl+C
copies, you move the cursor and Ctrl+V
pastes.With Vim it's horrible:
1
2 * 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 knowexactly if you've selected what you
wanted. I often have to do [number
xx]dd then u to undo!
我肯定还会有其他更好的解释它,但你做的了。我经常使用Visual模式选择或删除一个文本到美国,这是类似于你的Shift +选择的例子,但有一个明显的优势,因为在vim的手从来没有离开你的家行这样做。YY是一个伟大的指挥,但我经常会想如果我做vy猛拉了整个线。
实际上,我总是丢失缓冲区,所以我通常复制一系列行的方法就是将其写入一个临时文件,然后在适当的位置读取它。
例如
KA(设置标记)
A,。W!t(将标记中的所有内容复制到文件t中)
…移动光标。
:.r t(将t读入当前位置)。
与使用缓冲区相比,这可能涉及较少的击键,更容易跟踪,而且您可以长期保存粘贴文件。我通常用1个字母来命名文件,以表示速度。
之所以这么快的关键原因是,如果你在到达你想去的地方之前遇到了另一个模式的出现,你只需要使用搜索函数"/"和"n"。
再走捷径怎么样?< BR>
< BR>
放入.vimrc:
nNORMAP;
通过这种方式进入命令模式更容易:
两次击键而不是三次击键,您将经常需要这样做。
对系统管理员来说是不好的,因为他们需要开箱即用的相同功能在所有地方的每个箱上都是相同的。
但是对于使用vi的程序员来说是一个巨大的改进。
除了对grokking vi的大量回复之外,应该注意的是vim确实添加了一些非常类似于vi的特性,使得使用vi命令更加友好。首先想到的是文本对象:
用文本对象而不是移动命令来思考是相当不错的。
您可以搜索寄存器的内容。
假设您的寄存器
string to search
要搜索此字符串,必须在正常模式下键入/CTRL RAKBDXENTER
它将粘贴
vim命令系列
Gung vf zl zbfg cebqhpgvir fubegphg fvapr v nyjnlf glcr va ebg13.焊接、焊接、焊接
有很多VIM技巧,但到目前为止,我真正喜欢的是ctrl+a,因为我正好在处理一些st**d代码,即硬代码数组索引。
行的快速剪切和覆盖部分:
编辑行时一个非常常见的任务是从当前光标位置剪切到某个位置并覆盖新内容。
您可以使用以下命令:
你想剪到哪一行的字符。
示例:假设您要编辑的行和光标位于
你想剪到
行的快速删除部分:
就像上面的命令一样,从当前光标位置删除内容,直到"标识符"
用于转发删除的
希望这对你也有帮助。
巧妙的标签完成^^
http://vim.wikia.com/wiki/smart_mapping_for_tab_completion
我的.vimrc中的