我听说过很多关于Vim的利弊。看起来你应该 (作为开发人员) 使用 Vim 比使用任何其他编辑器都要快。我正在使用 Vim 来做一些基本的事情,而我使用 Vim 的效率最多只有10 倍。
当你谈论速度时,你唯一应该关心的两件事(你可能不够关心它们,但你应该)是:
交替使用左手和右手是最快的使用键盘的方式。
切勿触摸鼠标是第二种尽可能快的方法。您需要花费很长时间才能移动手,抓住鼠标,移动鼠标并将其带回键盘(并且您经常必须看着键盘以确保将手正确地返回到正确的位置)
这里有两个例子来说明为什么我使用 Vim 的效率要低得多。
复制 / 剪切和粘贴。我一直都在这样做。对于所有当代编辑器,您都可以用左手按Shift,然后用右手移动光标以选择文本。然后Ctrl+C复制,然后移动光标并 Vim 是可怕的: 另一个例子?搜索和替换。 在PSPad中:Ctrl+f然后键入要搜索的内容,然后按Enter。 在 Vim: 和一切与 Vim 是这样的:似乎我不知道如何处理它的正确方法。 我的问题是: 您使用 Vim 的方式是什么,使您比使用当代编辑器更有效率?yy
复制一行(您几乎不想要整行!)[number xx]yy
将xx
行复制到缓冲区中。但是您永远不知道是否选择了所需的内容。我经常要做[number xx]dd
然后u
撤消!/
中,然后键入要搜索的内容,然后如果在each特殊字符之前放置了一些特殊字符\
,则按Enter。
Vim的问题是您不熟悉vi。
您提到使用yy
进行剪切,并抱怨您几乎从不希望剪切整行。实际上,编辑源代码的程序员通常希望处理整行,行范围和代码块。但是,yy
只是将文本拉入匿名复制缓冲区(或在vi中称为“register”)的多种方法之一。
vi的“禅”是你在说一种语言。首字母y
是动词。语句yy
是y_
的同义词。y
被加倍以使键入更容易,因为它是一种常见的操作。
这也可以表示为dd
P
(删除当前行并将副本粘贴回原位;将副本保留在匿名寄存器中作为副作用)。y
和d
“动词”将任何运动作为其“主语”。因此,yW
是“从此处(当前光标)到结尾的下一个单词
如果您只了解基本的向上,向下,向左和向右光标移动,那么vi对您来说不会比“记事本”的副本更有效率。(好的,您仍然可以使用语法突出显示和处理大于约 45KB 左右的文件的能力;但在这里与我合作)。
vi有 26 个“标记”和 26 个“寄存器”。因此,使用m
命令将标记设置为任何光标位置。每个标记由一个小写字母指定。因此,ma
将“a”命令设置为当前位置,mz
将“”标记设置为“4
因为这些是“运动”,所以它们也可以用作其他“陈述”的主题。
因此,剪切任意文本选择的一种方法是丢弃一个标记(我通常使用 'a' 作为我的“第一个”标记,'z' 作为我的下一个标记,并且 'e' 作为另一个标记(我不记得在使用的 15 年中如何交互使用一个 /b>;
我说这已经是剪切或复制文本的一种方法。但是,这只是众多方法之一。通常,我们可以更简洁地描述文本范围,而无需移动光标并放下标记。例如,如果我在一段文本中,则可以使用{
和}
分别移动到段落的开头或结尾。因此,要移动一段文本,我使用
“段落”的概念默认为通常在直觉上合理的东西。因此,它通常适用于代码和散文。
我经常知道一些模式(正则表达式),它标记了我们感兴趣的文本的一端或另一端。向前或向后搜索是vi中的移动。因此,它们也可以在我们的“语句”中用作“主题”。因此,我可以使用d/foo
从当前行剪切到下一行包含字符串“foo”和y?bar
最近复制
除了“verbs”和“subjects”之外vi还将当前 i / register em 的 a 'register 前缀从这里简单地粘贴到“对象”中(在该术语的语法意义上)。到目前为止,我只描述了匿名寄存器的使用。但是,我可以使用 26 个“命名”寄存器中的任何一个,如果前缀为"
。
这种“前缀”的概念还将语法“形容词”和“副词”的类似物添加到我们的文本处理“语言”中。大多数命令(动词)和运动(动词或对象,取决于上下文)也可以采用数字前缀。因此,3J
表示“连接接下来的三行”,而d5}
表示“从当前行到此处的第五段末尾删除”。
这都是中级的vi。没有一个是Vim特定的,如果您准备学习它们,vi中有更高级的技巧。如果您只掌握这些中间概念,那么您可能会发现您很少需要编写任何宏,因为文本操作语言足够简洁和富有表现力,可以使用编辑器的“本地”语言轻松地完成大多数事情。
更高级的技巧样本:
有许多:
命令,最著名的是:% s/foo/bar/g
全局替换技术。(这不是高级的,但其他:
命令也可以)。整个:
命令集历史上由vi的先前版本继承为ed(行编辑器)。
:
命令通常在文本行上操作。ed和ex是在终端屏幕不常见且许多终端都是“电传”(TTY)设备的时代编写的。因此,通常通过非常简洁的界面使用命令从文本的打印副本开始工作(常见的连接速度是 110 波特,或者大约是每秒 11 个字符,这是常见的打字速度。
因此,大多数:
命令的语法是将所有/i>行的地址或地址范围(行号)后跟一个命令。自然可以使用文字行号::127,215 s/foo/bar
将 127 和 215 之间的每一行上的“foo”的第一个出现更改为“bar”。还可以使用一些缩写,例如.
或$
:... g
和:... v
在这里表示包含“当前行”的字符串,因为它们非常强大。:... g
是“全局”将后续命令应用于所有匹配模式的行的前缀(正则表达式),而:... v
将这样的命令应用于所有不匹配给定模式的行(“v”来自“conVerse”)。
有趣的是,常见的 Unix 命令grep实际上是在第一个ex命令中使用的(通常以其记录方式命名)。ex命令:g/re/p
(grep)是他们记录如何“全局”“打印”包含“正则表达式”(re)的行的方式。当ed
请注意,:% g/.../d
或(其 reVerse / conVerse 对应::% v/.../d
是最常见的使用模式。但是,还有其他几个ex
命令值得记住:
我们可以使用m
来移动文件中的所有行,并使用j
来连接行。例如,如果您有一个列表,并且您想将所有匹配的内容(或相反地不匹配某些模式)分开,而不删除它们,那么您可以使用::% g/foo/m$
...并且所有“foo”行将被移动到文件的末尾。(请注意有关使用
通常,我可以找到需要连接到其前身的所有行的模式(例如,在某些列表中以“^”而不是“^ *”开头的所有行)。对于这种情况,我将使用::% g/^ /-1j
(对于每个匹配的行,向上连接一行并加入它们)。(顺便说一句:对于试图搜索行并加入下一行的列表,它只能继续工作。
几乎不用说,您可以使用我们的老朋友s
(substitute)来将所有包含“fozzi”的实例与g
和v
(global / converse-global)命令分开。通常不需要这样做。但是,请考虑某些情况,您只想在与其他模式匹配的行上执行替换。通常可以使用复杂
关键是,ex
命令集中不仅仅有p
、s
和d
行。
:
地址也可以引用标记。因此,您可以使用::'a,'bg/foo/j
将包含字符串 foo 的任何行连接到其后续行,如果它位于“a”和“b”标记之间的行之间。(是的,前面的所有ex
命令示例都可以通过定址限制为这些文件行的
这是相当模糊的(在过去的 15 年中,我只使用过几次这样的东西)。但是,我可以自由地承认,我经常迭代地和交互式地做事情,如果我花时间想出正确的咒语,可能会更有效地完成。
另一个非常有用的vi或ex命令是:r
读入另一个文件的内容。因此::r foo
在当前行插入名为“foo”的文件的内容。
更强大的是:r!
命令。这将读取命令的结果。这与暂停vi会话,运行命令,将其输出重定向到临时文件,恢复vi会话以及从 temp 中读取内容相同。文件。
更强大的是!
(bang) 或:... !
bang) 的常用工具 reformiters 的first /b>行的或first /i>行将其转换为行。这些工具还可以执行外部命令并通过命令将结果读入当前文本!这可以使用2
使用:r!
和!
命令意味着任何外部实用程序或过滤器都可以视为我们编辑器的扩展。我偶尔会将它们与从数据库中提取数据的脚本一起使用,或者与从网站中提取数据的wget或lynx命令或从远程系统中提取数据的ssh命令一起使用。
另一个有用的技巧ex命令是:so
(:source
的缩写)。这可以将文件的内容作为一系列命令读取。当您启动vi时,它通常会隐式地对~/.exinitrc
文件执行:source
(Vim通常会在
例如,我有一个七行文件(36 个字符),它通过wc运行一个文件,并在包含该字数数据的文件顶部插入一个 C 风格的注释。我可以使用以下命令将该“宏”应用于文件:vim +'so mymacro.ex' ./mytarget
(已知的+
命令行选项vi和Vim通常用于在给定的行号处启动编辑会话。但是,鲜为人知的事实是,可以通过任何有效的ex命令 / 表达式跟随+
服务器,例如“source”命令,就像我在这里所做的那样从主机中
通常,使用 Perl 、 AWK 、sed编写这样的“宏”要容易得多(实际上,它类似于grep一个受ed命令启发的实用程序)。
@
命令的使用可能是最晦涩的vi命令,而不是通过它的完整路径 koribeous I。在将近xx年的高级系统管理课程中,我遇到了很少有人使用它。@
执行寄存器的内容,就好像它是vi或ex命令一样。
0i:r
(将当前行转换为有效的:r命令),
"cdd
(删除“c”寄存器中的行)和
@c
执行该命令。
这只是 10 次击键(而表达式"cdd
@c
对我来说实际上是一个手指宏,所以我几乎可以像任何常见的六个字母单词一样快速地键入它)。
发人深省的想法
我只触及了vi的力量的表面,我在这里描述的都不是vim命名的“改进”的一部分!我在这里描述的所有内容都应该适用于 20 或 30 年前的vi的任何旧副本。
有些人比我使用了更多的vi的力量。
你说的是文本选择和复制,我认为你应该看看Vim Visual Mode。
在视觉模式下,您可以使用 Vim 命令选择文本,然后您可以对选择进行任何操作。
请考虑以下常见情况:
您需要选择下一个匹配的括号。
你可以做:
v%
如果光标在开始 / 结束括号上
vib
如果光标在括号块内
您要选择引号之间的文本:
vi "用于双引号
vi '用于单引号
你想选择一个大括号块(在 C 风格的语言很常见):
viB
vi{
您要选择整个文件:
ggVG
Visual block selection是另一个非常有用的功能,它允许您选择文本的矩形区域,您只需按Ctrl-V启动它,然后选择您想要的文本块并执行任何类型的操作,如 yank 、删除、粘贴、编辑等。编辑面向列的文本非常棒。
一些生产力提示:
智能移动
*
和#
向前 / 向后搜索光标下的单词。
w
到下一个单词
W
到下一个空格分隔的单词
b
/e
到当前单词的开头 / 结尾。(B
/E
仅用于空格分隔)
gg
/G
跳转到文件的开头 / 结尾。
%
跳转到匹配的 {..} 或 (..) 等。
{
/}
跳转到下一段。
'.
跳回到上次编辑的行。
g;
跳回到上次编辑的位置。
快速编辑命令
I
在开头插入。
A
追加到结尾。
o
/O
在当前之后 / 之前打开新行。
v
/V
/Ctrl+V
视觉模式(选择文本!)
Shift+R
替换文本
C
更改行的剩余部分。
组合命令
大多数命令接受数量和方向,例如:
cW
= 改变直到单词结束
3cW
= 更改 3 个单词
W
= 以全字开头,更改全字
ciW
= 改变内词。
ci"
= 在“..”之间更改内部
ci(
= 在 (..) 之间更改文本
ci<
= 在 & lt;..& gt;之间更改文本(在 vimrc 中需要set matchpairs+=<:>
)
4dd
= 删除 4 行
3x
= 删除 3 个字符。
3s
= 替换 3 个字符。
有用的程序员命令
r
替换一个字符(例如rd
用d
替换当前字符)。
~
改变大小写。
J
连接两行
Ctrl + A / Ctrl + X 递增 / 递减一个数字。
.
重复上一个命令(一个简单的宏)
==
修正行缩进
>
缩进块(在可视模式下)
<
未缩进块(在可视模式下)
宏录制
按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 ackup # 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,cl
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 中工作,我想在这里给出适当的语法突出显示)。
我在这里列出的命令是非常基本的,也是我到目前为止使用的主要命令。他们已经让我更有效率,而不必知道所有花哨的东西。
控制+R机制非常有用:-) 在插入模式或命令模式(即在:
行上键入命令时),继续使用编号或命名的寄存器:
"未命名的寄存器,包含上次删除或 yank 的文本
%当前文件名
#备用文件名
*剪贴板内容(X11:主要选择)
+剪贴板内容
/上次搜索模式
:最后一个命令行
.最后插入的文本
-最后一个小(小于一行)删除
= 5 * 5将 25 插入文本(迷你计算器)
有关更多详细信息,请参见:help i_CTRL-R
和:help c_CTRL-R
,并在附近窥探更多 CTRL-R 的优点。
本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处
评论列表(73条)