vim使用技巧
1、shell脚本自动加注释
vim /etc/vimrc
autocmd BufNewFile *.py,*.cc,*.sh,*.java exec ":call SetTitle()" func SetTitle() if expand("%:e") == 'sh' call setline(1, "#!/bin/bash") call setline(2, "##############################################################") call setline(3, "# File Name: ".expand("%")) call setline(4, "# Version: V1.0") call setline(5, "# Author: oldboy") call setline(6, "# Organization: www.oldboyedu.com") call setline(7, "##############################################################") endif endfunc autocmd BufNewFile *.sh,*.script exec ":call XYY()" " ****************************************************************** ") function XYY() call append(0,"#!/bin/bash ") call append(1,"#******************************************") call append(2,"#Author: zhangjingzhi ") call append(3,"#Create_Time: ".strftime("%Y-%m-%d" )) call append(4,"#Version: v1.o ") call append(5,"#Mail: 1570649754@qq.com ") call append(6,"#Description: doyouwanttodo ") call append(7,"#******************************************") endfunction
2、vim加密文本
法一
# vim -x aa.sh
法二
编辑完后,按Esc
:set key=密码
3、文本对比diff的使用
(1)正常格式
# diff a.txt b.txt
2,3c2,3 < this is line 2 < hello world! --- > this is line 2 > HELLO world!
第一行:2,3c2,3
第一个2,3表示文件a.,txt中第2到3行有变化,后面的2,3表示a.txt通过变化成为b.txt中的第2到3行。中间的c就是具体的变化了,c表示改变(change),其它类型还有d删除(delete),a增加(addition)。注意,人眼看不到的空格号也能识别到。
(2)上下文格式
由于在正常格式下,提示信息比较少,我们无法快速定位所修改的地方,经常需要打开文件才知道修改细节。所以,为了给出更多的信息,引入了上下文格式。它的使用命令如下:
# diff -c a.txt b.txt (c表示context,即上下文的意思。) *** a.txt 2020-10-01 22:08:24.605163484 +0800 --- b.txt 2020-10-01 22:08:18.516164179 +0800 *************** *** 1,4 **** this is line 1 ! this is line 2 ! hello world! this is line 4 --- 1,4 ---- this is line 1 ! this is line 2 ! HELLO world! this is line 4 第1行和第2行表示修改前及修改后的文件及更新时间 (!)表示该行有改动,如果该行被删除,则为减号(-),如果该行被增加,则为加号(+)。后面几行的含义类似。
(3)合并格式
这种格式是正常格式与上下文格式的综合版,同时这种格式也是git diff所采用的格式。使用这种格式的命令是:
# diff -u a.txt b.txt --- a.txt 2020-10-01 22:08:24.605163484 +0800 +++ b.txt 2020-10-01 22:08:18.516164179 +0800 @@ -1,4 +1,4 @@ this is line 1 -this is line 2 -hello world! +this is line 2 +HELLO world! this is line 4
(4)并排格式,更直观
# diff a.txt b.txt -y -W 50 this is line 1 this is line 1 this is line 2 | this is line 2 hello world! | HELLO world! this is line 4 this is line 4
“|”符号,表示这行有更改。另外,如果前面是“<”,表示后面文件比前面文件少了1行内容;如果是">",表示后面文件比前面文件多了1行内容。
4、解决粘贴代码乱的问题
:set paste + i
5、vim编辑器中快捷键
do:删至行首
d$:删至行尾
dG:全删
6、跳到指定的行
: 12 (回车跳到12行处)
7、 指定行数范围删除
: num1,num2 d
行首 : % s/^/your_word/ 行尾 : % s/$/your_word/ 在2~50行首添加//号注释 :2,50 s/^/\/\//g
9、跳转到指定行
在vim中有3中方法可以跳转到指定行(首先按esc进入命令行模式):
1、ngg/nG (跳转到文件第n行,无需回车)
2、:n (跳转到文件第n行,需要回车)
3、vim +n filename (在打开文件后,跳转到文件的第n行)
10、光标移到行首、行尾
行首:0或者^ 行尾:$
11、复制、删除
复制
「yw」:将光标所在之处到字尾的字符复制到缓冲区中。
「#yw」:复制#个字到缓冲区
「yy」:复制光标所在行到缓冲区。
「#yy」:例如,「6yy」表示拷贝从光标所在的该行“往下数”6行文字。➕d删除,+p复制
12、Vim中出现^M和行尾空格
原因:在Windows/Dos系统下编辑文字,win/Dos系统会在每一行后面插入一个换行符,即"^M",十六进制:0x0D0A,与Linux下的换行符十六进制是不一样的,Linux/Unix下是0A(ASCII码),具体也取决于编译器。
- 解决方案(全局替换):
- 方法一:命令行模式下:% s/ctrl+v,然后再ctrl+m//g
- 方法二: 命令行模式下:% s/\r//g
- 方法三:
-
cat file | tr -s "\r" "\n" > new_file 或 cat file | tr -d "\r" > new_file
- 局部替换:
- 命令行模式:n1, n2 s/ctrl+v ctrl+m//g (其中的n1和n2是行号)
删除行尾的空格:
:% s/\s\+$//g
sed -ri.bak '/^[ \t]*#|^[ \t]*$/d' /etc/ntp.conf egrep -v "*#|^$" /etc/nginx/conf.d/default.conf
\s表示匹配任何空白字符,包括空格、制表符、换页符等等, 等价于[ \f\n\r\t\v]
而"\s+"则表示匹配任意多个上面的字符
\f -> 匹配一个换页 \n -> 匹配一个换行符 \r -> 匹配一个回车符 \t -> 匹配一个制表符 \v -> 匹配一个垂直制表符
在命令行模式下: % 当前完整的文件名 %:h 文件名的头部,即文件目录.例如../path/test.c就会为../path %:t 文件名的尾部.例如../path/test.c就会为test.c %:r 无扩展名的文件名.例如../path/test就会成为test %:e 扩展名
14、mac的esc 键突然不显示了,设置快捷键
vim中: :inoremap jk <esc> 或者/etc/vimrc追加inoremap jk <esc> 注:jk是随意指定的组合键
15、命令补全
使用Ctrl-N或Ctrl-P键,将按照'complete'选项指定的范围来搜索匹配的关键字。
也可以ctrl+X在插入模式下,按tab进行补全
:set complete=.,w,b,u,t,i
16、vim配置开发环境
https://vim-bootstrap.com/
17、vim中删除空行和注释
删除空行
:g/^$/d
删除空行以及只有空格的行
:g/^\s*$/d
删除以 # 开头或 空格# 或 tab#开头的行
:g/^\s*#/d
对于 php.ini 配置文件,注释为 ; 开头
:g/^\s*;/d
使用正则表达式删除行
如果当前行包含 bbs ,则删除当前行
:/bbs/d
删除从第二行到包含 bbs 的区间行
:2,/bbs/d
删除从包含 bbs 的行到最后一行区间的行
:/bbs/,$d
删除所有包含 bbs 的行
:g/bbs/d
删除匹配 bbs 且前面只有一个字符的行
:g/.bbs/d
删除匹配 bbs 且以它开头的行
:g/^bbs/d
删除匹配 bbs 且以它结尾的行
:g/bbs$/d
.ini 的注释是以 ; 开始的,如果注释不在行开头,那么删除 ; 及以后的字符
:%s/^\;.\+//g
删除 # 之后所有字符
%s/\#.*//g
18、将文本中相同数字进行自增
docker save -o 1.tar docker.io/openshiftistio/origin-ansible:0.7.1 ;\ docker save -o 1.tar docker.io/openshiftistio/origin-ansible:0.8.0 ;\ docker save -o 1.tar docker.io/skydive/skydive:latest \ ##执行 :g/1.tar/ s//\=line('.').'.tar'/ ##效果 docker save -o 1.tar docker.io/openshiftistio/origin-ansible:0.7.1 ;\ docker save -o 2.tar docker.io/openshiftistio/origin-ansible:0.8.0 ;\ docker save -o 3.tar docker.io/skydive/skydive:latest ;\
19、显示匹配个数
:%s/docker//gn
20、去除重复的行
:sort u
21、忘记sudo后,在vim中保存一个只有root可以写的文件
:w !sudo tee %
命令解释
:w是vim的写入命令
%当前编辑的文件名
!sudo tee vim中调用shell命令都是以!开头的
整个命令就是:以root的身份运行tee命令,读取vim :w命令的输出作为标准输入,将其内容输出到标准输出设备,同时保存到%表示的文件中