2009年3月15日星期日

VIM技巧2(高级篇)

1 ;:+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 ;:文档来源: http://www.rayninfo.co.uk/vimtips.html
3 ;:原作者 : David Rayner
4 ;:文档日期: 2006-10-13 11:19:04
5 ;:更新记录:
6 ;:作  者: li3
7 ;:生成工具: 2Html.vim
8 ;:http://blog.21ic.org/user1/313/archives/2006/30543.html
9 ;:+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
10
11 ;:--------------------------------------------------------------------------------
12 ;:如果你使用的是MS-Windows,可能有的键已经被定义为Windows中的一些默认功能键。如果不
13 ;:想这样,请编辑$VIM\mswin.vim
14 ;:--------------------------------------------------------------------------------
480 :'a,'by* ;: 复制一个范围到粘贴寄存器
481 :%y* ;: 复制一个括号匹配到粘贴缓冲区
482 :.y* ;: 复制当前行到粘贴缓冲区
483 ;:" 从剪贴板上过滤非可打印字符
484 ;:" 当从一些 GUI 程序粘贴时会有用处
485 :nmap p :let @* = substitute(@*,'[^[:print:]]','','g')"*p
486 ;:-----------------------------------------------------------------------------
487 ;:" 重新格式化文本
488 gq} ;: 合并一个段落
489 gqap ;: 当前段落
490 ggVGgq ;: 全部段落
491 Vgq ;: 当前行
492 :s/.\{,69\};\s*\|.\{,69\}\s\+/&\r/g ;:" 在70列的时候换行
493 ;:-----------------------------------------------------------------------------
494 ;:" 命令使用于多个文件
495 :argdo %s/foo/bar/e ;: 在所有文件上操做 :args
496 :bufdo %s/foo/bar/e
497 :windo %s/foo/bar/e
498 :argdo exe '%!sort'|w! ;: 包含外部命令
499 ;:-----------------------------------------------------------------------------
500 ;:" 命令行技巧
501 gvim -h ;: 显示帮助
502 ls | gvim - ;: 管道操作
503 cat xx | gvim - -c "v/^\d\d\|^[3-9]/d " ;: 从管道出过滤内容
504 gvim -o file1 file2 ;: 分割窗口显示两个文件
505 ;:" 打开文件后执行一条命令
506 gvim.exe -c "/main" joe.c ;: 打开 joe.c & 跳转到 "main"
507 ;:" 在打开一个文件时执行多条命令
508 vim -c "%s/ABC/DEF/ge | update" file1.c
509 ;:" 在一组文件上执行多条命令
510 vim -c "argdo %s/ABC/DEF/ge | update" *.c
511 ;:" 从一系列文件中删除一块区域
512 vim -c "argdo /begin/+1,/end/-1g/^/d| update" *.c
513 ;:" 自动编辑文件 (编辑命令序列Ex commands已经包含在convert.vim中了)
514 vim -s "convert.vim" file.c
515 ;:#不加载.vimrc跟任何plugin(干净清新的 VIM^_^)
516 gvim -u NONE -U NONE -N
517 ;:" Access paste buffer contents (put in a script/batch file)
518 gvim -c 'normal ggdG"*p' c:/aaa/xp
519 ;:" 将paste中的内容送往默认的打印机
520 gvim -c 's/^/\=@*/|hardcopy!|q!'
521 ;:" gvim 里的 grep (win32 or *nix)
522 :grep somestring *.php ;: 创建匹配的文件列表
523 ;:" 使用 :cn(向后后) :cp(向前) 操纵列表
524 :h grep :查看帮助
525 ;:-----------------------------------------------------------------------------
526 ;:" GVIM 的差异比较
527 gvim -d file1 file2 ;: vimdiff (比较不差异)
528 dp ;: 把光标处的不同放到另一个文件
529 do ;: 在光标处从另一个文件取得不同
530 ;:-----------------------------------------------------------------------------
531 ;:" Vim traps 在正则表达式中 + | ( { 都要加上转义符(反斜杠)
532 In regular expressions you must backslash + (match 1 or more)
533 In regular expressions you must backslash | (or)
534 In regular expressions you must backslash ( (group)
535 In regular expressions you must backslash { (count)
536 /fred\+/ ;: 匹配 fred/freddy 但不匹配 free
537 /\(fred\)\{2,3}/ ;: note what you have to break
538 ;:-----------------------------------------------------------------------------
539 ;:" \v ,或叫做very magic (通常都是这么叫)可以取消转义符
540 /codes\(\n\|\s\)*where ;: 普通的正则表达式
541 /\vcodes(\n|\s)*where ;: very magic
542 ;:-----------------------------------------------------------------------------
543 ;:" 把对象送到命令行或者搜索行
544 ;: 执行当前光标下的单个单词
545 ;: 执行当前光标下尽可能多的单词
546 - ;: 送至一个小型寄存器(同样使用于插入模式)
547 [0-9a-z] ;: 送至一个命名寄存器 (括弧同上)
548 % ;: 送至文件名(#也行) (同上)
549 =somevar ;: 送至一个变量 (例如 :let sray="ray[0-9]")
550 ;:-----------------------------------------------------------------------------
551 ;:" 控制寄存器
552 :let @a=@_ ;: 清除寄存器 a
553 :let @a="" ;: 同上 a
554 :let @*=@a ;: 拷贝寄存器 a 到 paste buffer
555 :let @*=@: ;: 拷贝最后执行的命令到 paste buffer
556 :let @*=@/ ;: 拷贝最后执行的查找命令到paste buffer
557 :let @*=@% ;: 拷贝当前文件到 paste buffer
558 ;:-----------------------------------------------------------------------------
559 ;:" 帮助的帮助? (使用 TAB)
560 :h quickref ;: VIM 快速参考页
561 :h tips ;: Vim'自己的技巧帮助
562 :h visual ;: 虚拟模式的帮助列表
563 : 然后使用tab选择它们
564 :h ctrl ;: 所有关于ctrl键的帮助列表
565 :helpg uganda ;: 过滤帮助文件 使用 :cn, :cp 查找下一个及后一个
566 :helpgrep edit.*director: grep help using regexp
567 :h :r ;: 关于 :ex 的命令帮助
568 :h CTRL-R ;: 普通模式相关
569 :h /\r ;: \r是什么的意思
570 :h \\zs ;: 使用双反斜线查找关于 \zs 的帮助
571 :h i_CTRL-R ;: 在插入模式中 的解释
572 :h c_CTRL-R ;: 在命令模式中 的解释
573 :h v_CTRL-V ;: 虚拟模式
574 :h tutor ;: VIM 快速指南
575 , ;: Move back & Forth in HELP History
576 gvim -h ;: VIM 命令行帮助
577 ;:-----------------------------------------------------------------------------
578 ;:" 选项设置在那里
579 :scriptnames ;: 列出所有已经加载的 plugins, _vimrcs文件
580 :verbose set history? :显示 history的值并显示在那里定义的
581 :function ;: 列出所有函数
582 :func SearchCompl ;: 显示指定函数的细节
583 ;:-----------------------------------------------------------------------------
584 ;:" 制作你自己的VIM 帮助
585 :helptags /vim/vim64/doc ;: 重新编译所有 *.txt 的帮助文件在这个目录里
586 :help add-local-help :如何添加本地帮助
587 ;:-----------------------------------------------------------------------------
588 ;:" 用外部程序运行文件 (例如 php)
589 map :w:!c:/php/php.exe %
590 map :w:!perl -c %
591 ;:-----------------------------------------------------------------------------
592 ;:" 在另一个buffer中,捕捉当前脚本的输出
593 :new | r!perl # ;: 新建一个buffer,从另一个buffer中读入结果
594 :new! x.out | r!perl # ;: 同上,并指定一个新文件名
595 :new+read!ls
596 ;:-----------------------------------------------------------------------------
597 ;:" 创建一个新的buffer, 粘贴q寄存器,然后对它进行排序
598 :new +put q|%!sort
599 ;:-----------------------------------------------------------------------------
600 ;:" 插入DOS换行符
601 :%s/$/\&/g ;: (that's what you type
602 :%s/$/\&/g ;: for Win32) 对于Win32应该这样
603 :%s/$/\^M&/g ;: 你看到的^M是一个字符
604 ;:-----------------------------------------------------------------------------
605 ;:" 自动删除行尾 Dos回车符和空格
606 autocmd BufRead * silent! %s/[\r \t]\+$//
607 autocmd BufEnter *.php :%s/[ \t\r]\+$//e
608 ;:-----------------------------------------------------------------------------
609 ;:" 对指定文件或文件类型执行某个动作
610 autocmd VimEnter c:/intranet/note011.txt normal! ggVGg?
611 autocmd FileType *.pl exec('set fileformats=unix')
612 ;:-----------------------------------------------------------------------------
613 ;:" 把最后一个命令贴到当前位置
614 i:
615 ;:" 把最后一个搜索指令贴到当前位置
616 i/
617 ;:-----------------------------------------------------------------------------
618 ;:" 更多的完成功能
619 ;:插入当前目录下的一个文件名到当前位置 # 在insert模式下使用 # 然后用 Ctrl-P/Ctrl-N 翻页
620 ;:-----------------------------------------------------------------------------
621 ;:" 替换一个visual区域
622 ;:" 选择一个区域,然后输入 :s/Emacs/Vim/ 等等,vim会自动进入:模式
623 :'<,'>s/Emacs/Vim/g ;: 前面的' '<.'> 是vim自动添加的
624 gv ;: 重新选择前一个可视区域 (ULTRA)
625 ;:-----------------------------------------------------------------------------
626 ;:" 在文件中插入行号
627 :g/^/exec "s/^/".strpart(line(".")."", 0, 4)
628 :%s/^/\=strpart(line(".")." ", 0, 5)
629 :%s/^/\=line('.'). ' '
630 ;:-----------------------------------------------------------------------------
631 ;:#用VIM的方式来编号行
632 :set number ;: 显示行号
633 :map :set number! ;: 开关行号显示
634 :%s/^/\=strpart(line('.')." ",0,&ts)
635 ;:#从任意行开始编号(需要perl)
636 :'a,'b!perl -pne 'BEGIN{$a=223} substr($_,2,0)=$a++'
637 ;:#产生数字列表
638 ;:#从223行开始的内容至一个空文件
639 qqmnYP`n^Aq ;: 用@q来重复一个宏q
640 ;:" 递增已存在数字到文件末
641 :.,$g/^\d/exe "normal! \"
642 ;:" 高级递增,参见:
643 http://vim.sourceforge.net/tip_view.php?tip_id=150
644 ;:-----------------------------------------------------------------------------
645 ;:" 高级递增 (真的很有用)
646 ;:" 把下面几句放到 _vimrc
647 let g:I=0
648 function! INC(increment)
649 let g:I =g:I + a:increment
650 return g:I
651 endfunction
652 ;:" 例如从mark a 到mark b 递增,从223开始,步长为5
653 :let I=223
654 :'a,'bs/^/\=INC(5)/
655 ;:" create a map for INC
656 cab viminc :let I=223 \| 'a,'bs/$/\=INC(5)/
657 ;:-----------------------------------------------------------------------------
658 ;:" 生成从 23-64 的数字列表
659 o23qqYpq40@q
660 ;:-----------------------------------------------------------------------------
661 ;:" 在当前插入模式下编辑/移动 (真得很有用)
662 ;: 删除全部
663 ;: 删除最后一个单词
664 ;: 移动到行首/行尾
665 ;: 向前/后移动一个单词
666 , ;: 输入方式时滚屏
667 ;:-----------------------------------------------------------------------------
668 #加密(小心使用,不要忘了密码)
669 :X ;: vim会提示你输入密码
670 :h :X
671 ;:-----------------------------------------------------------------------------
672 ;:" 模式行 (使文件只读等),必须在前/后 5行内
673 // vim:noai:ts=2:sw=4:readonly:
674 vim:ft=html: ;: 使用 HTML 语法高亮
675 :h modeline
676 ;:-----------------------------------------------------------------------------
677 ;:" 建立你自己的菜单项
678 amenu Modeline.Insert\ a\ VIM\ modeline ggOvim:ff=unix ts=4 ss=4vim60:fdm=markergg
679 ;:-----------------------------------------------------------------------------
680 ;:" 一个保存当前光标下的狭义字到一个文件的函数
681 function! SaveWord()
682 normal yiw
683 exe ':!echo '.@0.' >> word.txt'
684 endfunction
685 map ,p :call SaveWord()
686 ;:-----------------------------------------------------------------------------
687 ;:" 删除重复行的函数
688 function! Del()
689 if getline(".") == getline(line(".")- 1)
690 norm dd
691 endif
692 endfunction
693
694 :g/^/ call Del() ;:#使用该函数的一个例子
695 ;:-----------------------------------------------------------------------------
696 ;:" 双字节编码 (non alpha-numerics)
697 :digraphs ;: 显示编码表
698 :h dig ;: 帮助
699 ie' ;: 输入 é
700 i233 ;: 输入 é (Unix)
701 i233 ;: 输入 é (Win32)
702 ga ;: 查看字符的hex值
703 ;:#删除非 ascii 字符
704 :%s/[128-255]//gi ;: Control-V
705 :%s/[]//gi ;: 查看不可见字符
706 :%s/[128-25501-31]//gi ;: All pesky non-asciis
707 :exec "norm /[\x00-\x1f\x80-\xff]/" ;:: 同上
708 ;:#在查找框内输入不可见字符
709 yl/" :
710 /[^a-zA-Z0-9_[:space:][:punct:]] ;:: 找出所有不可见字符
711 ;:-----------------------------------------------------------------------------
712 ;:" 文件名自动完成 (例如 main_c.c)
713 :e main_ ;: tab 键完成
714 gf ;: 打开光标处广义字命名的文件 (normal模式)
715 main_ ;: 文件名自动完成(insert模式)
716 ;:-----------------------------------------------------------------------------
717 ;:" Vim复杂使用
718 ;:" 交换两个单词
719 :%s/\<\(on\|off\)\>/\=strpart("offon", 3 * ("off" == submatch(0)), 3)/g
720 ;:" 交换两个单词
721 :vnoremap `.``gvP``P
722 ;:-----------------------------------------------------------------------------
723 ;:" 把text文件转换成html文件(oh,ft)
724 :runtime! syntax/2html.vim ;: 转换 txt 成 html
725 :h 2html
726 ;:-----------------------------------------------------------------------------
727 ;:" VIM 有一个内部自带的 grep 命令
728 :grep some_keyword *.c ;: 得到一个包含some_keyword的c文件名列表
729 :cn ;: 去下一个出现的位置
730 ;:-----------------------------------------------------------------------------
731 ;:" 强制无扩展名的文件的语法着色方式
732 :set syntax=perl
733 ;:" 取消语法着色 (很有用)
734 :set syntax off
735 ;:" 改变色彩主题 (在~vim/vim??/colors中的任何文件)
736 :colorscheme blue
737 ;:" 通过使用模式行强迫使用 HTML 语法高亮
738 # vim:ft=html:
739 ;:" 强制自动语法加亮(非标准的文件扩展)
740 au BufRead,BufNewFile */Content.IE?/* setfiletype html
741 ;:-----------------------------------------------------------------------------
742 :set noma (non modifiable) ;: 防止修改
743 :set ro (Read Only) ;: 只读保护
744 ;:-----------------------------------------------------------------------------
745 ;:" 对话 (打开一堆文件)
746 gvim file1.c file2.c lib/lib.h lib/lib2.h ;: 在"对话"中加载这些文件
747 :mksession ;: 生成一个Session文件 (默认是Session.vim)
748 :q
749 gvim -S Session.vim ;: 重新加载所有文件
750 ;:-----------------------------------------------------------------------------
751 #标记(tags) (跳转到子程序/函数)
752 taglist.vim ;: 很流行的插件
753 :Tlist ;: 显示标记 (函数列表)
754 ;: 跳转到光标处的函数
755 ;:-----------------------------------------------------------------------------
756 ;:" columnise a csv file for display only as may crop wide columns
757 :let width = 20
758 :let fill=' ' | while strlen(fill) 《width | let fill=fill.fill | endwhile
759 :%s/\([^;]*\);\=/\=strpart(submatch(1).fill, 0, width)/ge
760 :%s/\s\+$//ge
761 ;:" Highlight a particular csv column (put in .vimrc)
762 function! CSVH(x)
763 execute 'match Keyword /^\([^,]*,\)\{'.a:x.'}\zs[^,]*/'
764 execute 'normal ^'.a:x.'f,'
765 endfunction
766 command! -nargs=1 Csv :call CSVH()
767 ;:" call with
768 :Csv 5 ;: highlight fifth column
769 ;:-----------------------------------------------------------------------------
770 ;:" 折叠:隐藏某些片断,使查看更容易
771 zf} ;: 使用动作命令折叠一个段落
772 v}zf ;: 使用可视模式折叠一个段落
773 zf'a ;: 折叠到一个标记上
774 zo ;: 打开折叠
775 zc ;: 重新关闭折叠
776 ;:-----------------------------------------------------------------------------
777 ;:" 显示"不可见字符"
778 :set list
779 :h listchars
780 ;:-----------------------------------------------------------------------------
781 ;:" 如何在不进入插入模式的情况下粘贴"普通模式的命令"
782 :norm qqy$jq
783 ;:-----------------------------------------------------------------------------
784 ;:" 处理文件名
785 :h filename-modifiers ;: 帮助
786 :w % ;: 写入当前文件
787 :w %:r.cfm ;: 改变文件扩展名为 .cfm
788 :!echo %:p ;: 显示完整路径和文件名
789 :!echo %:p:h ;: 只显示完整路径
790 :!echo %:t ;: 只显示文件名
791 :reg % ;: 显示文件名
792 % ;: 插入文件名 (插入模式)
793 :"%p ;: 插入文件名 (普通模式)
794 /% ;: 在文本中查找文件名
795 ;:-----------------------------------------------------------------------------
796 ;:" 删除,但不破坏 buffer 内容
797 :"_d ;: 你一直想要的东西
798 :"_dw ;: 例如:删除一个单词 (使用黑洞???)
799 ;:-----------------------------------------------------------------------------
800 ;:" 送完整的路径名到剪贴板,用于邮件附件等
801 nnoremap :let @*=expand("%:p") :unix
802 nnoremap :let @*=substitute(expand("%:p"), "/", "\\", "g") :win32
803 ;:-----------------------------------------------------------------------------
804 ;:" 不用离开 Vim 就能修改文件名的简单 shell 脚本
805 $ vim
806 :r! ls *.c
807 :%s/\(.*\).c/mv & \1.bla
808 :w !sh
809 :q!
810 ;:-----------------------------------------------------------------------------
811 ;:" 在一个文本里计算单词数
812 g
813 ;:-----------------------------------------------------------------------------
814 ;:" 你自己设置高亮显示的例子
815 :syn match DoubleSpace " "
816 :hi def DoubleSpace guibg=#e0e0e0
817 ;:-----------------------------------------------------------------------------
818 ;:" reproduce previous line word by word
819 imap ] @@@hhkyWjl?@@@P/@@@3s
820 nmap ] i@@@hhkyWjl?@@@P/@@@3s
821 ;:" 根据文件类型映射快捷键
822 :autocmd bufenter *.tex map :!latex %
823 :autocmd bufenter *.tex map :!xdvi -hush %<.dvi&
824 ;:-----------------------------------------------------------------------------
825 ;:" 读取 MS-Word 文档,需要 antiword
826 :autocmd BufReadPre *.doc set ro
827 :autocmd BufReadPre *.doc set hlsearch!
828 :autocmd BufReadPost *.doc %!antiword "%"
829 ;:-----------------------------------------------------------------------------
830 ;:" a folding method
831 vim: filetype=help foldmethod=markerfoldmarker=<<<,>>>
832 ;:A really big section closed with a tag <<<
833 ;:--- remember folds can be nested ---
834 Closing tag >>>
835 ;:-----------------------------------------------------------------------------
836 ;:" Just Another Vim Hacker JAVH
837 vim -c ":%s%s*%Cyrnfr)fcbafbe[Oenz(Zbbyranne%|:%s)[[()])-)Ig|norm Vg?"
838 ;:# 译释:呵呵,谁来解释一下吧!
839 ;:# 其实不过是在启动vim的时候执行了一个命令
840 ;:# 先写入了 Just Another Vim Hacker 的rot13编码
841 ;:# 然后再解码
842 ;:-----------------------------------------------------------------------------
843 ;:__END__
844