vim

关于vim中字符编码知识(encoding   termencoding   fileencoding   fileencodings),请参考:

http://edyfox.codecarver.org/html/vim_fileencodings_detection.html

http://blog.csdn.net/flyqwang/article/details/7107026

 

如需编辑 fileencodings 之外(其不能自动识别)的文件,则可以使用以下命令
:e ++enc=编码 文件名

查看文件编码
:set fenc?

显示光标下的字符在当前使用的 encoding 下的内码
ga

 

文件类型

vim发布版中已经包含了针对不同文件类型的相应plugin,可以使用下面的命令开启对它的应用:
:filetype plugin on

查看文件类型
:set filetype
如果结果是"filetype="问题很可能就是vim不知到文件类型,此时可以手工制定该文件的文件类型:
:set filetype=fortan
要知道一共有哪些被支持的文件类型,可以查看目录$VIMRUNTIME/syntax目录下的文件;
此外,可以通过|modeling|设置文件类型,这样文件每次被编辑时都会被语法高亮,比如,下面的这行语句可以放入Makefile文件中(把它放在文件结尾的地方):
# vim: syntax=make
具体内容可以查看|new-filetype|了解vim是如何确定一个文件类型的。

 

设置选项缩写

set shiftwidth=4
set sw=4
有什么区别?执行下命令即可知道
:help option-list

<CR>是什么?执行命令:
:help option

set有种方式?执行命令:
:help options

 

set选项值

:set 或 :se     会显示所有已被修改的选项,即和预设值不一样的选项
:set all           显示所有选项的设置值
:scriptnames  显示各种设定文档所在路径及其文件名
:set options? 显示option这个设定的当前值
:option           直接线上设定,有些设定需要加=后接设定值
:set nooption 取消该设定,:set后面可以接多重设定,例如:
                      :set autoindent noconfirm autowrite 这样三种设定就会同时被重设

万一把一个选项值改到自己难以收拾残局的地步,可以在该选项的后面放一个&符号使它恢复其默认值,如:
:set iskeyword&

 

命令的记录与回放,分为三个步骤:

1、使用" q[a-z] "命令开始,后续的动作将被记录进名为[a-z]的寄存器中;
2、执行你要执行的操作;
3、按下" q "以结束对命令的记录;
最后,通过" @[a-z] "命令来执行刚刚记录下来的记录宏。                                                     

 

会话&视图

会话
:mksession path_dir/session_name.vim
:source path_dir/session_name.vim
或者
vim -S path_dir/session_name.vim

视图                 
:mkview path_dir/view_name.vim
:source path_dir/view_name.vim

 

二进制文件

方法一:
vim -b filename
二进制文件中很多字符都是不可打印字符。设置下面的选项额可以以十六进制格式显示这些字符:
:set display=uhex

方法二:
vim -b filename
:%!xxd
do change
%!xxd -r

 

大小写搜索

\cword 大小写不敏感的单词word
\Cword 大小写敏感,只搜word

 

查看自己安装的VIM的编译选项和配置文件位置

:version

 

关于配置文件.vimrc,可以使用下命令查看

:help .vimrc

 

把vim中显示的彩色文件转换为相应的html文件,在打开的vim文件中键入:

:source $VIMRUNTIME/syntax/2html.vim

 

窗口宽度/高度改变

增加窗口高度
CTRL-W +
减小窗口高度
CTRL-W -
设置窗口为固定的高度
{height}CTRL
-W _
使窗口达到它可能的最大高度
CTRL
-W _
增加窗口宽度
CTRL
-W >
减小窗口宽度
CTRL
-W < 使窗口达到它可能的最大宽度 CTRL-W |

vim中的页标签使用
:tab newfilename
使用gt进行页切换

 

"-o"选项可以让vim为每一个文件打开一个窗口
vim -o one.txt two.txt three.txt
如果已经进入了vim, ":all"命令会为命令行上指定的所有文件各开一个窗口。":vertical all"则让打开的窗口都是垂直分隔。

 

help页面占据整个屏幕
:tab help cmdnamd

 

 

vim中使用man

在vim中使用man
方法一:
在关键字上键入K                                                                 
                                                                                
方法二:
键入:
:source $VIMRUNTIME/ftplugin/man.vim
然后:
:Man bash
或
:Man 3 echo
或者在关键字上键入
\K                                                                              

 

去掉所有“ // ”注释:

:%s!\s*//.*!!
这儿分隔符改用了“!”,原因是在模式或字符串部分使用了“/”字符,不换用其他分隔符的话就得在每次使用“/”字符本身时写成“\/”,上面的命令得写成“:%s/\s*\/\/.*//”,可读性较低。

 

去掉所有 “ /* */ “注释

:%s!\s*/\*\_.\{-}\*/\s*! !g
“\_.”匹配包含换行在内的所有字符;“\{-}”表示前一个字符可出现零次或多次,但在整个正则表达式可以匹配成功的前提下,匹配的字符数越少越好;标志“g”表示一行里可以匹配和替换多次。替换的结果是个空格的目的是保证像“int/* space not necessary around comments */main()”这样的表达式在替换之后仍然是合法的。

 

自动匹配和路径设置

:help ins-completion
:help include

 

vim中含有一个特殊的快速修订窗口(quickfix window),直接在vim的命令模式下输入make,即可将命令的执行结果放入该窗口。

:copen
打开快速修订窗口

:close
关闭快速修订窗口

:cn
显示下一个错误

:cp
显示上一个错误

:cl
列出所有的错误及其编号

:cc
跳转到指定的编号的错误

 

把外部命令执行的结果插入到当前编辑的缓冲区中

:r!ls

要对所有的非空行进行编号,只需
:%!nl

要多包括空行的所有行进行编号
:%!nl -ba

当使用可视模式选中文本行后然后键入“:!”(命令行上将出现“:'<,'>!”,表示命令的范围是选定的文本),或者使用“:%!”(表示 命令的范围是整个缓冲区中的文本),Vim 在执行后面的命令时,将把命令范围里的文本行作为后面执行的命令标准输入,并用命令执行后的标准输出替换当前缓冲区中的这些文本行。

 

在vim导入某个文件的指定行

0r ! head -n 14 test.c | tail -n 12

 

shell中使用vim

第一种情形 Ex模式
例:如果将一些文件中的 -persion- 替换成 Jones,并打印这些文件
1、在change.vim中键入
%s/-person-/Jones/g
write tempfile
quit
2、在shell文件中键入                       
for file in *.txt
do
    vim -e -s $file < change.vim
    lpr -r tempfile
done

-e -s 即告诉vim以Ex模式安静的执行change.vim中的命令
第二中情形 Normal模式
vim -s script_name file.txt
-s即将script中的脚本作为normal模式的命令执行
附:vim -w script_name file.txt 将所有对file.txt的操作都记录到script_name文件中

 

关于映射
help map.txt
:map   all
:nmap   normal mode
:vmap    visual mode
:imap     insert mode
:smap    select mode
:xmap    visual, select mode

 

系统粘贴复制

vim 在命令模式下输入reg,看是否有“+”寄存器以备系统粘贴赋值使用
如果没用请apt-get install vim-gtk
"+p将系统内容粘贴到vim文件内
“+y将vim中的内容赋值到系统粘贴板
Ctrl y将vim 内容从系统粘贴板复制下来

 

折叠:

:set fmd 查看折叠模式
用shift
+ v标记起来,再按zf可以将标记的内容折叠起来 10zF 或 10zF+ 创建从当前行起到后10行的代码折叠 10zF- 创建从当前行起到之前10行的代码折叠 zf7G 自游标所在行至全文第7行进行折叠 :3,7fold 将第3行至第7行折叠起来 zf% 创建从当前行起到对应的匹配的括号上去( (), {}, [], <>等) zf 创建折叠 zd 删除光标下的折叠 zD 循环删除光标下的折叠 zE 去除所有折叠 zc 折叠关闭 zC 循环折叠关闭 zo 折叠展开 zO 循环折叠展开 zr 将全文中的所有折叠依次都打开 zR 将全文中的所有折叠循环打开 zm 将全文中的所有折叠依次关闭 zM 将全文中的所有折叠循环关闭 [z 到当前打开折叠的开始处 z] 到当前打开折叠的末尾处 zj 到达下一个折叠的起始处,关闭的折叠也被计入 zk 向上移动到前一个折叠的结束处,关闭的折叠也被计入

 

“zz‘把当前行视为屏幕正中央
"zt"把当前行至于屏幕顶端
”zb“把当前行置于屏幕底端

 

定位功能

   { 段首
  } 段尾
  g, 前一修改处
  g; 后一修改处
  ( 句首
  ) 句尾
  w 下一单词头
  b 前一单词头
  % 跳至匹配括号
  [{ 跳至块开始
  ]} 跳至块结束
  [/ 跳至注释块开始
  ]/ 跳至注释块结束
  gd (Goto Declaration) 跳至定义处
  gD 跳至全局变量定义处
  gj 跳至长行下一段
  gk 跳至长行上一段
  gf (Goto File) 打开文件
  ?向前查找
  / 向后查找
  ?? 重复上一向前查找
  // 重复上一向后查找
  # 向前查找光标下词(整词匹配)
  * 向后查找光标下词(整词匹配)
  g# 向前查找光标下字符串(不必是整词)
  g* 向后查找光标下字符串(不必是整词)
  vimgrep /pattern/[j][g] file file2 … fileN 多文件查找
  使用标志(mark)定位:
  0~9 系统自用
  a-z 本文件mark (使用方法: 标志:ma, 调至标志 `a)
  A-Z 跨文件的mark
  :marks 查看所有标志
  :delmarks 删除标志 

 

[[ 用来跳到光标前面的一个函数开始处。如果光标在函数体内的话,那就是所在函数的开始处。
][ 用来跳到光标后面的一个函数结尾处。如果光标在函数体内的话,那就是所在函数的结尾处。
]] 用来跳到光标后面的一个函数开始处。如果光标在函数体内的话,那就是下一个函数的开始处。
[] 用来跳到光标前面的一个函数结尾处。如果光标在函数体内的话,那就是上一个函数的结尾处

[# 当你在"#if"-"#endif"结构的中间某个地方时,可以使用这个命令跳转到此结构的开始元素
]# 向前跳转到下一个"#else"或"#endif"使用命令

在C代码中代码块以{}括起来。代码块可长可短。要移动到一个代码块的开头,使用"[["命令。"]["可以到它的末尾,这两个命令都假
设"{""}"字符位于第一列。"[{"命令跳转到当前代码块的开头,它会跳过与它平级的代码块。相应地"]}"会跳转到当前代码块的末
尾。                                                                                                               
                                                                                
写C++或Java的源代码时1 ,外层的{}用于类的定义。下一级的{}才是函数定义。光标在类中时使用"[m"可以找到前一个函数的开始>。"]m"到下一个函数的开始2 。另外,"[]"是查找上一个函数的结尾,"]]"则查找下一个函数的开始,函数的结尾以第一行出现"}"为>标志。
                                                                                
向后移动到注释的开头用使用"[/"。向前移动到其末尾用"]/"。这只对/* - */形式的注释有效。
                                                                                
你 在 写C程 序 时 可 能 经 常 会 想 知 道 一 个 变 量 是 被 声 明 为"int"还是"unsigned"。解决这个问题的快速办法是使
用"[I"命令。
假设你的光标置身于"column"上。键入:                                             
[I                                                                              

 如何找到最进的{,执行下命令,然后ESC

vi{ 选中{}中间的内容,不包括{}
va{ 选中{}中间内容,包括{}
vi( 选中()中间内容
vi< 选中<>中间内容
vi[ 选中[]中间内容
vit 选中中间的内容
vi” 选中”"中间内容
vi’ 选中”中间的内容
vis 选中一个句子
vib 选中一个block
viw 选中一个单词
vip 选中一个段落
ci{ 修改花括号内的内容,同理:ci[ ci( ci' ci" ci< ci/
di{ 删除花括号内的内容,同理:di[ di( di' di" di< di/
当光标在(), [], , {}, “”, ” 内时,可以用ci, di, 或yi,加上(, [, <, {, ", '。这样可以改写/删除/复制()内,[]内,内,{}内,””内,”内的内容
 

 

 

缩进
  >% 缩进块中内容
  <% 反缩进块中内容
  >i{ {内部缩进(不包括{})
  >a{ {内容缩进(包括{})
  <i{ 反缩进
  <a{ 反缩进
为当前行进行适当的缩进 ==                                                                                          
为{}中内容设置适当的缩进 =a{                                                    
全文重设缩进 gg=G                                                               
为{}内的所有行增加一个缩进单位 >i{                                              

 

 

列:将光标移到指定列,输入 数字+| ,例如 77|

 

1 12345
2 12345 
3 
4 变成:
5 1 2345
6 1 2345
7 
8 使用命令
9 1,2s/\%2c/ /

 

 1 vim编写C程序时,续行符对齐问题(用宏近似实现泛型)
 2 
 3 文件data内容:
 4 ggggg
 5 bbbbbbb
 6 
 7 我们将1~2行的列均扩充至80列,并在80列后加续行符
 8 vim data
 9 让后挂起
10 awk 'NR>=1 && NR<=2 {printf("%-80s\\\n", $0)}' data 1<>data
11 恢复fg
12 Load

或者vim data
然后:
:1,2s/\(.*\)/\=printf("%-80s\\", submatch(0))/g

 

vim 加密:

在编辑的文件里面,按:X回车,然后输入口令,因为是星号展示,所以需要重复输入。

解密:
打开文件,输入密码

最好对打开的需加密文件,加-n选项。如果文件已经打开,可以设置 :setlocal noswapfile

去除密码:
将密码设为空

w !sudo tee %
     在vim中保存一个只有root可以写的文件

 

 vim + scp

netrw路 径
对于多数协议,文件路径通常相对于用户目录。不过,有的协议里路径可以相对于一些相关的目录。
例如:
vim scp://user@host/somefile
vim scp://user@host/subdir1/subdir2/somefile
其中 "somefile""user" 的主目录。如果你想要文件相对于根目录的路径,使用完整路径:
例如: vim scp://user@host//somefile
例如: vim scp://user@host//subdir1/subdir2/somefile
当进入vim后再浏览文件时可以使用Nread Nwrite Nsource
Nread scp://[user@]machine[[:#]port]/file
Nread sftp://[user@]machine/file
或e scp
Nwrite scp://[user@]machine[[:#]port]/file
Nwirte sftp://[user@]machine/file
或w scp
Nsource scp://[user@]machine[[:#]port]/path
Nsource sftp://[user@]machine/path

 

posted on 2013-02-20 14:48  阿加  阅读(615)  评论(0)    收藏  举报

导航