复制粘贴保持格式
set paste nnoremap <F7> :set invpaste paste?<CR> imap <F7> <C-O>:set invpaste paste?<CR> set pastetoggle=<F7>
两个常用的指令序列
xp 左右交换光标处两字符的位置ddp 上下交换光标处两行的位置
执行宏命令脚本merge.vim
在VIM编辑器中按如下键 :so merge.vim 回车
merge.vim 脚本
"------------------------------------------ :1 :map = ma/!!!!!^M+:.co 'a-1^M/!!!!!^M2+:.m'a^M+= ma 将数据文件一的第一行标记为a /!!!!!^M 找到标志行,置为当前行 + 光标下移一行,即把标尺行置为当前行 :.co 'a-1^M 把标尺行复制到标记行(数据文件一的第一行)的上方 2+ 光标下移2行 = 是典型的递归调用,重复完成以上步骤 "------------------------------------------
在文件中置入行号
脚本:%s/^/^I/ 每一行的行首添加一个TAB字符
:$ 到文件的末行
:let end=line(".") 末行的行号 ==〉变量 END,函数line的功能是取得指定行的行号,
此处参数"."表示当前行
:1 到文件的首行
"------------------------------------------
:let num=1 1 ==〉计数器
:while num<=end
:let line=getline(".") 取当前行的内容 ==〉变量 LINE
:let line=substitute(line,$,num,"") 在变量 LINE 的前面置入行号
:call setline(".",line) 将变量 LINE 的内容写回当前行
:+ 下移一行
:let num=num+1 计数器加一
:endwhile 循环执行,直到文件结束
"------------------------------------------
文件处理
"有一文件,包含某外企的中国员工的资料,首先是姓名,然后是两个空格,其次是15位身份证号码。将文件中每行出现的2个空格替换为10个空格 :%s/ / / 保留行首的12个字符,将其余的空格删除,这样,前两个字段就对齐了 :%s/\(............\)\( *\)/\1/ 将文件中每行出现的雇员姓名互换,并将首字母大写 :%s/\([A-Za-z][A-Za-z]*\)\(\.\)\([A-Za-z][A-Za-z]*\)/\u\3\2\u\1/ 在每一行的行尾添加2个空格和6个x :%s/$/ xxxxxx/ 将xxxxxx替换成出生年月日 :%s/\([0-9]\{6}\)\([0-9]\{6}\)\([0-9]\{3}\) \(xxxxxx\)/\1\2\3 \2/ 将年月日用/字符分隔,并在年前添加19 :%s/\(..\)\(..\)\(..\)$/19\1\/\2\/\3 :%s/$/ xxxxxx/ 身份证号码末位是奇数的,将xxxxxx替换成male :%s/\([0-9]\{14}[13579]\)\(.*\)\(xxxxxx\)/\1\2male / :%s/\([0-9]\{14}[02468]\)\(.*\)\(xxxxxx\)/\1\2female/ :$ 到文件的最后一行 在文件的最末行插入一行 "-" 字符 :s/.*/&^M----------------------------------------------- 将所有的女员工记录移至文件尾 :g/female/.m$ 将1234567890ABCDEF ,将其变成 13579ACE 24680BDF 的形式 "---------------------------------------------------- :s/.*/&^M/ :1 :map = malx+$p-`al= "---------------------------------------------------- 命令详解: :s/.*/&^M/ 在数据行下方添加一空行。 :1 回到文件的首行的首字符。 :map = malx+$p-`al= 将一大串VIM命令映像给字符= ma 将首字符标记为a l 光标右移一个字符 x 删除光标处字符 + 移至下一行 $ 到行尾 p 将删除的字符粘贴 - 回至上一行 `a 返回到标记字符处 = 递归调用,重复以上步骤,直到将该行所有的数据处理完