Vim Tips

image

Mac自带的Vim怎么升级

https://www.zhihu.com/question/34113076

安装MacVim
打开终端,输入alias vim='/Applications/MacVim.app/Contents/MacOS/Vim'
大功告成,输入vim --version会发现版本已更新

VIM打开关闭文件

vim 快捷键技巧总结

vi +n filename :打开文件,并将光标置于第n行首
vi + filename :打开文件,并将光标置于最后一行首
vi +/pattern filename:打开文件,并将光标置于第一个与pattern匹配的串处
vi -r filename :在上次正用vi编辑时发生系统崩溃,恢复filename
vi -o/O filename1 filename2 ... :打开多个文件,依次进行编辑
:w vpser.net //保存至vpser.net文件

VIM插入

轻快的VIM(二):插入

i            在光标之前插入
a            在光标之后追加
r              replace
A            在一行的结尾处追加
I            在一行的开头处插入
o            在光标所在位置的下一行打开新行插入
O            在光标所在位置的上一行打开新行插入
10I*<Esc>先输入10,然后输入i,接着输入*号,最后按\<Esc>,这样就可以在一行开头输入十个*
5o###<Esc>先输入5,然后输入o,接着输入###,最后按\<Esc> 这样就可以在下列5行中每一行开头插入###
cw,dw------ 改变(置换)/删除光标所在处的单词的命令 (c=change,d=delete
J            合并两行

复制和粘贴

yy    //将当前行复制到缓存区,也可以用 "ayy 复制,"a 为缓冲区,a也可以替换为a到z的任意字母,可以完成多个复制任务。
nyy   //将当前行向下n行复制到缓冲区,也可以用 "anyy 复制,"a 为缓冲区,a也可以替换为a到z的任意字母,可以完成多个复制任务。
yw    //复制从光标开始到词尾的字符。
nyw   //复制从光标开始的n个单词。
y^      //复制从光标到行首的内容。  
y$      //复制从光标到行尾的内容。
p        //粘贴剪切板里的内容在光标后,如果使用了前面的自定义缓冲区,建议使用"ap 进行粘贴。
P        //粘贴剪切板里的内容在光标前,如果使用了前面的自定义缓冲区,建议使用"aP 进行粘贴。

文本替换

:s/old/new      //用new替换行中首次出现的old

:s/old/new/g         //用new替换行中所有的old

:n,m s/old/new/g     //用new替换从n到m行里所有的old

:%s/old/new/g      //用new替换当前文件里所有的old

简单替换表达式
:%s/four/4/g

“%” 范围前缀表示在所有行中执行替换,最后的 “g” 标记表示替换行中的所有匹配点,如果仅仅对当前行进行操作,那么只要去掉%即可

如果你有一个像 “thirtyfour” 这样的单词,上面的命令会出错。这种情况下,这个单词会被替换成”thirty4″。要解决这个问题,用 “<”来指定匹配单词开头: :%s/<four/4/g

显然,这样在处理 “fourty” 的时候还是会出错。用 “>” 来解决这个问题: :%s//4/g

如果你在编码,你可能只想替换注释中的 “four”,而保留代码中的。由于这很难指定,可以在替换命令中加一个 “c” 标记,这样,Vim 会在每次替换前提示你: :%s//4/gc

单词精确匹配替换 sed -e "s/\/new/g" file

vim删除

轻快的VIM(三):删除

vim删除文本的命令

字符删除

x 删除光标所在处字符 X 删除光标所在前字符

单词删除

dw 删除到下一个单词开头

diw 删除光标上的单词 (不包括空白字符)

daw 删除光标上的单词 (包括空白字符)

di标记符 删除标记符内的内容 di[ 就是删除[之间的内容]

da标记符 删除标记符在内的内容 da[ 就是删除[]在内的内容

de 删除到本单词末尾

dE 删除到本单词末尾包括标点在内

db 删除到前一个单词

dB 删除到前一个单词包括标点在内

dt标记符 dt",删除所有的内容,直到遇到双引号

行删除

dd 删除一整行

D d$ 删除光标位置到本行结尾

d0 删除光标位置到本行开头

dG 删除到文件末

dgg 删除到文件首

[]

vim删除光标所在行上面几行

d3k 向上删除3行,包括当前行总共4行。那个3可以换成任意数字。你也可以搭配j来向下删除一些行。 如果你不想包括当前行,你把光标移动到上一行再执行d2k。 d后面可以跟任何的移动命令。 比如 G 跳到最后一行 10G 跳到第10行 gg 跳到第一行

d/main 从当前行向下删除到匹配main的行。 d?main 从当前行向上删除到匹配main的行。 d10G 从当前行删除到第10行。 dgg 从当前行删除到第一行。

VI中的多行删除与复制

VI中的多行删除与复制 法一:

单行删除,:1(待删除行)d

多行删除 ,:1,10d

法二:

光标所在行,dd

光标所在行以下的N行,Ndd

方法1:

光标放到第6行,

输入:2yy

光标放到第9行,

输入:p

此方法适合复制少量行文本的情况,复制第6行(包括)下面的2行数据,放到第9行下面。

方法2:

命令行模式下输入

6,9 co 12

复制第6行到第9行之间的内容到第12行后面。

方法3:

有时候不想费劲看多少行或复制大量行时,可以使用标签来替代

光标移到起始行,输入ma

光标移到结束行,输入mb

光标移到粘贴行,输入mc

然后 :'a,'b co 'c 把 co 改成 m 就成剪切了

要删除多行的话,可以用 :5, 9 de

vim处理字符的大小写转换

~          将光标下的字母改变大小写
3~         将光标位置开始的3个字母改变其大小写
g~~        改变当前行字母的大小写
U          将可视模式下选择的字母全改成大写字母
u          将可视模式下选择的字母全改成小写
gUU        将当前行的字母改成大写
guu        将当前行的字母全改成小写
3gUU      将从光标开始到下面3行字母改成大写
gUw       将光标下的单词改成大写。
guw       将光标下的单词改成小写。
 vim中大小写转化的命令是
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    :从光标所在位置到文章第一个字符,都变为大写

缩写

一个很可能是最令人印象深刻的窍门是你可以在 Vim 中定义缩写,它可以实时地把你输入的东西替换为另外的东西。语法格式如下:

:ab [缩写] [要替换的文字]

一个通用的例子是:

:ab asap as soon as possible

会把你输入的 “asap” 替换为 “as soon as possible”。

自动补齐CTRL+N/CTRL+P

单词自动补全:

CTRL+n :当你输入第一个字母的时候,再CTRL+n,自动出现下拉菜单,单词默认选中第一个,继续    CTRL+n,CTRL+p可以上下切换,或者用方向键(太慢)
CTRL+p :同上,只是默认的选中的是列表中最后一个单词

行自动补全:

CTRL+x CTRL+l (l指小写的L ):两个命令组合使用。在插入模式下输入已经存在行的第一个单词,再按这两个键,就会列出该整行出来

文件名自动补全: CTRL+x CTRL+f :插入模式下,按这两个组合键,可以插入当前目录下的文件名。处用在哪里呢,当然是有时候我们要指定默认执行文件的路径,这样就方便啦。

行方式命令

:n1,n2 co n3:将n1行到n2行之间的内容拷贝到第n3行下

:n1,n2 m n3:将n1行到n2行之间的内容移至到第n3行下

:n1,n2 d :将n1行到n2行之间的内容删除

:w :保存当前文件

:e filename:打开文件filename进行编辑

:x:保存当前文件并退出

:q:退出vi

:q!:不保存文件并退出vi

:!command:执行shell命令command

:n1,n2 w!command:将文件中n1行至n2行的内容作为command的输入并执行之,若不指定n1,n2,则表示将整个文件内容作为command的输入

:r!command:将命令command的输出结果放到当前行

技巧

vim快速算出应该删除多少行有技巧没

为什么不用 v ?根据你的需求用可视模式明显很方便,不需要任何计算,你只要知道需要删除到什么位置就可以了。从你给出的操作中也没看到不用可视模式的理由。1. <S-v> "进入行可视模式 2. {motion} "移动到需要删除的最后一行 3. d "删除选中的行

用Shift + v ,而不是v ?在普通模式下按Shift + v进去可视模式,选中的是行,v 选中的是你左右上下移动选中的块。Shift + v后j k 上下移动选中,不管复制 剪切 删除都能随心所欲,哪用看行号计算等这么蠢的方法

vim中执行shell命令小结

  • !command

    不退出vim,并执行shell命令command,将命令输出显示在vim的命令区域,不会改变当前编辑的文件的内容

    例如:!ls -l

    特别的可以运行:!bash来启动一个bash shell并执行命令,不需要退出vim

  • r !command

   将shell命令command的结果插入到当前行的下一行

  例如:r !date,读取系统时间并插入到当前行的下一行。   

  • 起始行号,结束行号 !command

  将起始行号和结束行号指定的范围中的内容输入到shell命令command处理,并将处理结果替换起始行号和结束行号指定的范围中的内容

  例如:62,72 !sort,将62行到72行的内容进行排序   可以只指定起始行,例如:62 !tr [a-z] [A-Z],将62行的小写字母转为大写字母   当前光标所在行,除可以指定行号外,也可以用.表示,例如:. !tr [a-z] [A-Z],将当前行的小写转为大写

  • 起始行号,结束行号 w !command

  将起始行号和结束行号所指定的范围的内容作为命令command的输入。不会改变当前编辑的文件的内容   例如:62,72 w !sort,将62行到72行的内容进行排序,但排序的结果并不会直接输出到当前编辑的文件中,而是显示在vim敲命令的区域

特殊的可以下面这么用:62 w !bash,将会把第62行的内容作为bash命令来执行并显示结果,而且不会改变当前编辑的文件的内容

同样的:. w !bash,将当前行的内容作为bash命令来执行

 例如52行内容为ls -l 那么输入:52 w !bash就跟执行!ls -l是一样的效果,如果你用的shell是bash shell 如果输入的是:52 !bash,那么会把第52行的内容也就是ls -l作为命令执行,同时命令的输出结果会替换第52行的内容,注意其中的区别。

  • 开启shell命令 :shell,退出该shell exit

设置vim自动显示和关闭行号

http://www.blogbus.com/laymantech-logs/77125946.html

set nu 或者 set number //显示行号;
set nonu 或者 set nonumber //关闭自动显示行号;
set ic //查找时忽略大小写;
set noic //查找时不忽略大小写。

在你忘记用 root 方式打开文件时的文件保存

这可能是一个在论坛中一直受欢迎的命令。每当你打开一个你没有写入权限的文件(比如系统配置文件)并做了一些修改,Vim 无法通过普通的 “:w” 命令来保存。

你不需要重新以 root 方式打开文件再进行修改,只需要运行:

:w !sudo tee %

这会直接以 root 方式保存。

vim的复制当前单词

在普通模式下,可使用 yaw 命令复制当前光标所在单词

advanced commands in Vim: t,f,m,e,J

http://blog.sina.com.cn/s/blog_605f5b4f0101f0xz.html

删除一个分行符:J
  在 Vim 中你可以把两行连起来,这意味着两行间的换行符被删除了。
以下面两行为例子:
    A young intelligent 
    turtle
把光标移到第一行,然后按 "J":
    A young intelligent turtle

    D       从当前位置删除到行尾("d$"的缩写)    

    移动到一个指定的字符: f/F/t/T
    单字符查找命令是最有用的移动命令之一。"fx" 命令向前查找本行中的字符 x。
    "F" 命令用于向左查找:
    "tx" 命令与 "fx" 相似,但它只把光标移动到目标字符的前一个字符上。提示:"t" 表示 "To"。这个命令的反向版本是 "Tx"。

    这四个命令可以通过 ";" 命令重复,"," 命令则用于反向重复。无论用哪个命令,光标永远都不会移出当前行'
    t(to)的另一个用法是复制行到其他地方:
    :t . 复制当前行并粘贴到当前行的下一行
    :t 7 复制当前行并粘贴到第7行的下一行
    :,+t0 复制当前行和当前行的下一行,并粘贴到文件的起始位置(,+是 . , . +1的缩写)
    :1,t$ 复制从文件第一行到当前行的内容并粘贴到文件末尾(1, 是 1, .的缩写)
    和t相关的命令是m(move)
    4m10: 把第4行的内容剪切并粘贴在第10行的下一行
    %:括号匹配 和 带数字前缀的移动定位
    当光标不在一个有用的字符上,"%" 会先向前找到一个。比如当光标停留在上例中的行首时,"%" 会向前查找到第一个 "("。然后会移动到它的匹配处。

Vim编辑器-批量注释与反注释

http://blog.csdn.net/xiajun07061225/article/details/8488210

插入注释:

  1. 用v进入virtual模式
  2. 用上下键选中需要注释的行数
  3. 按Control+v(win下面ctrl+q)进入列模式
  4. 按大些“I”进入插入模式,输入注释符“#”或者是"//",然后立刻按下ESC(两下)

Vim快速选中、删除、复制引号或括号中的内容

Vim快速选中、删除、复制引号或括号中的内容

ci'、ci"、ci(、ci[、ci{、ci< - 分别更改这些配对标点符号中的文本内容
di'、di"、di(或dib、di[、di{或diB、di< - 分别删除这些配对标点符号中的文本内容
yi'、yi"、yi(、yi[、yi{、yi< - 分别复制这些配对标点符号中的文本内容
vi'、vi"、vi(、vi[、vi{、vi< - 分别选中这些配对标点符号中的文本内容
另外如果把上面的i改成a可以连配对标点一起操作。

a会选择一个对象(an object)包括空格在内,而i只会选择一个对象的内部(an inner object)不包含空格

vim下如何删除指定的行区间的内容

比如我现在的光标位置在17行,我希望删除17行-22行之间的内容
:17,22d 然后回车     

如何在vim保存时获得sudo权限

:w !sudo tee % 
命令:w !{cmd},让 vim 执行一个外部命令{cmd},然后把当前缓冲区的内容从 stdin 传入。
tee 是一个把 stdin 保存到文件的小工具。
而 %,是vim当中一个只读寄存器的名字,总保存着当前编辑文件的文件路径。
所以执行这个命令,就相当于从vim外部修改了当前编辑的文件,好完工。

自动加载文件

在.vimrc文件中增加以下配置项,另外需要移动光标才能更新编辑器的内容

      set autoread
    au CursorHold * checktime
       set updatetime=1000

切换模式

C-o (在insert模式使用) 就是在insert模式中临时进入normal模式, 在insert模式,可以试试:C-o gg C-o dd C-o y ​​​​

键盘映射

inoremap jk <esc>

参考

如何在vim保存时获得sudo权限

How does the vim “write with sudo” trick work?

vi编辑器常用的命令及快捷键

Vim 快捷键整理

vi/vim 命令手册(高级篇)

简明Vim练级攻略

vim 快捷键技巧总结