Vim 学习笔记
http://einverne.github.io/post/2015/05/vim-notes.html#advanced-move
http://einverne.github.io/post/2015/05/vim-advanced-notes.html
Posted on May 06, 2015 , Last modified on September 10, 2015 by Ein Verne | View revision history
If you don’t have time to watch this video, just take a look at this note. This note is taken from https://github.com/shawncplus/vim-classes with small modification.
https://github.com/shawncplus/dotfiles
this site let you make your own colorscheme
模式切换 Change between modes
Insert -> Normal : ESC/Ctrl-[Insert -> Command : (Insert -> Normal) -> :Normal -> Command : :Normal -> Insert : iIsScCoOCommand -> Normal : Enter
插入模式
i Enter insert modeI 行首非空字符前插入s 删除光标下字符,并进入insert modeS 删除光标所在一行,并进入insert mode行首a 光标之后进入insert modeA 光标移动到行尾并进入insert modeo 在光标下一行插入一行,并进入insert modeO 在光标上一行插入新行,并进入insert modeC 删除光标后到行尾并进入insert mode
replace mode
按如下两个按键进入替换模式:
r replace the letter under cursorR replace under cursor till you press Esc
advanced Move
在Vim中,Word有两种含义,开始我也没搞明白,过了很久才渐渐明白。广义的 WORD 可以是任何两个空格之间的内容,比如 this is a word
,就是四个“字”。侠义的 WORD ,英文单词、标点符号和非字母字符都被当成一个字。如$、%、^、&、*、(、)、-、+、{、}、[、]、~、|、\、<、>、/
等,均被当成是一个字。
Vim中使用大写命令一般将字作为广义,小写命令就是作为侠义对待。命令都是成对出现,w 和 W,b 和 B,e 和 E:
w 词向后移动W WORD is splited by spaceb 词向前移动B WORD向前移动e 移下一个单词词末ge 前一个单词词末E 如果光标起始位置处于字内(即非字尾处),则该命令将把光标移到本字字尾;如果光标起始位置处于字尾,则该命令将把光标移动到下一个字的字尾。0 Move to the zeroth character of the line^ move to first non-blank character of the line$ go to the end of lineg_ last character of the line
用了很多天Vim了移动最多用的还是hjkl,想不起来用这些零碎的命令啊~
以下命令可以用来翻页
Ctrl+f 下一页Ctrl+b 上一页Ctrl+d 下半页Ctrl+u 上半页H Move to first letter on top of screenM Move to first letter on middle of screenL Move to first letter on bottom of screen
move inline
fx 向前查找本行中的字符x, 比如想要移动到下一个双引号时,可以使用 f"
来实现行内快速移动F 向左查找
Copy/Paste
p paste after current positionP paste before the cursoryy copy the current liney - Yank. Example: yw (yank word) 光标停留到词第一个字母上 yw 复制单词y0 copy the data from cursor to begining of the liney$ copy the data from cursor to end of the line
删除 delete
x 删除光标下单个字符X 向前删除一个字符,相当于 Backspacedd 删除光标所在一行,并把该行复制dw 删除光标所在词d0 删除光标到该行最前d$ 删除光标到该行最后J 删除光标所在行的换行符
删除x ,dd ,dw用的情况还挺多的。
撤销/重做 redo
u 撤销上一次编辑 undo<C-r> Ctrl-R redo
搜索与替换 search replace
/pattern - 正向搜索,从光标处开始向文件末搜索?pattern - 反向搜索,从光标处开始向文件首搜索n - 下一个,往下执行搜索命令N - 上一个* - Word under cursor - forward (bounded)g* - Word under cursor - forward (unbounded)# - Word under cursor - backward (bounded)g# - Word under cursor - backward (unbounded):s/p1/p2/g -将当前行中所有p1均用p2替代:n1, n2s/p1/p2/g -将第n1至n2行中所有p1均用p2替代:g/p1/s//p2/g -将文件中所有p1均用p2替换
Load/Save/Quit/Change File
:e <path/to/file> open file:w save:saveas <path/to/file> save to <path/to/file>:x, ZZ or :wq save and quit (:x only save if necessary):q! quit without saving. :qa! to quit even if there are modified hidden buffers:q! 放弃修改之后可用 :e! 恢复修改 :e! 为放弃为保存的修改
Other
gg 文件开头G 文件末尾Ctrl-]Ctrl-O 跳转到上一个位置Ctrl-T 标签退栈
参考:
http://yannesposito.com/Scratch/en/blog/Learn-Vim-Progressively/
http://fujun.sinaapp.com/category/vim
http://jinruhe.com/blog/archives/420
vim学习笔记进阶版,初级版可以参考这篇文章
combine command
. (dot) will repeat the last commandn<commmand> will repeat the command n times
for example:
2dd will delete 2 lines3p will paste the text 3 times40idesu [ESC] will write "desu " 40 times
move in one file
NG go to line N, N is a number, like 23G means go to line 23gg shortcut for 1G - go to the start of the fileG Go to last line
批量替换
在全文中用一个单词替换另外一个单词
:%s/想要被替换的字串/新字串/g g模式全局替换
”%” 范围前缀表示在所有行中执行替换, 相当于:1,$s/
,如果不加 %
则表示在当前行中
“g” 标记表示替换行中所有匹配点。
替换的语法为::[addr]s/源字符/目的字符/[option]
[addr] 表示检索范围, 省略表示当前行。
:n1,n2s/word1/word2/g 从 n1 行到 n2 行,替换 word1 为 word2 全局替换
:%s/ = :1,$s/
:.,$/word1/word2/g 从当前行到尾行
s: 表示替换操作
[option]表示操作类型
g 全局替换
c 确认,如果加上 c 选项,每次都需要确认 confirm
p 逐行显示结果
省略 option 时只对每一行的第一个匹配串进行替换
删除所有空行
:g/^$/d
删除所有空白行和空行
:g/^[ ][ ]*$/d
在每行开始插入两个空白
:%s/^/ /
在接下来5行末尾加入"
:.,5/$/"/
多窗口操作
新建与关闭窗口
在 Normal 模式下使用以下命令新建窗口
:split 水平分割窗口,内容一样:10split 水平分割窗口,新窗口高度10行:split filename 窗口中打开新文件:new 功能和split一样:sp split 缩写Ctrl-w s,v 分割窗口的快捷方式,s水平分割,v垂直分割:vsplit 垂直分割窗口,简写 :vsCtrl-w c 关闭当前窗口
窗口间移动
Ctrl-w h,j,k,l Ctrl按下,按下w 松开,Ctrl松开,按hjkl 对应左下上右
移动窗口
Ctrl-w H,J,K,L 大写HJKL,移动窗口
调整窗口大小
Ctrl-w < > 调整窗口宽度,<缩小当前窗口宽度,向左扩展一列,>增加当前窗口宽度,向右扩展一列。当然 Ctrl-w 之后可以使用 n+< 调整多列宽度 Ctrl-w - + 调整窗口高度
Tabs
Tab is different from the windows in vim. If your fimiliar with Firefox or Chrome, you can understand that a new tab contains a new website. While in vim, a tab can contain several windows and you can move the windows between tabs.
Create New tab
There are lots of ways to create a new tab, here I only intruduce some common commands.
:tabnew create a empty new tab:tabedit {file} edit specified file in new tab
Manage tabs
Some ways to close tabs:
:tabclose close current tab:tabclose {i} close i-th tab:tabonly close all other tabs
Some ways to move tabs:
:tabm 0 move current tab to first:tabm move current tab to last:tabm {i} move current tab to position i+1:tabs list all tabs including their opening windows
Ways to move between tabs:
:tabn go to next tab:tabp go to previous tab:tabfirst go to first tab:tablast go to last tab
While in normal mode, you can type:
gt go to next tabgT go to previous tab{i}gt go to tab in position i
更正
Insert模式下
<BS> 退格键,删除光标前<Del> Delete键,删除光标后<C-W> 删除一个单词<C-U> 删除光标前的字符,保留光标之后的文本,保留行首的缩进,只删除第一个非空字符至光标位置之间的文本。
可视Visual mode
v 按字符选择,在Normal mode下按下v进入Visual modeV 按行选择Ctrl+Q 块选择,Windows下,其他平台下Ctrl+V
选择字符之后操作
d 剪切选择内容到剪贴板y 拷贝选择内容到剪贴板c 剪贴选择内容到剪贴板并进入Insert mode
命令模式
:! command 暂时离开 vi 到命令模式下执行 command
Other
:verbose set tabstop? in Vim, it will tell you where the tapstop option value is coming from:help + command 查看Vim命令的帮助,比如想要查看 c 命令的帮助直接使用 :h c
就能查到。g <C-g> 单词统计
差不多看到这里就能够直接看文档了:http://vimcdoc.sourceforge.net/ 通过文档学习更多符合自己使用习惯的命令或者操作。
reference
http://vim.wikia.com/wiki/Search_and_replace