Vim最有效的捷径是什么?

时间:2009-08-02 08:08:29

标签: vim vi

我听过很多关于Vim的消息,包括利弊。 看起来你应该(作为开发人员)使用Vim比使用任何其他编辑器更快。 我正在使用Vim来做一些基本的东西,而且我最多只有10次效率低下与Vim。

当你谈论速度时你应该关心的两件事(你可能不太关心它们,但你应该这么做)是:

  1. 左右使用 双手是最快的使用方式 键盘。
  2. 永远不要碰鼠标 第二种方式尽可能快。 移动你的手需要很长时间, 抓住鼠标,移动它,然后带上它 回到键盘(你经常有 看看键盘,以确保你 把你的手妥当地送回正确的地方)
  3. 以下两个例子说明了为什么我对Vim的效率低得多。

    复制/剪切&粘贴。我一直这样做。使用所有当代编辑器,您可以用左手按 Shift ,然后用右手移动光标以选择文本。然后 Ctrl + C 复制,移动光标并按 Ctrl + V 贴。

    对于Vim来说,这太可怕了:

    • yy 复制一行(您几乎不需要整行!)
    • [number xx]yy xx行复制到缓冲区中。但你永远不知道你是否选择了你想要的东西。我经常需要 [number xx]dd 然后 u 来撤消!

    另一个例子? 搜索&取代

    • PSPad Ctrl + f 中输入您要搜索的内容,然后按 Enter
    • 在Vim中: / ,然后输入您要搜索的内容,然后在 \ 之前添加一些特殊字符 {{1}} em>每个特殊字符,然后按 Enter

    与Vim的一切都是这样的:似乎我不知道如何以正确的方式处理它。

    注意:我已经阅读了Vim cheat sheet :)

    我的问题是:

    使用Vim的方式是什么让你比现代编辑更有效率?

50 个答案:

答案 0 :(得分:2862)

答案 1 :(得分:505)

您正在谈论文字选择和复制,我认为您应该查看Vim Visual Mode

在可视模式下,您可以使用Vim命令选择文本,然后您可以通过选择执行任何操作。

考虑以下常见情况:

您需要选择下一个匹配的括号。

你可以这样做:

  • v% 如果光标位于起始/结束括号
  • vib 如果光标位于括号内

您想在引号之间选择文字:

  • vi“用于双引号
  • 单引号
  • vi'

您想要选择大括号块(在C风格的语言中非常常见):

  • viB
  • vi{

您想要选择整个文件:

  • ggVG

Visual block selection是另一个非常有用的功能,它允许您选择矩形区域的文本,您只需按 Ctrl - V 即可启动它,然后选择所需的文本块并执行任何类型的操作,如抽屉,删除,粘贴,编辑等。编辑面向列的文本非常棒。

答案 2 :(得分: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< =在&lt;之间更改文字..&gt; (在vimrc中需要set matchpairs+=<:>
  • 4dd =删除4行
  • 3x =删除3个字符。
  • 3s =替换3个字符。

有用的程序员命令

  • r替换一个字符(例如rd将当前字符替换为d)。
  • ~更改案例。
  • J加入两行
  • Ctrl + A / Ctrl + X递增/递减数字。
  • .重复上一个命令(一个简单的宏)
  • ==修复行缩进
  • >缩进块(在可视模式下)
  • < 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")

设置可以存储在~/.vimrc中,也可以存储在/etc/vimrc.local的系统范围内,然后使用以下内容从/etc/vimrc文件中读取:

source /etc/vimrc.local

(您必须将#评论字符替换为"以使其在VIM中有效,我想在此处提供正确的语法高亮显示。

我在这里列出的命令非常基本,到目前为止我使用的主要命令。他们已经让我更有成效,而不必知道所有花哨的东西。

答案 3 :(得分:98)

Control + R 机制非常有用:-)在插入模式命令模式(即在输入命令时在:行上,继续编号或命名的寄存器:

  • a - z 指定的寄存器
  • 未命名的寄存器,包含最后一次删除的文本或yank
  • 当前文件名
  • 备用文件名
  • * 剪贴板内容(X11:主要选择)
  • + 剪贴板内容
  • / 最后一次搜索模式
  • 最后一个命令行
  • 最后插入的文字
  • - 最后一小(删除一行)删除
  • = 5 * 5 将25插入文本(迷你计算器)

有关详细信息,请参阅:help i_CTRL-R:help c_CTRL-R,并在附近窥探更多CTRL-R善良。

答案 4 :(得分:91)

Vim插件

这里有很多好的答案,还有一个关于vi禅的惊人答案。我没有看到提到的一件事是vim通过插件是非常可扩展的。有脚本和插件可以让它做原始作者从未考虑过的各种疯狂的事情。以下是一些非常方便的vim插件的例子:

rails.vim

Rails.vim是一个由tpope编写的插件。对于进行rails开发的人来说,这是一个令人难以置信的工具。它做了神奇的上下文敏感的事情,允许您轻松地从控制器中的方法跳转到关联的视图,到模型,然后到该模型的单元测试。作为rails开发人员,它已经节省了数十个甚至数百个小时。

gist.vim

此插件允许您以可视模式选择文本区域,并键入快速命令将其发布到gist.github.com。这样可以轻松访问pastebin,如果您通过IRC或IM与某人合作,这将非常方便。

space.vim

此插件为空格键提供特殊功能。它将空格键变成类似于句点的东西,但不是重复动作而是重复动作。这对于以动态定义的方式快速浏览文件非常方便。

surround.vim

此插件使您能够处理以某种方式分隔的文本。它为您提供了表示内容中的内容,引号内的内容等的对象。它可以派上用场来操作分隔文本。

supertab.vim

此脚本为vim带来了精美的标签完成功能。自动完成的东西已经存在于vim的核心,但这会将它带到快速选项卡而不是多个不同的多键快捷方式。非常方便,使用起来非常有趣。虽然它不是VS的智能感知,但它是一个很好的步骤,它带来了你希望从标签完成工具中获得的大量功能。

syntastic.vim

此工具将外部语法检查命令带入vim。我没有亲自使用它,但我听说过它很棒,这个概念很难被击败。无需手动检查语法就可以节省大量时间,并且可以帮助您在引入语法错误时捕获语法错误,而不是在最终停止测试时。

fugitive.vim

从vim内部直接访问git。同样,我没有使用过此插件,但我可以看到实用程序。不幸的是,我处在一种svn被认为是“新”的文化中,所以我很可能会在相当长一段时间内看到git在工作。

nerdtree.vim

vim的树浏览器。我最近开始使用它,它非常方便。它允许您将树视图放在垂直拆分中并轻松打开文件。这对于包含大量源文件的项目非常有用。

FuzzyFinderTextmate.vim

这是一个不受维护的插件,但仍然非常有用。它提供了使用“模糊”描述语法打开文件的功能。这意味着在稀疏的文件树中,您只需键入足够的字符来消除您对其余部分感兴趣的文件的歧义。

结论

vim有很多令人难以置信的工具。我敢肯定,我只是在这里表面上看,并且非常值得搜索适用于您的域名的工具。传统vi强大的工具集,vim对它的改进,以及进一步扩展vim的插件的组合,它是编辑曾经构思过的文本的最强大的方法之一。 Vim很容易像emacs,eclipse,visual studio和textmate一样强大。

感谢

感谢duwanis他的vim configs我从中学到了很多,并借用了此处列出的大部分插件。

答案 5 :(得分:53)

.重复上一个文本更改命令

我用这个节省了很多时间。

之前提到过可视模式,但在文本文件中编辑固定大小的列时,块视觉模式为我节省了大量时间。 (使用Ctrl-V访问)。

答案 6 :(得分:48)

<强> GI

转到最后编辑的位置(如果您执行了一些搜索非常有用,而不想返回编辑)

^ P和^ N

完成上一个(^ P)或下一个(^ N)文本。

^ O和^ I

转到上一个(^O - "O"旧位置)或下一个(^I - "I"靠近"O")。 当您执行搜索,编辑文件等时,您可以向前和向后浏览这些“跳转”。

答案 7 :(得分:46)

我最近(有)发现了这个网站:http://vimcasts.org/

这是非常新的,非常好。正在运行该站点的人从textmate切换到vim,并在特定的vim主题上提供非常好的和简洁的演员。看看吧!

答案 8 :(得分:42)

CTRL + A 会增加您所站的数字。

答案 9 :(得分:38)

全部处于正常模式:

f&lt; char&gt; 移至当前行的特定字符的下一个实例,; 重复。

F&lt; char&gt; 移至当前行上特定字符的上一个实例,; 重复。

如果智能地使用,上面的两个可以让你在一条线上快速移动。

* 在单词上搜索下一个实例。

对单词进行搜索,以搜索上一个实例。

答案 10 :(得分:34)

会话

一个。保存会话

  

:mks sessionname

湾强制保存会话

  

:MKS! SESSIONNAME

℃。加载会话

  

gvim或vim -S 会话名称


添加和减去

一个。添加和减去

  

CTRL-A;将[count]添加到数字或字母字符处                或者在光标之后。 {不在Vi

     

CTRL-X;从数字或字母中减去[count]               光标处或之后的字符。 {不在Vi}

湾窗口键取消映射

  

在窗口中,   Ctrl-A已映射为需要在rc文件中取消映射的整个文件选择。   mark mswin.vim CTRL-映射部分作为注释   要么   使用unmap

添加您的rc文件

℃。使用宏

  

CTRL-A命令在宏中非常有用。例:   使用以下步骤制作编号列表。

     
      
  1. 创建第一个列表条目,确保它以数字开头。
  2.   
  3. qa - 开始录制到缓冲区'a'
  4.   
  5. Y - 拉入条目
  6.   
  7. p - 将条目的副本放在第一个
  8. 下面   
  9. CTRL-A - 增加数字
  10.   
  11. q - 停止录制
  12.   
  13. @a - 重复猛拉,放置和增加时间
  14.   

答案 11 :(得分: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.

最后一个值得一点解释:

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 "." 

对于一些更复杂的转换,例如生成所有import语句,我将一些python嵌入到vim脚本中。

经过几个小时的工作后,我有一个脚本,它至少可以完成95%的转换。我只是在vim中打开一个文件,然后运行:source fixit.vim,文件就会眨眼间转换。

我们仍然需要改变剩余的5%不值得自动化和测试结果的工作,但是通过花一天时间编写这个脚本,我估计我们已经节省了数周的工作。

当然可以使用像Python或Ruby这样的脚本语言来自动执行此操作,但是编写它会花费更长的时间并且灵活性会降低 - 最后一个例子本来就很困难,因为单独使用正则表达式不会能够处理嵌套括号,例如将bar(foo(xxx))转换为foo(xxx).bar()。 Vim非常适合这项任务。

答案 12 :(得分:28)

使用内置文件资源管理器!命令为:Explore,它允许您非常快速地浏览源代码。我在.vimrc

中有这些映射
map <silent> <F8>   :Explore<CR>
map <silent> <S-F8> :sp +Explore<CR>

资源管理器也允许您进行文件修改。我会发布一些我最喜欢的按键,按<F1>将为您提供完整列表:

  • - :最有用:更改为上一级目录(cd ..
  • mf :标记文件
  • D :删除标记的文件或光标所在的文件,如果没有标记的话。
  • R :重命名光标所在的文件。
  • d :在当前目录中创建一个新目录
  • :在当前目录中创建新文件

答案 13 :(得分:25)

我是美国密码学会的成员。双月刊杂志包括100多种各种密码。其中大约15个是“密码” - 用字母代替数字的各种类型的算术问题。其中两个或三个是sudokus,除了字母而不是数字。当网格完成时,九个不同的字母将在网格中的某个位置拼写出一些或多个单词,对角线,螺旋等。

我没有使用铅笔或手工输入问题,而是从网站的会员区域下载问题。

当使用这些sudokus时,我使用vi,因为我正在使用vi拥有的其他编辑器所拥有的设施。主要是将字母网格转换为编号网格,因为我发现它更容易解决,然后完成的编号网格返回字母网格以找到解决方案的单词。

问题被格式化为九组九个字母,-代表空白,用两行写成。第一步是将这些格式化为九行,每行九个字符。这没有什么特别的,只需在适当的位置插入八个换行符。

结果如下:

T-O-----C
-E-----S-
--AT--N-L
---NASO--
---E-T---
--SPCL---
E-T--OS--
-A-----P-
S-----C-T

因此,将其转换为数字的第一步是列出不同的字母。首先,我复制一下这个块。我将光标定位在块的顶部,然后键入:y}}p:让我处于命令模式,y猛烈移动下一个移动命令。由于}移动到下一段的末尾,y}会移动该段落。 }然后将光标移动到段落的末尾,p粘贴我们刚刚在光标后拉出的东西。因此y}}p会创建下一段的副本,并以两个副本之间的光标结束。

接下来,我将其中一个副本转换为不同字母的列表。该命令有点复杂:

:!}tr -cd A-Z | sed 's/\(.\)/\1\n/g' | sort -u | tr -d '\n'

:再次让我处于命令模式。 !表示下一个移动的内容应通过命令行传送。 }猛拉下一段,然后命令行使用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

然后可以通常的方式解决,或者输入您可能更喜欢的任何数独求解器。然后,可以使用:!}tr 1-9 ACELNOPST将完成的解决方案转换回字母。

vi中的力量与极少数其他人相匹配。最大的问题是,只有极少数的vi教程书籍,网站,帮助文件等不仅仅触及了可能的表面。

答案 14 :(得分:23)

我最近发现q:。它打开“命令窗口”并显示最近的ex-mode(命令模式)命令。您可以在窗口中照常移动,然后按<CR>执行命令。你也可以编辑等。当你搞乱一些复杂的命令或正则表达式并且你不想重新输入整个事物,或者你想要做的复杂事情是3个命令时,我们无价。它几乎就像bash的set -o vi,但对于vim本身(嘿!)。

有关更多有趣的信息,请参阅:help q:

答案 15 :(得分:23)

批量文本操作!

通过宏:

  • 从录制开始:qq
  • 做事
  • 停止录制:q
  • 重复:@q(第一次),之后@@
  • 重复20次:20@@

或通过正则表达式:

  • 替换内容::%s/[fo]+/bar/g

(但要注意:如果你做了后者,你将遇到两个问题:)。)

答案 16 :(得分:22)

前几天我刚刚发现了Vim的omnicompletion,虽然我承认我对它的作用有点朦胧,但我只是捣碎了 Ctrl + x Ctrl + u 或 在插入模式下, Ctrl + n / Ctrl + p 。它不是IntelliSense,但我还在学习它。

试一试! :help ins-completion

答案 17 :(得分:20)

这些不是快捷方式,但它们是相关的:

  1. 使封锁成为一个额外的ESC(或Ctrl)
  2. 使用此命令将leader引导至“,”(逗号):let mapleader =“,”
  3. 他们提高了我的工作效率。

答案 18 :(得分:19)

我经常使用的另一个有用的vi“快捷方式”是'xp'。这会将光标下的字符与下一个字符交换。

答案 19 :(得分:18)

&LT;按Ctrl&GT; + W,V垂直分割屏幕
&LT;按Ctrl&GT; + W,W在窗口之间切换

!python%[args]运行我在此窗口中编辑的脚本

ZF在视觉模式下折叠任意线

答案 20 :(得分:18)

视觉模式

正如其他几位人士所说,视觉模式是您复制/剪辑的答案。粘贴问题。 Vim给你'v','V'和C-v。 vim中的小写'v'与记事本中的shift键基本相同。好消息是你不必把它压低。您可以使用任何移动技术有效地导航到选择的开始(或结束)点。然后点击“v”,再次使用高效的移动技术导航到选择的另一端。然后'd'或'y'允许您剪切或复制该选择。

vim的视觉模式的优势超过了Jim Dennis对vi中剪切/复制/粘贴的描述,你不必完全正确地获取位置。有时使用快速移动来到达你想去的地方附近,然后用其他动作来改进它,而不是想出一个更复杂的单一移动命令,让你准确到达你想去的地方。

以这种方式广泛使用视觉模式的缺点是它可能成为你一直使用的拐杖,这会妨碍你学习新的vi(m)命令,这些命令可能让你更有效地做事。但是,如果您非常积极地学习vi(m)的新方面,那么这可能不会对您产生太大影响。

我还会再次强调,视觉线和视觉块模式可以让您在同一个主题上进行变化,这些主题非常强大......尤其是视觉模式。

有效使用键盘

我也不同意你的说法,交替使用手是使用键盘的最快方法。它有一个真实的元素。一般来说,重复使用相同的东西是很慢的。这个原则的最重要的例子是用同一个手指键入的连续键击非常慢。你的断言可能源于在这种模式下使用s / finger / hand / transformation的自然倾向。在某种程度上它是正确的,但在效率谱的极高端,这是不正确的。

请问任何一位钢琴家。询问他们是否可以更快地连续交替使用几个音符或依次使用单手的连续手指。键入4次击键的最快方法不是交替,而是用同一只手的4个手指以升序或降序键入它们(称之为“运行”)。一旦你考虑到这种可能性,这应该是不言而喻的。

更困难的问题是为此进行优化。在键盘上优化绝对距离非常容易。 Vim那样做。在“运行”级别进行优化要困难得多,但是使用模态编辑的vi(m)比任何非模态方法(ahem,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(或编写您自己的模式)。如果你想要两全其美,那你现在运气不好。

答案 21 :(得分:17)

花费30分钟做vim教程(在终端中运行vimtutor而不是vim)。您将学习基本动作和一些击键,这将使您至少与vim一样高效,就像您之前使用的文本编辑器一样。在那之后,再次阅读Jim Dennis的回答:)

答案 22 :(得分:16)

  

你使用Vim的方式是什么?   你比一个人更有成效   当代编辑?

能够用很少的击键执行复杂的重复编辑(通常使用macros)。看看VimGolf,看看Vim的力量!

经过十多年的日常使用,很难想象使用任何其他编辑器。

答案 23 :(得分:16)

在搜索中的任何位置使用\c来忽略大小写(覆盖您的ignorecase或smartcase设置)。 例如。 /\cfoo/foo\c将与fooFoofOOFOO等匹配。

在搜索中的任何位置使用\C来强制进行大小写匹配。 例如。 /\Cfoo/foo\C只会匹配foo。

答案 24 :(得分:16)

我很惊讶地发现没有人提到t运动。我经常将其用于dt,yt,

形式的参数列表

答案 25 :(得分:16)

奇怪没有人提到过ctags。下载“exuberant ctags”并将其置于搜索路径中已有的预装版本之前。镉到你正在做的任何事情的根源;例如Android内核分发。输入“ctags -R”。在名为“tags”的文件中构建该目录下任何位置的源文件索引。这包含所有标签,无论是语言还是dir,在一个文件中,因此跨语言工作很容易。

然后在该文件夹中打开vim并阅读:help ctags获取某些命令。我经常使用的一些:

  • 将光标放在方法调用上并键入CTRL-]以转到该方法 定义。

  • 键入:ta name转到name的定义。

答案 26 :(得分:14)

答案 27 :(得分:14)

自动缩进:

gg(转到文档开头)
=(缩进时间!)
shift-g(转到文档末尾)

您的.vimrc文件中需要'filetype plugin indent',并且可能需要适当的'shiftwidth'和'expandtab'设置。

答案 28 :(得分:13)

多个缓冲区,特别是在它们之间快速跳转,以便将:bp:bn两个文件进行比较(正确地重新映射到 单 Shift + p Shift + n

vimdiff模式(分成两个垂直缓冲区,颜色显示差异)

区域复制 Ctrl + v

最后,选项卡标识符的完成(搜索“mosh_tab_or_complete”)。那是生活改变者。

答案 29 :(得分:12)

同意顶级海报 - :r!命令非常有用。

我经常使用它来“粘贴”东西:

:r!cat
**Ctrl-V to paste from the OS clipboard**
^D

这样我就不必摆弄:set paste

答案 30 :(得分:10)

你可以在替换字符串中使用\ =,这是我经常做的事情。

如果您在vim中拥有基本上无序的列表,请使用#作为标记,您可以将其转换为有序列表。

# CSSLINT
# PHPCS
# Charlie
# Delta

如果从第一行开始,你可以

:1,6s/#/\=line(".")/g

将其转换为

1 CSSLINT
2 PHPCS
3 Charlie
4 Delta

如果它不在第一行开始,只需做数学运算:

:16,20s/#/\=line(".") - 15/g

更多信息:help sub-replace-expression

答案 31 :(得分:10)

我最有成效的vi / Vim技巧是:

:%s

我喜欢能够动态使用正则表达式来替换文件中我想要的任何内容。每个文本编辑器都应该支持正则表达式恕我直言。

答案 32 :(得分:10)

cit - 使用插入模式中的转换清空标记的内容

yit - 复制标记的内容

答案 33 :(得分:10)

使编辑更快的第三个标准是所需的击键次数。我认为这比你的其他更重要2.在vim中,几乎所有操作都需要的键击次数比我熟悉的其他编辑器少。

你提到你在使用cut&amp; amp;粘贴,但听起来你需要更多使用vim中的一般运动命令的经验。猛拉3个字:y3w从光标到下一个分号:yf;下次出现最近一次搜索:yn所有这些都比在按住修改键时尝试使用鼠标导航要快得多。 此外,正如CMS的响应中的一些示例所示,vim的运动命令经过高度优化,可以高效地导航C和C ++源代码。

关于'如何使用vim让我更有效率?'的问题,我希望答案是:“有效”。

答案 34 :(得分:9)

将以下内容映射到简单的键组合后,以下内容对我非常有用:

在路径上跳转到文件

gf

获取现有文件的完整路径名

:r!echo %:p

获取现有文件的目录

:r!echo %:p:h

运行代码:

:!ruby %:p

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/

运行当前程序:

   map ,rby :w!<cr>:!ruby %:p<cr>

检查当前程序的语法:

   map ,c :w!<cr>:!ruby -c %:p<cr>

运行当前规范程序的所有规范:

   map ,s :w!<cr>:!rspec %:p<cr>

破解它打开irb:

   map ,i :w!<cr>:!irb<cr>

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>

rails abbreviations:

用户身份验证:

     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中打开视觉选择的网址:

"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:运行包含当前行的规范:

"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:运行包含当前行的规范:

"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:运行包含调试的当前行的规范:

"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

"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

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>);

答案 35 :(得分:9)

这是我发现有助于学习Vim的另一个site。这也很有趣! :)

  

VIM Adventures是一款基于VIM键盘快捷键的在线游戏   (命令,动作和操作员)。这是“塞尔达语遇到文本编辑”   游戏。这是一个练习和记忆VIM命令的益智游戏   (当然也包括好老VI)。这是一种简单的学习方式   VIM没有陡峭的学习曲线。

答案 36 :(得分:7)

在代码中的某些位插入文本:

ctrl + v, (selecting text on multiple lines), I, (type something I want), ESC

录制宏以编辑文本并运行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

答案 37 :(得分:7)

Ctrl-w Ctrl-f ............ open file under cursor in new window
Ctrl-6 ................... alternate file
'0 ....................... open last file
:x ....................... close if save

答案 38 :(得分:7)

暂时忽略这个问题(我的答案如下),可能有助于解决你的问题:

:map <C-F> /\V

这将使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>+

(从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>

标签文件还允许使用一些(我的)插件,这些插件可以更清晰地显示错误(通过突出显示已识别的标签而不突出显示无法识别的标签),并在移动鼠标时显示tag signatures关键字。

答案 39 :(得分:6)

http://www.viemu.com/a-why-vi-vim.html是一篇很好的宣传文章。它解释了使用命令重复上一次编辑的强大功能。

  

复制/剪切&amp;糊。我做到了   时间。所有的经典编辑   你用左手按Shift键,   并用你的光标移动光标   右手选择文字。然后按Ctrl + C.   复制,移动光标并按Ctrl + V.   糊剂。

     

对于Vim来说,这太可怕了:

* 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。

答案 40 :(得分:6)

具体来说,对于复制/剪切和粘贴,使用可视模式可以更容易地适应其他编辑器。所以我通常剪切和粘贴的方式是:

  • Esc - 退出插入模式(如果您已处于正常模式,则跳过)
  • v - 启用可视模式
  • 移动文件以选择所需的文本 - 可视模式将显示所选的字符。对于单词web非常有用(分别移至下一个单词的开头,下一个单词的结尾和此单词/前一单词的开头)。
  • d - 剪切文字(如果要复制文字,请使用y
  • 移动到您想要文本的位置
  • p - 粘贴(此粘贴在当前字符后,P粘贴到当前字符之前。

同样有用的是使用V进入可视模式(线),自动选择整行,光标在线上。

答案 41 :(得分:5)

实际上我总是丢失我的缓冲区,所以我通常复制一系列行的方法是将它写入临时文件,然后在适当的位置读取它。

e.g。

ka(设置标记)

“一个,. w ^! t(将标记中的所有内容复制到文件中)

..移动光标..

:。r t(读入当前地点)。

这可能涉及的键击次数少于使用缓冲区,更容易跟踪,并且您可以使用长期粘贴文件。我通常使用1个字母的名称作为速度。

这个快速的关键原因是,要移动光标,只需使用搜索功能“/”,如果在到达目的地之前遇到另一种模式,则使用“n”。

答案 42 :(得分:5)

如何进一步缩短快捷方式?


加入.vimrc:
nnoremap; :

这样输入commmandmode更容易: ;q;w工作,而不只是:q:w

两次击键而不是三次击键,你经常需要它。


系统管理员不好,因为他们需要开箱即用的相同功能,在每个方框都是相同的。

但使用vi为程序员提供了 HUGE

答案 43 :(得分:4)

除了关于grokking vi的好回复之外,还应该注意vim 添加一些非常类似于vi的功能,这些功能使得使用vi命令更加出色。首先想到的是文本对象:{!}fmt代替!apfmt重新格式化当前段落,a也是如此。它的工作原理是首先指定我们要选择foo文本对象,这是当前的。类似地,要将当前字符串文字(bar更改为T"ct"bar作为示例),而不是"(移至上一个"之后,更改< / em>直到下一个ci"bar之前,插入 bar ),您可以说{{1}}:更改内部(最里面)引号,插入 bar

根据文本对象而不是移动命令进行思考是非常好的。

答案 44 :(得分:4)

您可以搜索注册表的内容。

假设您的注册x包含

  

要搜索的字符串

要搜索此字符串,您必须输入正常模式
/ CTRL-R X 输入

它会粘贴x注册表的内容。

答案 45 :(得分:3)

有很多vim技巧,但截至目前,我真正喜欢的是 Ctrl + A 因为我碰巧正在处理一些问题硬编码数组索引的代码。

答案 46 :(得分:3)

一系列vim命令ggVGg?将Rot13密码应用于当前文档中的文本。

Gung vf zl zbfg cebqhpgvir fubegphg fvapr V nyjnlf glcr va Ebg13。

答案 47 :(得分:2)

快速剪切和覆盖部分:

编辑线条时,一个非常常见的任务是从当前光标位置切割到某个位置并覆盖新内容。

您可以使用以下命令:

ct<identifier>用于前切。

cT<identifier>用于向后切割。

要剪切的行中的字符在哪里。

示例:让我们说这是您要编辑的行,光标位于I

Hi There. I am a Coder and I code in : Python and R

您要剪切至:并使用I am a programmer覆盖,键入:ct:,然后键入I am a programmer。这将导致:Hi There. I am a programmer: Python and R

快速删除部分内容:

如上所述,从以下命令中删除当前光标位置的内容,直到“标识符”

dt<identifier>用于转发删除

dT<identifier>用于向后删除

希望这对你也有用。

答案 48 :(得分:1)

答案 49 :(得分:0)

我的.vimrc中的

nnoremap q; q:在制作复杂的搜索和替换时保留了流量。