Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

vim 使用说明 #95

Open
yubaoquan opened this issue Sep 9, 2022 · 7 comments
Open

vim 使用说明 #95

yubaoquan opened this issue Sep 9, 2022 · 7 comments

Comments

@yubaoquan
Copy link
Owner

原出处

WbBullFrog的ChinaUnix博客 > Linux编辑器之VIM

正文

VIM是Linux功能最为强大的编辑器,它是由Unix下传统的文本编辑器VI发展而来的,VI M- Vi IMproved,VI的增强版,有彩色和高亮等特性,VIM和VI的区别可参看vi_diff.txt(:help vi_diff.txt),目前好多版本的Linux中调用VI是链接到VIM,作为Linux学习系统管理和编程基本工具,是要好好学习下VIM的使用基本操作命令,以下整理图书和网络上对于VIM的概述和操作命令的介绍,以备记录和查询之用:

1. VIM的编辑模式

VIM和VI一样都是有模式的编辑器,详细了解VIM模式,在VIM里输入:help mode,主要有如下几种模式:

(1)命令模式(Normal mode)
一进入VIM就是出于命令模式,该模式下所有键盘输入都作为命令来对待,不会输入都文件里,其他任何模式都可以通过Esc键回到命令模式;
(2)编辑模式(Insert mode)
在命令模式中输入a、i、A、I、o、O等命令即可进入该模式,此时在状态列会有INSERT字样。在该模式下才能输入文字,按Esc键回到命令模式;
(3)命令行模式模式(Command-line mode)
在命令模式中输入“:”(一般命令)、“/”(正向搜索)或“?”(反向搜索)进入该模式。此时屏幕左下角出现一个冒号提示符,等待输入命令,命令行模式下的命令输入完成后按Enter键才会执行,按Esc键回到命令模式;
(4)可视模式(Visual mode)
在命令模式中通过v(按字符选择)、V(按行选择)、Ctrl+V(按块选择)进入该模式,在屏幕底部会有“-VISUAL-"、“-VISUAL LINE-"、“-VISUAL BLOCK-"等提示。在该模式下,通过移动光标选择文本,选中的文本将反白显示。按Esc键回到命令模式;

2.1 进入vi的命令

  1. 启动进入vi操作
vi 进入vi而不读入任何文件
vi filename 进入vi并读入或新建指定名称的文件,并将光标置于第一行首
vi filename....filename 打开多个文件,依次进行编辑
vi +n filename 进入vi打开文件,并将光标置于第n行首。
vi + filename 进入vi打开文件,并将光标置于最后一行首 。
vi +/pattern filename 打开文件,并将光标置于第一个与pattern匹配的串处
vi -r filename 在上次正用vi编辑时发生系统崩溃,恢复filename
vim -R file 只读方式打开文件
vimdiff fileA fileB 比较编辑两个不同的文件
  1. 存储及退出文件
保存
:wq 或者 :x 存文件,并且退出vi
ZZ 保存并退出 (:x 表示仅在需要时保存,ZZ不需要输入冒号并回车) ZZ = wq
:w 保存当前文件
:w filename 写入指定文件,相当于另存为,但未退出vi(若未指定文件名则为当前工作的文件名)
可带行范围 :n1,n2 w filename
:w /tmp/1 既然没法存盘,不想放弃所做的所有修改,先临时存到/tmp/1
:saveas 另存为
退出
:q 不作任何修改并退出vi (多屏时用qa)
:q! 放弃任何修改并退出vi
ZQ 无条件退出
编辑
:e filename 打开文件filename进行编辑[相当于退出当前的并打开另一个文件]?
:e! 放弃修改文件内容,重新载入该文件编辑
:e 重新载入【类似刷新】
:w !sudo tee % 以普通用户身份打开的vim,修改后以root身份保存
其他
ctrl + z / fg 暂时挂到后台/跳回编辑页面
:f 或 Ctrl-g 显示文件名,当前光标所在行的行号,总的行数,以及当前行所在文件中的百分比和当前光标所在的列的信息
:!command 暂时退出vi并执行shell指令,执行完毕后再回到vi
:r!command 将命令command的输出结果放到当前行【强大】
:sh 暂时退出vi到系统下,结束时按Ctrl + d则回到vi。
vim -x exam.txt 新编辑的文件加密,会提示输入密码
:X 文件加密,会提示输入密码
:map 列出当前已定义的映射(如何定义映射?)
:jumps 列出关于你曾经跳转过的位置的列表,你最后一个跳转的位置被特别以一个”>”号标记
:marks 列出自定义的标记,包含VIM内部自定义的标识
:%!nl 要对包含空行的所有行进行编号(所有行之前插入行号^I)
:version 显示VIM版本信息,包含特性、编译方式及配置文件目录
:n1,n2 w ! command 将文件中n1行至n2行的内容作为command的输入并执行之,若不指定n1,n2,则表示将整个文件内容作为command的输入【注意空格】例如 :1,4 w! grep tom
:options 打开一个新窗口, 在该窗口的最开头的注释下面是一个选项列表(do what?)
:r filename 在光标所在处插入一个文件的内容(read)
可加入数字 :nr filename
:f filename 改变编辑中的文件名(file)
相当于复制了一个文件,执行这个命令后,新编辑不会应用于原文件
gf vim特殊打开文件的方法,打开光标所在处的 word 为名的文件,当然,这个文件要在当前目录内,否则会创建新文件
@yubaoquan
Copy link
Owner Author

4. 光标移动

字符 默认1,可加n
h 光标左移一个字符[回退键Backspace]
l 光标右移一个字符[空格键Space]

BP:

hkjl作为移动光标【important,同方向键,建议使用这四个】

单词 默认1,可加n
w 光标跳到下个word的第一个字母 [常用]
W 移到下一个字的开头,忽略标点符号
b 光标回到上个word的第一个字母
B 移到前一个字的开头,忽略标点符号 BACK
e 光标跳到下个word的最后一个字母
E 移到下一个字的结尾,忽略标点符号 END
0 移到当前一行的开始[Home]
数字零,到行头
$ 移到当前一行的最后[End]
^ 命令将光标移动到当前行的第一个非空白字符上
g_ 到本行最后一个不是blank字符的位置
k 光标上移一行Ctrl+p
j 光标下移一行Ctrl+n
Enter 光标下移一行
n+ 光标下移n行【按上档键 数字shift +】
n- 光标上移n行
G 移到文件的最后一行
nG或者:n 移到文件的第n行???
gg 移动到文档的开始
[[ 文件开始位置——开始行
]] 文件结束位置——末尾行
H 光标移至屏幕顶行 HEAD
光标定位在显示屏的第一行
M 移到屏幕的中间行开头 Middle
光标定位在显示屏的中间
L 移到屏幕的最后一行? LAST
光标定位在显示屏的最后一行
( 光标移至句首
) 光标移至句尾
段落
{ 移到段落的开头
} 移到下一个段落的开头
% 匹配括号移动,包括 (, {, [.(陈皓注:你需要把光标先移到括号上)
跳转到与之匹配的括号处
* 和 # 匹配光标当前所在的单词,移动光标到下一个(或上一个)匹配单词(*是下一个,#是上一个)
zf 折叠(需加方向键)
zo 展开(空格也可以展开)
可以zf进行折叠, 用zo打开折叠,也可以方向键向右打开折叠,zc 关闭折叠(只要在被折叠的块中的任一个语句就行)???
屏幕
Ctrl+u 向文件首翻半屏up
Ctrl+d 向文件尾翻半屏down
Ctrl+f 向文件尾翻一屏 forward (fact整屏去两行)
Ctrl+b 向文件首翻一屏back (fact整屏去两行)
CTRL-] 跳转到当前光标所在单词对应的主题
CTRL-O 回到前一个位置
zz 命令会把当前行置为屏幕正中央(z字取其象形意义模拟一张纸的折叠及变形位置重置)
zt 命令会把当前行置于屏幕顶端(top)
zb 命令会把当前行置于屏幕底端(bottom)
50% 光标定位在文件的中间
` 跳转到最近光标定位的位置(只能记忆最近两个位置) 反引号

@yubaoquan
Copy link
Owner Author

5. 插入

i 在光标前开始插入字符 insert
I 在当前行首开始插入字符
a 在光标位置后开始加字 append
A 在光标所在行的最后面开始加字
o 在光标下加一空白行并开始加字 open
O 在光标上加一空白行并开始加字
r 替换当前字符
R 替换当前字符及其后的字符【当前及其后字符被覆盖】
s 默认删除光标所在字符,输入内容插入之 = xi
S 默认删除当前行内容,输入内容作为当前行新内容= dd+o

@yubaoquan
Copy link
Owner Author

6. 删除

字符
nx 删除由光标位置起始后的n个字符(含光标位置)
x =dl(删除当前光标下的字符)
nX 删除由光标位置起始前的n个字符(含光标位置)
X =dh(删除当前光标左边的字符)
d0 删至行首(数字零)
d$ 删至行尾
dfa 表示删除从当前光标到光标后面的第一个a字符之间的内容
D 代表d$(删除到行尾的内容)
C 代表c$(修改到行尾的内容)
单词
ndw 删除光标处开始及其后的n-1个字
ndb 删除光标处开始及其前的n-1个字
diw 删除当前光标所在的word(不包括空白字符),意为Delete Inner Word 两个符号之间的单词
daw 删除当前光标所在的word(包括空白字符),意为Delete A Word
ndd 删除当前行及其后n-1行
:n1,n2 d 将 n1行到n2行之间的内容删除
dG 删除当前行至文件尾的内容
dgg 删除当前行至文件头的内容
d回车 删除2行【包括光标一行】

【删除就是剪切,它会覆盖之前复制的内容】

删除并进入输入模式
cw 删除当前字,并进入输入模式
【很好用,快速更改一个单词】
相当于dw+i
ncw 删除当前字及其后的n-1个字,并进入输入模式
修改指定数目的字
cc 删除当前行,并进入输入模式
ncc 删除当前行及其后的n-1行,并进入输入模式
guw 光标下的单词变为小写
gUw 光标下的单词变为大写
xp 左右交换光标处两字符的位置
ga 显示光标下的字符在当前使用的encoding下的内码

@yubaoquan
Copy link
Owner Author

7. 复制和黏贴

复制
nyl 复制n个字符(也可nyh)
yw 复制一个单词
y0 表示拷贝从当前光标到光标所在行首的内容
y$ 复制从当前位置到行尾
yfa 表示拷贝从当前光标到光标后面的第一个a字符之间的内容
yG 复制从所在行到最后一行
nyy 将光标所在位置开始的n行数据复制暂存
复制一整行
ctrl + v 方向 y 复制选择的很多行:先使用V进入visual模式,然后j向下移动到你想复制的行为止,然后y
粘贴
p 复制暂存数据在光标的下一行
P 复制暂存数据在光标的上一行
:n1,n2 co n3 将n1行到n2行之间的内容拷贝到第n3+1行【n3行的下一行】
:n1,n2 m n3 将n1行到n2行之间的内容移至到第n3行下
J 把下一行的数据连接到本行之后
多一空格
~ 改变当前光标下字符的大小写

@yubaoquan
Copy link
Owner Author

8. 查找

/pattern 从光标开始处向文件尾搜索pattern
?pattern 从光标开始处向文件首搜索pattern
n 在同一方向重复上一次搜索命令
N 在反方向上重复上一次搜索命令??
# 向上完整匹配光标下的单词
相当于?word
* 向下完整匹配光标下的单词
相当于/word
% 查找对应的( [ {匹配
nfx 在当前行查找光标后第n个x(一般直接fx)

9. 替换

:s/p1/p2/g 将当前行中所有p1均用p2替代
无g,则只替换第一个
:s/p1/p2/c 查找替换要求确认
:n1,n2s/p1/p2/g 将第n1至n2行中所有p1均用p2替代
:%s/p1/p2/g 全局,使用p2替换p1
:%s/p1/p2/gc 替换前询问
:n,$s/vivian/sky/ 替换第n行开始到最后一行中每一行的第一个vivian为sky,n为数字
:.,$s/vivian/sky/g 替换当前行开始到最后一行中每一行所有vivian为sky
:s/vivian//sky// 替换当前行第一个vivian/为sky/,可以使用\作为转义符
:1,$s/^/some string/ 在文件的第一行至最后一行的行首前插入some string
:%s/$/some string/g 在整个文件每一行的行尾添加some string
:%s/\s+$// 去掉所有的行尾空格,“\s”表示空白字符(空格和制表符),“+”对前面的字符匹配一次或多次(越多越好),“$”匹配行尾(使用“$”表示单纯的“$”字符)
:%s/(\s*\n)+/\r/ 去掉所有的空白行,“(”和“)”对表达式进行分组,使其被视作一个不可分割的整体
:%s!\s*//.*!! 去掉所有的“//”注释
:%s!\s*/*_.{-}*/\s*!!g 去掉所有的“/* */”注释
:%s= *$== 将所有行尾多余的空格删除(没看懂)
:g/^\s*$/d 将所有不包含字符(空格也不包含)的空行删除
r 替换当前字符
R 替换当前字符及其后的字符,直至按ESC键

命令说明

:[range]s/pattern/string/[c,e,g,i]

  • ? range 指的是範圍,1,7指從第一行至第七行,1,$ 指從第一行 至最後一行,也就是整篇文章,也可以% 代表 (目前編輯的文章)。
  • ? pattern 就是要被替換掉的字串,可以用regexp 來表示。
  • ? string: 將pattern 由 string 所取代。
  • ? c: confirm,每次替換前會詢問。
  • ? e: 不顯示error。
  • ? g: globe,不詢問,整行替換。
  • ? i: ignore 不分大小寫。
  • ? g 大概都是要加的,否則只會替換每一行的第一個符合字串。
  • ? 可以合起來用

其中s为substitute,%表示所有行,g表示globa

@yubaoquan
Copy link
Owner Author

10. 编辑多个文件

:r filename 将指定文件的内容读入光标所在行下
:args 显示编辑名单中的各个文件名列表
:n 切换到下一个文件
:N 切换到上一个文件
:rew 回到首个文件
:e# 读入编辑名单内的前一个文件
:e file 读入另一个文件进vi(此文件可不在编辑名单内),若原文件经修改还没有存档,则应先以: w 存档。
:e! file 强迫读入另一个文件进入vi,原文件不作存档动作。
:e 放弃当前一切修改,重新载入文件
:bn 和 :bp 你可以同时打开很多文件,使用这两个命令来切换下一个或上一个文件
:files或 :buffers或 :ls 会列出目前 buffer 中的所有文件

@yubaoquan
Copy link
Owner Author

替换引号/括号

增加引号/括号(用大写S)

  1. 在普通模式下, 选中(高亮)文本
  2. S + 要增加的号

示例

添加单引号

S + '

添加括号

  1. 括号内部带空格

S + (

  1. 括号内部不带空格

S + )

删除引号/括号(用小写s)

  1. 光标移动到引号/括号中间
  2. d + s + 要删除的引号/括号

示例

删除单引号

d + s + '

删除括号

d + s + (

替换引号/括号

  1. 光标移动到引号/括号中间
  2. c + s + 目标引号/括号 + 替换后的引号/括号

示例

单引号替换成双引号

c + s + ' + "

圆括号替换成方括号

c + s + ( + [

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant