Tag Archive for 'vim'

备份下vimrc

网上那个史上最牛vimrc流传的比较广,天啊好长,我怕配置。后来慢慢熟悉了点,就发现没这么恐怖。vim嘛,理念就是找到你在输入文本时累人的操作,用简单快捷的操作代替之,没必要多找麻烦。

这个vimrc就比较简单了,只有一点基本的设置和键绑定。比较个人化,仅作备份

set nocompatible
source $VIMRUNTIME/vimrc_example.vim
source $VIMRUNTIME/mswin.vim
behave mswin

syntax on
"filetype plugin on

"about tab
set autoindent
set smartindent
set smarttab
set expandtab
set sw=4
set ts=4

" encoding . utf-8 rules!
let $LANG="zh_TW.UTF-8" " locales
set encoding=utf-8 " ability
set fileencoding=utf-8 " prefer
set fileencodings=ascii,utf-8,gbk,ucs-2,ucs-le,sjis,big5,latin1
set ambiwidth=double

set nu
set wildmenu
set ruler

" ^c^V i don't know how these about
set lbr
set fo+=mB
set sm
set cin
set cino=:0g0t0(sus
set guifont=Courier_New:h10:cANSI
set hls
set backspace=indent,eol,start
set noswapfile
set whichwrap=b,s,<,>,[,]
set bsdir=buffer
set smartcase

set nowrap
set autochdir
set autoread
set autowrite

set nobackup
set nowritebackup

color slate

" key bindings

noremap <C-[>   <C-T>

" tabs
noremap <C-Right> :tabn<CR>
inoremap <C-Right> <C-o>:tabn<CR>
noremap <C-left> :tabprevious<CR>
inoremap <C-LEFT> <C-o>:tabprevious<CR>

" windows
noremap <C-Up> <C-W>k<C-W>_
inoremap <C-Up> <C-o><C-W>k<C-W>_
noremap <C-Down> <C-W>j<C-W>_
inoremap <C-Down> <C-o><C-W>j<C-W>_

" v
noremap <UP> k
noremap <Down> j
noremap <LEFT> h
noremap <Right> l
noremap <ESC> v<ESC>

"
source $VIMRUNTIME/delmenu.vim
source $VIMRUNTIME/menu.vim

" toolbar sucks
set guioptions-=T

function! To_utf8()
    set enc=utf8
    set fenc=utf8
    set tenc=utf8
endfunction

试玩vimperator

以前貌似在豆瓣看到有人提起过这vim键操作firefox的插件,当时的第一反应就是蛋疼:有人用导线连了一台cpu,有人只用emacs上网,有人用《最后的晚餐》里的面包谱曲子,有人的妈妈找他回家吃饭…拉门,我确实都想到一块去了。

好吧,暑假在家无所事事,我又蛋疼了,装vimperator。简单熟悉一下后发现这东西还是很成熟的,除去猎奇者,拿它日常使用的也大有人在。装上之后ff的导航栏和书签栏都消失了,习惯chrome的同学们可能会找到一点熟悉的感觉,反正清爽多了。再就是一些快捷键绑定,ctrl+c ctrl+v等键全变了,唔,这不爽。还好,可以自定义.vimperatorrc修改键绑定。同vim一样,vimperator也内置了强大的帮助,即:help,该有的options里面貌似都有了。

进入vimperator的ff之后,执行命令:mkv将当前vimperator的配置保存到$HOME/.vimperatorrc里,然后就可以diy了。参考大牛的配置,修改了个简化版如下:

" 先把麻烦的东西拿掉
map A <nop>
map <c-q> <nop>
map <c-o> <nop>
map <c-i> <nop>
map <c-z> <nop>
map <c-p> <nop>
 
" show toolbar & scrollbar
set guioptions=Tr
 
" 前进后退
noremap q :back<cr>
noremap w :forward<cr>
 
" search
noremap <c-f> /
 
" close tab
noremap c :q<cr>
 
" F5
noremap <f5> :reload<cr>
 
" 解决全选、复制、粘帖、剪切和撤销与vimperator冲突的问题
noremap <c-V> <c-v>
noremap <c-Z> <c-z>
noremap <c-c> <c-v><c-c>
noremap <c-a> <c-v><c-a>
cnoremap <c-c> <c-v><c-c>
cnoremap <c-v> <c-v><c-v>
cnoremap <c-x> <c-v><c-x>
inoremap <c-a> <c-v><c-a>
inoremap <c-c> <c-v><c-c>
inoremap <c-v> <c-v><c-v>
inoremap <c-x> <c-v><c-x>
inoremap <c-z> <c-v><c-z>
inoremap <c-y> <c-v><c-y>
 
 
set titlestring=Mozilla Firefox
 
" 齐全的next和previous……
set nextpattern=\s*下一页|下一张|下一篇|下一????下页|后页\s*,^\bnext\b,\bnext\b,\bsuivant\b,^>$,^(>>|??????|??)$,^(>|??),(>|??)$,\bmore\b
set previouspattern=\s*上一页|上一张|上一篇|上一????上页|前页\s*,^\bprev|previous\b, \bprev|previous\b,\bprécédent\b,^<$,^(<<|??????|??)$,^(<|??),(<|??)$
 
" PassThrough gmail and greader
autocmd LocationChange .* js modes.passAllKeys = /.*(mail\.google\.com|www\.google\.com\/reader).*/.test(buffer.URL)
 
" Commands
" noimg可以减少流量,nojs用于调控一些不听话的网页
command noimg set! permissions.default.image=2
command ysimg set! permissions.default.image=1
command nojs set! javascript.enabled=false
command ysjs set! javascript.enabled=true

虽然痛恨配置,不过确实也是一劳永逸的东西。只要快捷键不要冲突,vimperator里设置的这些键还是很顺手的。看文档说貌似还可以用javascript扩展vimperator命令,想起来mozilla官方搞的那个Ubiquity,感觉两个东西貌似有点像!或许vimperator还要更强大些? :p

vim quick reference card

原地址:http://tnerual.eriogerg.free.fr/vim.html
翻译:ssword

这里的排版弄的挺难看的,大家如果觉得有用,就将就下吧。

Basic movement
基本移动

h l k j 左移、右移一个字符;上一行,下一行;
b w 左移、右移一个词元
ge e 左移、右移到一个词元末尾
{ } 前、后移动一个段落
( ) 前、后移动一个句子
0 ^ $ 句子的开头、首字符、最后一个字符
nG ngg 第n行的句首、句尾
n% 文件的n%处(n不可省略)
n| 当前行的第n列
% 匹配下一个括号,中括号,大括号,注释或#define
nH nL 当前窗口从顶数、从底数第n行
M 当前窗口的中间行

Insertion & replace→ insert mode
插入&替换 ->插入模式

i a 在光标前、后插入
I A 在当前行前、后插入
gI 在当前行的第一列插入
o O 在当前行的上、下插一新行
rc 把光标下的字符替换为c
grc 同rc相似,不过不影响布局
R 替换从光标往后的所有字符
gR 同R相似,不过不影响布局
cm 修改到移动命令m指向的位置
cc or S 修改当前行
C 修改到行尾
s 修改一个字符,并进入插入模式
~ 转换当前字符的大小写,并右移光标
g~m 转换字符大小写到移动命令m指向的位置
gum gUm 将移动命令m中间的字符转换为大写、小写
m 按照移动命令m,左移、右移缩进
n< < n>> 左移、右移n个缩进

Deletion
删除

x X 删除当前字符、前一个字符
dm 删除到移动命令m指向的位置
dd D 删除当前行
J gJ 将当前行与下一行合并
:rd↵ 删除区间内的文本
:rdx↵ 删除区间内的文本,并将其存入寄存器x

Insert mode
插入模式

^Vc ^Vn 逐字插入字符c、数值n
^A 在当前输入的文本前插入
^@ 同^A,并退出到命令模式
^Rx ^R^Rx 逐字)插入x寄存器的内容
^N ^P 在光标前、光标后自动完成
^W 删除光标前一个单词
^U 删除前面输入的文本
^D ^T 左移、右移一个缩进
^Kc1c2 or c1←c2 插入一个digraph
^Oc 进入临时命令模式执行c
^X^E ^X^Y 向上、向下滚动
回到命令模式

Copying
复制

“x 将下个用于删除、复制、粘贴的寄存器设置为x
:reg↵ 显示所有寄存器的内容
:reg x↵ 显示x寄存器的内容
ym 复制移动命令m之间的文本
yy or Y 复制当前行
p P 将寄存器中的文本粘贴到光标前、后
]p [p 同p P,并自动处理缩进
gp gP 同p P,并保留光标。

Advanced insertion
高级插入

g?m 对移动命令m中间的文本进行rot13加密
n^A n^X 对移动命令m中间的文本进行rot13加密
gqm 将移动命令m中间的多行文本格式化为同一宽度
:rce w↵ 将区间r中的内容以w为宽度居中
:rle i↵ 将区间r中的内容以i个缩进左对齐
:rri w↵ 将区间r中的内容以w为宽度右对齐
!mc↵ 以c命令过滤处理移动命令m中间的文本
n!!c↵ 以c命令过滤处理n行文本
:r!c↵ 以c命令处理区间r中间的文本

Visual mode
可视模式

v V ^V 开始、退出选取文本
o 将光标移动到选取文本的开始
gv 回到上一个选取的文本
aw as ap 选取一个单词、句子、段落
ab aB 选取一个()、{}块

Undoing, repeating & registers
撤销,重复和寄存器

u U 撤销上一个命令,返回上一个修改的行
. ^R 重复上一个修改,重复上一个撤销
n. 重复上一个修改n次
qc qC 记录、追加输入的字符到寄存器c
q 停止记录
@c 执行寄存器c的内容
@@ 重复执行上一个@命令
:@c↵ 把寄存器c作为Ex命令执行
:rg/p/c↵ 对区间r中匹配p的文本执行Ex命令c

Complex movement
高级移动

- + 上移,下移到行首
B W 按空格左移、右移一个词元
gE E 按空格左移、右移到一个词元的末尾
n 下移n-1行到行首
g0 gm 当前行首、行中央
g^ g$ 当前行的首字符、尾字符
gk gj 上移、下移
fc Fc 下一个、前一个字符c
tc Tc 下一个、前一个字符c的前面
; , 重复上一个fFtT操作,反方向
[[ ]] 上一个、下一个节开头
[] ][ 上一个、下一个节结尾
[( ]) 上一个、下一个未关闭的括号
[{ ]} 上一个、下一个未关闭的大括号
[m ]m 上一个、下一个java方法的开头
[# ]# 上一个、下一个未关闭的#if #else #endif
[* ]* 上一个、下一个/* */的开头和结尾

Search & substitution
搜索 &替换

/s↵ ?s↵ 向前、向后搜索s
/s/o↵ ?s?o↵ 按o个偏移向前、向后搜索s
n or /↵ 向前重复上一个搜索
N or ?↵ 向后重复上一个搜索
# * 向前、向后搜索当前词元
g# g* 同上,额外匹配不完整的词元
gd gD 当前符号的局部、全局定义
:rs/f/t/x↵ 将区间r中匹配f的文本替换为t
:rs x↵ 以新的区间和x重复替换

Special characters in search patterns
模式匹配中的特殊字符

. ^ $ 任一字符,行的首字符,尾字符
\< \> 单词的开头,结尾
[c1-c2] 在c1..c2之间的任一字符
[^c1-c2] 不在c1..c2之间的任一字符
\i \k \I \K 标志符,关键字;字母,数字
\f \p \F \P 文件名;可打印字符;字母;数字
\s \S 空格;非空字符
\e \t \r \b ←>键, , < ?>, < ←>
\= * \+ 匹配0个或一个、0个或多个、一个或多个模式
\| 两个选择
\( \) 将一组模式组合成一个
\& \n 匹配全部、匹配第n个括号中的内容 *
\u \l 匹配下一个大写、小写字母
\c \C 忽略、匹配下一个模式

Offsets in search commands
偏移

n or +n 下n行的第1列
-n 上n行的第1列
e+n e-n 匹配文本结尾右边、左边的第n个字符
s+n s-n 匹配文本右边开头右边、左边的第n个字符
;sc 向下执行搜索命令sc

Marks and motions
标记 &跳转

mc,c∈[a..Z] 把当前位置标记为c,c∈[a..Z]
`c `C 跳到当前文件、任意文件的c标记
`0..9 跳到上一个位置
“ `” 跳到上一个位置,上一次编辑的位置
`[ `] 跳到上一个修改段落的开头、结尾
:marks? 输出可用的标记列表
:jumps? 输出跳转列表
n^O 跳到跳转列表的前一个位置
n^I 跳到跳转列表的后一个位置

Key mapping & abbreviations
键映射 &缩写

:map c e↵ 在普通模式和可见模式中将c映射为e
:map! c e↵ 在插入模式和命令模式中将c映射为e
:unmap c↵ :unmap! c↵ 移除映射c
:mk f↵ 将当前的映射和设置写入到文件f
:ab c e↵ 把e设置为c的别名
:ab c↵ 显示c开头的所有别名
:una c↵ 移除别名c

Tags
标签

:ta t↵ 跳到t匹配的tag
:nta↵ 跳到列表中后面第n个tag
^] ^T 跳到光标指向的tag,从tag返回
:ts t↵ 列出匹配的tag供选择跳转
:tj t↵ 跳到标签t,如果有多个匹配则提示选择
:tags↵ 显示tag列表
:npo↵ :n^T↵ 向前返回、跳至第n个tag
:tl↵ 跳到最后一个匹配的tag
^W} :pt t↵ 当前光标指向的前一个tag、 t匹配的tag
^W] 分割窗口,显示当前光标指向的tag
^Wz or :pc↵ 关闭显示tag的窗口

Scrolling & multi-windowing
滚动 &多窗口

^E ^Y 向上、向下滚动一行
^D ^U 向上、向下滚动半页
^F ^B 向上、向下滚动一页
zt or z↵ 将当前行滚动到窗口顶部
zz or z. 将当前行滚动到窗口中央
zb or z- 将当前行滚动到窗口底部
zh zl 向右、向左滚动一个字符
zH zL 向右、向左移动半屏
^Ws or :split↵ 将窗口分割成两个
^Wn or :new↵ 创建一个新窗口
^Wo or :on↵ 关掉当前窗口以外的其他窗口
^Wj ^Wk 移动到下一个、上一个窗口
^Ww ^W^W 移动到下一个、上一个窗口 (wrap)*

Ex commands
Ex命令

:e f 编辑文件f,如果没有更改
:e! f 强制编辑文件(默认覆盖原先的修改)
:wn :wN 写入文件,并编辑下一个、前一个文件
:n :N 编辑文件列表中的下一个、前一个文件
:rw 把区间r写入到当前文件
:rw f 把区间r写入到文件f
:rw>>f 把如见r追加到文件f
:q :q! 退出并确认,强制退出忽略修改
:wq or :x or ZZ 写入到当前文件并退出
:r f 将光标下的内容插入文件f
:r! c 将光标下的内容经命令c处理的结果插入
:args 显示参数列表
:rc a :rm a 复制、移动区间r到a行下

Ex ranges
Ex区间

. $ 文件的当前行,最后一行
% * 整个文件、可视部分
‘t 标记t指向的位置
/p/ ?p? 匹配的下一个、前一个位置
+n -n 当前行的前n-1行、后n-1行

Folding
折叠

zfm 创建折叠到移动命令m指向的位置
:rfo 为区间r创建折叠
zd zE 移除当前折叠、当前窗口的所有折叠
zo zc zO zC 打开、关闭一个折叠;递归地执行
[z ]z 移动到当前打开折叠的开头、结尾
zj zk 向下、向上移动到下一个折叠的开头、结尾

Miscellaneous

:sh↵ :!c↵ 运行shell,执行shell命令c
K 在man中搜索当前关键字
:make↵ 执行make,读取错误并跳转到首个错误
:cn↵ :cp↵ 显示下一个、前一个错误
:cl↵ :cf↵ 显示所有错误、从文件中读取错误
^L ^G 重绘屏幕,显示文件名及位置
g^G 显示光标所在行、列及字符位置
ga 显示当前字符的ascii值
gf 打开当前光标下的文件名
:redir>f↵ 将输出重定向到文件f
:mkview ↵ 保存view配置[到文件f]
:loadview ↵ 装载view配置[从文件f]

ps:高数59分华丽地挂掉鸟~

gvim使用笔记

使用gvim也有一段时间了,还不敢说得心应手,不过倒也不会再碰editplus之类的编辑器了。它真的很好用,熟悉起来也真的需要很长时间。前辈们说的话里还是很多实话的。

使用gvim是个有趣的过程,按下一个i,鼠标 + 箭头 它就跟普通的编辑器没有两样,初学之时不至于像在vi中完全无从下手。诚然,在键盘上的手移动到鼠标处是相当累人的,按着箭头等着光标挪到那地方也很磨耐性!这就是gvim的好处,一个命令就可以将光标移动到你想要的地方。一般而言,学会了一个命令之后要再忘记就很难了,找到了近路,谁还会绕远呢?另外,个人觉得也不用总是纠结“这是vi!要按vi的法子来!”,我就觉得ctrl+s比esc+:w省力,ctrl+a比ggvG方便,反正用着舒服就好。

note几个命令:

o 在当前行下新建一行;
! 运行一个控制台的命令,例如 ! ruby % 解释执行当前文件,其中%代表当前的文件名;
) 移动光标到下一个自然段,在程序里可以跳到下个函数;
x 删除当前字符;
r 替换当前字符;
= 自动缩进当前行;
gg=G 自动缩进整个文本;
=a{ 自动缩进{}内的文本;
va” 选择”"内的文本;
. 重复上一条命令;

如果光标目前在一个字符串的第一个引号上,”blah blah blah”,要删除引号中的内容,就d/”+enter,对删除括号中的内容同理;(update:感谢reus同学, 使用di”命令更简单 ^^ )(update:貌似da”也可以 ^_^)

另外发现vi的很多命令都是有参数的:
>3> 可以让光标下的三行右移一个缩进;
tabn 2 可以切换到第二个tab;
17gg 跳到第17行;
12| 跳到当前行的第12个字符;
8l 右移8个字符,结合gg可以快速定位错误的位置;

update: 感谢ginkgo同学,有时vim在处理中文标点时会发生错位,解决方法就是在~/.vimrc里加上set ambiwidth=double

update: 刚从editplus,notepad++过来的同学有一点可能不大能接受的是,vim不会自动记住配置,重启一下vim又完全复原。而配置.vimrc对新人的门槛又太高。其实有个命令:mkv!,即可自动保存当前的所有配置到.vimrc。不过使用前最好备份一下原先的.vimrc。

Ps:动物园出版社貌似有本《学习vi编辑器》,眼镜猴的封面,感觉不是很全,不过作为入门还是不错的。