vi/vim
跳到文件尾:1,G 2, :$
跳到文件头: 1, gg 2, :1
跳到指定的行: :n
查看文件编码:$ :set fileencoding
:set fileencoding=utf-8
显示当前文件名: :f 或者 ctrl +G
显示文件当前路径: :pwd 或者 :!pwd (命令模式下执行shell命令pwd会遮挡文本,不建议使用)
光标如何回到上一次位置: '' (两个单引号) 或者 ctrl + 0 或者ctrl + i
选定: v
vim已经启动 输入 :e file 可以再打开一个文件,并且此时vim里会显示出file文件的内容。 3.同时显示多个文件: :sp //水平切分窗口 :vsplit //垂直切分窗口
在文件之间切换: 1.文件间切换 Ctrl+6 //两文件间的切换 :bn //下一个文件 :bp //上一个文件 :ls //列出打开的文件,带编号 :b1~n //切换至第n个文件 对于用(v)split在多个窗格中打开的文件,这种方法只会在当前窗格中切换不同的文件。 2.在窗格间切换的方法 Ctrl+w+方向键——切换到前/下/上/后一个窗格 Ctrl+w+h/j/k/l ——同上 Ctrl+ww——依次向后切换到下一个窗格中;关闭窗口: ctrl+w+o
统计某关键字出现的次数:
:%s/key/&/gn
永久显示行号:
$ vim ~/.vimrc
打开后添加set nu,保存退出
取消行号显示:
:set nonu
大小写检索:默认是区分大小写的,
:set ignorecase 或者 :set ic
恢复区分大小写:
:set noignorecase 或者 :set noic
单次关键字查询不区分大小写:
/search-text\c
将当前文件[或者部分]内容复制到另外一个文件中
比如:把test1.txt第一行到第五行复制到 ~/test2.txt(会覆盖test2.txt原内容)
vi test1.txt esc命令行模式下
:1,5 w ~/test2.txt
把test1.txt第一行到第五行追加到到 ~/test2.txt
:1,5 w>> ~/test2.txt
命令模式下执行shell命令
:!cmd
在windows下编辑的脚本在linux系统下执行$ sh -x tmp.sh
+log_dir=$'/tmp\r'
原因:windows下以“\n\r”作为换行,unix/linux下以“\n”作为换行。$ cat -A tmp.sh可以看到隐藏的符号。
解决方法:在命令模式下
1) :set fileformat=unix
或者: set ff=unix
2) :%s/^M$//g
:w
^M 注意要用 Ctrl + V Ctrl + M 来输入
3) tr -d '\r' < tmp.sh > result.sh (注:将tmp.sh作为输入用tr处理,再输出到result.sh中)
4) $ dos2unix filename
5) $ sed -i ’s/^M//’ tmp.sh (注:-i 直接在源文件中修改)
从当前光标处,n向上搜索,N向下搜索
?keyvalue
从当前光标处,n向下搜索,N向上搜索
/keyvalue
vi中怎么搜索复制出来的字符串。停留在要查找的单词的任意字母上面
shift+*
或者 让光标停留在单词的第一个字母上, 然后输入yw拷贝该单词, 然后输入 / (Ctrl + R) 0 (即 /”0),回车, 就查找到了第一个匹配的单词, 并且可以通过 n 或 N 进行上一个或下一个的匹配。
Ctrl + r 是指使用寄存器 , 你会发现先输入/ , 然后输入 Ctrl + r , 会立刻变为 “ , 即寄存器的前缀, 然后 ”0 就可以理解了吧? 合起来就是 /“0, 就是查找刚才复制的那个单词, 不懂的请查看上一个帖子:
http://blog.csdn.net/ballack_linux/article/details/53078836
对文本按行排序:
:sort
删除替换:
:[range]g/<pattern>/cmd
[range]代表范围,可以指定(eg. :1,3g/linux/c)也可以不用指定(eg. :g/linux/c)
cmd有很多,比如d,删除命令;c,删除并且进入insert模式;s,替换命令
如g/test/s/aaa/bbb/ 在文中查找包含test的行,并且把该行中的aaa替换成bbb,也可以把aaa省略,
g/test/s//bbb/,这时候表示的是把test替换成bbb指令
1. 要查找相同的两行,先将内容排序,然后查找前一行等于后一行者
:sort
/^\(.\+\)$\n\1
2. 删除重复行(先排一下序):
:sort
:g/^\(.\+\)$\n\1/d
3. 删除行首的数字
:% s/^[0-9]\{1,\}//g
4.删除包含特定字符的行,匹配删除:比如带有abc
:%g/abc/d
vi/vim 删除:一行, 一个字符, 单词, 每行第一个字符 命令
x 删除当前光标下的字符 dw 删除光标之后的单词剩余部分。 d$ 删除光标之后的该行剩余部分。 dd 删除当前行。 c 功能和d相同,区别在于完成删除操作后进入INSERT MODE cc 也是删除当前行,然后进入INSERT MODE
设置tab键为4个空格,且自动对齐
$vi /etc/vim/vimrc
set ts=4 set expandtab set autoindent
翻页:
CTRL-F 向前一页 CTRL-B 向后一页
ta 跳到下一个a 前面
fa 跳到下一个a
num% 调到百分之num
num| 跳到第几列
CTRL-E 向下一行
CTRL-Y 向上一行
字符乱码:
~/.vimrc 文件中添加以下内容:
set encoding=utf-8 fileencodings=ucs-bom,utf-8,cp936
JSON格式化
command! JsonFormat :execute '%!python -m json.tool' \ | :execute '%!python -c "import re,sys;chr=__builtins__.__dict__.get(\"unichr\", chr);sys.stdout.write(re.sub(r\"\\u[0-9a-f]{4}\", lambda x: chr(int(\"0x\" + x.group(0)[2:], 16)).encode(\"utf-8\"), sys.stdin.read()))"' \ | :set ft=javascript \ | :1
打开json文件:
:JsonFormat
@2020-05-07 20:05:59
vim插入模式下打出特殊字符:
在插入模式下,按CTRL+V会显示^,然后按特殊按键可以输入特殊字答符
如CTRL+V,出现^,按F1输入表示<F1>键的特殊字符
^A用脚本awk或python可以把分隔符设置为'\x01',在vim中选中时,用ctrl+a来表示这个分隔符。
^R CTRL+V,CTRL+r
恢复.swp文件:vim -r xxxx 进去再 :wq 退出编辑模式,改文件已经回复可编辑状态,再 rm -rf .xxxx.swp 删除掉隐藏文件后继续编辑源文件
非交互式执行命令
编写vim脚本,batchVi.vim
:set fileencoding=utf-8 :wq
vim -s batchVi.vim one.txt
合并行
命令状态下 :1,3 join 或 :1,3 j