vim 命令备忘

来源:互联网 发布:软件售后服务工作内容 编辑:程序博客网 时间:2024/05/18 00:01

vi/vim剪切复制粘贴



选中:    冒号提示下,按v,移动光标选中区域

剪切:    d
复制:    y
粘贴:    p

在可视模式下直接使用,这个更简单些:

剪切 ndd ;(当前行的开始和结尾d^; d$)

复制 nyy
粘贴
小写p:在当前光标处下面粘贴内容
大写P:在当前光标处上面粘贴内容

例子 复制:
按 yy 复制光标所在行
按2yy,copy光标所在行和以下的1行

按nyy(n为数字哦),copy光标所在的行和以下的n-1行

光标移动:

nG :到指定行 (n:一个整数)

G:最后一行

gg: 第一行

$: 当前行的最后

^:当前行的开始

y^复制至行首,或y0。不含游标所在处字元。
y$复制至行尾。含游标所在处字元。
yw复制一个word。
y2w复制两个字(单词)。
yG复制至档尾。
y1G复制至档首。
p小写p代表贴至游标后(下)
P大写P代表贴至游标前(上)

 Ctrl-f    即 PageDown 翻页。
Crtl-b    即 PageUp 翻页。

宏使用:

qaddq 2@a;

 

q表示进入录制模式,后面的a表示将录制的过程存入a命令,dd是具体的删除一行字符的命令,q表示录制结束,2@a表示执行刚刚录制的过程a两次。


注释多行文本

1. 使用vim打开要操作的文件
2. Ctrl+q,进入VISUAL BLOCK模式
3. 使用上下的方向键移动光标,选择你需要注释的行
3. shift+i
4. 输入注释符号 #
5. esc,退出visual block模式,
稍微等待一下(其他行的注释可能会有一些延迟),是不是已经将多行注释掉了啊?

取消注释多行文本

取消注释也类似,而且更简单一些,如下:
1. 使用vim打开要操作的文件
2. Ctrl+q,进入VISUAL BLOCK模式
3. 使用上下的方向键移动光标,选择你需要取消注释的行
3. 输入 x,删除所有的 #,同时退出visual block模式

Ctrl+V 进入visual block 有冲突,改为 ctrl+q


全选并删除:按esc后,然后dG, 或 :%d 或 :1,$d
全选并复制:按esc后,然后ggyG
全选高亮显示:按esc后,然后ggvG或者ggVG

删除光标以后内容: dG
当前行复制: yy, p 粘贴

复制 "+y
粘贴 "+gP


vim中对齐数据格式;

调用外部命令 %!column -t


删除^M的方法:

1.  :% s/^M//g  其中 ctrl+v 接下来ctrl+m 才能出现真正的文件中的^M.


2  :% s/\r//g

插入:

摘自:http://www.2cto.com/os/201212/178262.html

o(O):在下(上)一行插入

tips1:10I*<Esc>先输入10,然后输入i,接着输入*号,最后按<Esc>
     这样就可以在一行开头输入十个*
tips2:同样,5o###<Esc>先输入5,然后输入o,接着输入###,最后按<Esc>
     这样就可以在下列5行中每一行开头插入###
合并行
有时候你也许会想合并两行
J  合并两行
你只需要把光标移动到首行,然后按3次J即可

vim中使用标记


一、当你用 "G" 命令跳到另一个地方,Vim 会记住你从什么地方跳过去的。这个位置成为一个标记,要回到原来的地方,使用如下命令:``
 `` 命令可以在两个位置上跳来跳去。而 CTRL-O 命令则跳到一个 "较老" 的地方 (提示: O 表示 older)。CTRL-I 则跳到一个 "较新" 的地方
 :jumps 命令能输出一个你可以跳往的位置的列表。最后一个你使用的标记会用 ">" 符号标记出来。
二、Vim 允许你在文本中放置自定义的标记。命令 "ma" 用 a 标记当前的光标位置。你可以在文本中使用 26 个标记 (a 到 z)。这些标记是不可见的,只是一个由 Vim 记住的位置。
    要跳到一个你定义的标记,可以使用命令 `{mark},这里 {mark} 是指定义标记的那个字母。所以,移到标记 a 的命令是: `a
三、你可以用如下命令取得所有的标记的列表::marks
到有一些特殊的标记,包括:
        '       跳转前的光标位置
        "       最后编辑的光标位置
        [       最后修改的开始位置
        ]       最后修改的结束位置


跨文件复制

摘自:http://hi.baidu.com/epeak/item/1849cd3647223dd56c15e93a


大家在vi编辑中,常常遇到想把文件A里面的一行或多行,复制到B文件里面去
 

(A).yw

将当前字存入无名缓冲区,前面可加"x,表示存入名字为x的有名
缓冲区(x为a-z),也可加数字表示存入的字数,以后可用P或p命
令取出  


(B).yy 将当前行存入无名缓冲区,用法参看yw

命令如下:a-Z 是缓冲区,也可移出数字1-9指定的删除缓冲区
利用命名缓冲区可很好地保存若干文本段,便于以后存取、移动或者重排。这些缓冲区用a到z字母命名!为了访问这些缓冲区中的一个,要使用双引号
例如:要把一行插入a缓冲区,可键入:
"ayy
为了把这个文本放回该文件中,键入"ap


(c).m做标志命令:


m 字母 用字母标记当前行,以后可用 '字母使光标移动到当前行,
(参看'命令)

列子:1。将a文件中的10行到b文件中

      命令如下:

    "ay10+
      :ex b (转到b文件中)
       然后"ap

2. 将a中多行复制到b文件中
先在开始处做标志mk(书签)
然后在末尾用"ay'k (光标自动回到开始处,此时已经把你的内容放到缓冲区了)
--其中a表示缓冲区a
然后用ex转义到你的文件B中,然后用"ap命令粘贴就行


替换

http://blog.sina.com.cn/phpsir

:%s/str1/str2/gc 替换全文所有符合的单词并让用户确认
:g/str1/s//str2/gi 用字符串 str2 替换正文中所有出现的字符串str1,在查找时不区分大小写,此命令没有下面的严格,经测试显示,不能完全做到在查找时忽略大小写
:%s/str1/str2/gi 用字符串 str2 替换正文中所有出现的字符串str1,在查找时不区分大小写,在查找时可以完全做到忽略大小写
:10,20s/^/ / 将第10行至第20行资料的最前面插入5个空白
:%s/$/str/g 在整个文件每一行的行尾添加“str”
:3,7s/str1/str2/g仅替换文件中的第3行到第7行中的“str1”成“str2”
:%s/:.*//g删除/etc/passwd中用户名后面的从冒号开始直到行尾的所有部分(前提是已经打开了/etc/passwd文件)

 

从上述替换命令可以看到:g放在命令末尾,表示对搜索字符串在光标所在行的每次出现进行替换;不加 g,表示只对搜索字符串的首次出现进行替换;g放在命令开头,表示对正文中所有包含搜索字符串的行进行替换操作。上面的命令中的/只是起分隔作用,也可以用其他的字符代替。另外,可以在正规式里用\(和\)来剥离一个序列。

 

例如:有些字符域使用得很频繁. Vim 为这些字符域提供了预定义域:
项 匹配 相当于
\d 数字 [0-9]
\D 非数字 [^0-9]
\x 十六进制数字 [0-9a-fA-F]
\X 非十六进制数字 [^0-9a-fA-F]
\s 空白字符 [ ] ( 和 )
\S 非空白字符 [^ ] (非 和 )
\l 小写字母 [a-z]
\L 非小写字母 [^a-z]
\u 大写字母 [A-Z]
\U 非大写字母 [^A-Z]
& 所有查找时匹配到的东西
\[Ee] 更改大小写的选择区域的终点

:%s/\s\+$// 删除行尾多余的空格

命令前面指明范围是“%”,所以这会作用于整个文件。“substitute”命令的样式是“\s\+$”。这表示行末($)一个或者多个(\+)空格(\s)。:g/\(foo\)\(bar\)/s/\2/\1baz/g将foobar替换成foobaz

删除重复行

https://vim.wikia.com/wiki/Uniq_-_Removing_duplicate_lines

sort u

g/^\(.*\)$\n\1$/dg/\%(^\1$\n\)\@<=\(.*\)$/d
g/\%(^\1\>.*$\n\)\@<=\(\k\+\).*$/d
g//d <-- Delete the lines matching the regexp\@<= <-- If the bit following matches, make sure the bit preceding this symbol directly precedes the match\(.*\)$ <-- Match the line into subst register 1\%( ) <--- Group without placing in a subst register.^\1$\n <--- Match subst register 1 followed by end of line and the new line between the 2 lines


删除所有内容(先用G转到文件尾),使用:

1,.d

或者删除第9行到第200行的内容(先用200G转到第200行),使用

9,.d 或则9,$d

删除说明:这是在vi中,“.”当前行,“1,.”表示从第一行到当前行,“d”删除.

$在此表示最后一行。


取消高量显示的两个办法:

1)按esc键,输入:nohl 或 noh

2)按esc键,查找不存在的字符串,例如/xxxx

列编辑模式

http://blog.csdn.net/wzhigg/article/details/4367672

如何使用VIM的列编辑模式?我使用的VIM FOR WINDOWS,一直都听说VIM有列编辑模式,一直没有使用过,试了几次都失败了。今天又因为工作需要,到网上查了一下,经过不断的尝试,终于使用成功了,在这里和大家分享一下:1. 在命令模式使用下面的快捷键:CTRL+q,小写的q就可以了2. 然后使用HJKL四个键来移动和选中相关的行和列,你发现你可以选中一个区块了,千万不能用鼠标。3. 如果想在区块的左侧增加一列文本,选中区块后,按大写的I,然后光标自动到区块左上角的位置,你可以输入内容了,你可能以为怎么不是每列都插入啊?别急啊,输完内容后按ESC键,奇迹发生了,每行都增加了同样的内容,呵呵。4. 如果想删除一个区块,更容易,选中后按DEL即可


分屏启动Vim

http://coolshell.cn/articles/1679.html


  1. 使用大写的O参数来垂直分屏。
    vim -On file1 file2 ...
  2. 使用小写的o参数来水平分屏。
    vim -on file1 file2 ...

注释: n是数字,表示分成几个屏。

关闭分屏 

  1. 关闭当前窗口。
    Ctrl+W c
  2. 关闭当前窗口,如果只剩最后一个了,则退出Vim。
    Ctrl+W q

分屏

  1. 上下分割当前打开的文件。
    Ctrl+W s
  2. 上下分割,并打开一个新的文件。
    :sp filename
  3. 左右分割当前打开的文件。 
    Ctrl+W v
  4. 左右分割,并打开一个新的文件。
    :vsp filename

移动光标

Vi中的光标键是h, j, k, l,要在各个屏间切换,只需要先按一下Ctrl+W

  1. 把光标移到右边的屏。
    Ctrl+W l
  2. 把光标移到左边的屏中。
    Ctrl+W h
  3. 把光标移到上边的屏中。
    Ctrl+W k
  4. 把光标移到下边的屏中。
    Ctrl+W j
  5. 把光标移到下一个的屏中。.
    Ctrl+W w

另外更改窗口宽度的命令是: Crtl+w > 将当前窗口向右边扩展一行,将 > 换成 < 就是向左边扩展一行。也可以在之前使用数字代表扩展的行数, 5 Ctrl+w > ,向右边扩展5行。

更改窗口高度类似,只是命令是Ctrl+w + ,增加高度,- 减小高度。


在文件之间切换:

Ctrl+6—下一个文件

:bn—下一个文件

:bp—上一个文件

重新载入当前文件:

:e
:e! #放弃当前修改,强制重新载入

 重新载入所有打开的文件:

:bufdo e 或者 :bufdo :e!

:set scrollbind "设置多窗口同步滚动":set noscrollbind "取消多窗口同步滚动"

vim中大小写转化的命令是

http://blog.csdn.net/guowake/article/details/2217086

gu或者gU
形象一点的解释就是小u意味着转为小写;大U意味着转为大写.

剩下的就是对这两个命令的限定(限定操作的行,字母,单词)等等

1、整篇文章大写转化为小写
  打开文件后,无须进入命令行模式。键入:ggguG

解释一下:ggguG分作三段gg gu G
gg=光标到文件第一个字符
gu=把选定范围全部小写
G=到文件结束
2、整篇文章小写转化为大写
  打开文件后,无须进入命令行模式。键入:gggUG

解释一下:gggUG分作三段gg gU G
gg=光标到文件第一个字符
gU=把选定范围全部大写
G=到文件结束
3、只转化某个单词
guw 、gue
gUw、gUe
这样,光标后面的单词便会进行大小写转换
想转换5个单词的命令如下:
gu5w、gu5e
gU5w、gU5e
4、转换几行的大小写
将光标定位到想转换的行上,键入:1gU 从光标所在行 往下一行都进行小写到大写的转换
10gU,则进行11行小写到大写的转换
以此类推,就出现其他的大小写转换命令
gU0        :从光标所在位置到行首,都变为大写
gU$        :从光标所在位置到行尾,都变为大写
gUG        :从光标所在位置到文章最后一个字符,都变为大写
gU1G      :从光标所在位置到文章第一个字符,都变为大写

vimrc编辑技巧

添加版主文档

在命令行下 helptags xx/doc

其中由于doc文件夹含有空格路径,记得处理为windows下的短路径模式即可。

如我的helptags d:/PROGRA~1/Vim/vim73/doc

关于 <leader> 还有一个需要注意的一点是,mapleader 这个变量要在定义这个 mapping 之前就定义好,在这个 mapping 已经定义了之后再更改,是没有效果的。如果没有定义过这个变量,默认用的是 反斜杠(\)。因此一般这个变量要在 .vimrc 里定义。
let mapleader=','let mapleader='\'

vim合并多行

http://shilcare.diandian.com/post/2012-05-30/vim-merge-multi-lines J
visual下 大写 J:下 join

都会把当前行的下一行删除,并添加到当前行的末尾。但是现在有两个相邻段,如何高效的把第二段的每行合并到第一段的相应行呢?对程序员来说,用自然语言描述这个问题有点困难 :),用代码可能会更清楚些:

[a[i] +  b[i] for  i in  range ( min ( len (a), len (b)))]

举个例子:

abcdef. . .

123456. . .

合并后应该变成;

abc123def456

得票最高的答案是这样的:

:5,8del | let l=split(@", "\n") | 1,4s/$/\=remove(l, 0)/

这是通过管道连接的三个命令。首先命令 5,8del 删除5到8行,存储在默认寄存器 @" 中。然后用split分隔成一个列表,最后用列表中的每条依次替换1,4行的末尾,也就达到了合并的效果。不过,这个答案并不是最简洁的,而且当两段的行数不一致时,还会出现问题。最简洁的要数这条:

 

:1,g/^/''+m. | -j!

这条命令的主体是 :global,在执行这条命令之前,光标所在行应该是第二段首行的上一行。

:[range]g[lobal]/{pattern}/[cmd]

:global首先对第一行到当前行逐行扫描,标记匹配{pattern}的行。然后在第二遍扫描的时候,对于标记行,执行命令 ''+m.|-j!。首先 ''+m. 这个是 :move (:he :move)命令。

''+,所指的range是哪里呢? ''(两个单引号)是指最近一次跳转之前的位置,这是利用了Vim在执行 :global 命令前会把光标当前位置加入到jump list中。

注意我们可以在line number后加上+[number]或者-[number](:he :range),number如果不指定默认是1。

好了,这下我们知道''+指向的是光标所在行的下一行,也就是第二段的首行。然后 . 指向的是:global命令最近处理的那行。

这条move命令就会把光标所在行的下一行移动到:global命令最近处理的那行的下一行。管道后面的是个:join命令,也就是把这两行合并。

注意这条命令在第二段的行数小于第一段的行数的情况下执行时可能会有错误信息,但不会影响最终结果,为了不再看到那讨厌的ERROR,把这条命令修改成

:sil!1,g/^/''+m. | -j!

vim删除空格

http://www.cnblogs.com/sunyubo/archive/2012/06/20/2708244.html

行末:$ 行首:^空格:\s行末空格:\s\+$行首空格:^\+\s有些人认为行末的空格是无用,浪费而难看的。要删除这些每行后面多余的空格,可以执行如下命令::%s/\s\+$//命令前面指明范围是 "%",所以这会作用于整个文件。"substitute" 命令的匹配模式是"\s\+$"。这表示行末($)前的一个或者多个(\+)空格(\s)。后面我们会介绍怎样写这样的模式。替换命令的 "to" 部分是空的:"//"。这样就会删除那些匹配的空白字符。另一种没有用的空格是 Tab 前面的字符。通常这可以删除而不影响格式。但并不是总这样!所以,你最好手工删除它。执行如下命令:/你什么都看不见,其实这是一个空格加一个 TAB 键。相当于 "/<Space><Tab>"。现在,你可以用 "x" 删除多余的空格,并保证格式没有改变。接着你可以用 "n" 找到下一个位置并重复这个操作。

vim centos 安装

http://www.cnblogs.com/zeushuang/archive/2012/12/05/2803772.html

Centos的安装命令和ubuntu不一样,这点要注意。前期工作:首先下载gvim。下载下来后是一个类似vim-7.3.tar.bz2的压缩文件。

将此文件解压缩:tar -xvf /usr/src/vim-7.3.tar.bz2 。

1,在root下:yum install gcc-c++。

2,yum install vim-X11。

3,yum install ncurses-devel。

4,进入vim文件夹,./configure,make all ,make install,等等。

vim 中有用的命令

在命令行模式中 r !seq -s',' 1 2 10

会输入 1,3,5,7,9

二进制查看

%!xxd

%!xxd -r

加一和减一

https://vim.wikia.com/wiki/Increasing_or_decreasing_numbers

There are several ways to make a list of increasing numbers. One simple method is to use Ctrl-A in a macro. As an example, suppose you type the line:

101 This is an item.

In normal mode, enter the following to record a macro into the a register (type the characters shown, without pressing Enter). This macro yanks the current line, then pastes it below, then increments the number.

qaYpCtrl-Aq

Now type 15@a to perform the macro 15 times. You will see:

101 This is an item.102 This is an item.103 This is an item.104 This is an item.and so on

Later, you might insert a new item after #102. Now you need to renumber the following items (the new item will be 103, so the old 103 has to be incremented, as does 104, and so on. That can be done using :.,$g/^\d/exe "normal! \<C-a>" (see here).

PS:在window下加一和减一的快捷键有冲突

可以改为:

:nnoremap <S-a> <C-a>:nnoremap <S-x> <C-x>但是如果使用命令行还是要使用<C-a>加一。


各种终端登录,vim显示颜色

参考:http://blog.csdn.net/cs_ing/article/details/8423907在~/.bashrc中设置$TERMxterm-color

即在.bashrc中添加:

export TERM=xterm-color

然后返回终端执行: source .bashrc即可显示颜色。

 

原创粉丝点击