xgqfrms™, xgqfrms® : xgqfrms's offical website of cnblogs! xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!

vi & vim 使用教程从入门到精通 All In One

vi & vim 使用教程从入门到精通 All In One

$ man vim
$ vim --version
VIM - Vi IMproved 8.2 (2019 Dec 12, compiled Oct 01 2021 01:51:08)
包含补丁: 1-2434
Extra patches: 8.2.3402, 8.2.3403, 8.2.3409, 8.2.3428
修改者 team+vim@tracker.debian.org
编译者 team+vim@tracker.debian.org
巨型版本 无图形界面。  可使用(+)与不可使用(-)的功能:
+acl               -farsi             +mouse_sgr         +tag_binary
+arabic            +file_in_path      -mouse_sysmouse    -tag_old_static
+autocmd           +find_in_path      +mouse_urxvt       -tag_any_white
+autochdir         +float             +mouse_xterm       -tcl
-autoservername    +folding           +multi_byte        +termguicolors
-balloon_eval      -footer            +multi_lang        +terminal
+balloon_eval_term +fork()            -mzscheme          +terminfo
-browse            +gettext           +netbeans_intg     +termresponse
++builtin_terms    -hangul_input      +num64             +textobjects
+byte_offset       +iconv             +packages          +textprop
+channel           +insert_expand     +path_extra        +timers
+cindent           +ipv6              -perl              +title
-clientserver      +job               +persistent_undo   -toolbar
-clipboard         +jumplist          +popupwin          +user_commands
+cmdline_compl     +keymap            +postscript        +vartabs
+cmdline_hist      +lambda            +printer           +vertsplit
+cmdline_info      +langmap           +profile           +virtualedit
+comments          +libcall           -python            +visual
+conceal           +linebreak         -python3           +visualextra
+cryptv            +lispindent        +quickfix          +viminfo
+cscope            +listcmds          +reltime           +vreplace
+cursorbind        +localmap          +rightleft         +wildignore
+cursorshape       -lua               -ruby              +wildmenu
+dialog_con        +menu              +scrollbind        +windows
+diff              +mksession         +signs             +writebackup
+digraphs          +modify_fname      +smartindent       -X11
-dnd               +mouse             -sound             -xfontset
-ebcdic            -mouseshape        +spell             -xim
+emacs_tags        +mouse_dec         +startuptime       -xpm
+eval              +mouse_gpm         +statusline        -xsmp
+ex_extra          -mouse_jsbterm     -sun_workshop      -xterm_clipboard
+extra_search      +mouse_netterm     +syntax            -xterm_save
     系统 vimrc 文件: "$VIM/vimrc"
     用户 vimrc 文件: "$HOME/.vimrc"
 第二用户 vimrc 文件: "~/.vim/vimrc"
      用户 exrc 文件: "$HOME/.exrc"
       defaults file: "$VIMRUNTIME/defaults.vim"
         $VIM 预设值: "/usr/share/vim"
编译方式: gcc -c -I. -Iproto -DHAVE_CONFIG_H -Wdate-time -g -O2 -ffile-prefix-map=/build/vim-I0JMpS/vim-8.2.2434=. -fstack-protector-strong -Wformat -Werror=format-security -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1 
链接方式: gcc -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -o vim -lm -ltinfo -lselinux -lacl -lattr -lgpm -ldl 
# VIM 操作记录
$ vim ~/.viminfo

# VIM 配置文件
$ vim ~/.vimrc

https://github.com/vim/vim

VIM 模式

# ESC
:h vim-modes-intro
:h vim-mode
  1. 基本模式

正常模式/普通模式(默认模式)

可视化模式
v

选择模式

插入模式
i
o

命令模式/命令行模式
:q
:q!
:wq
:wq!
:version

image

退出模式
ESC

Terminal 工作模式

image
image

  1. 扩展模式

操作挂起模式
替换模式
可视化替换模式
插入正常模式
插入可视化模式
插入选择模式
Terminal 可视化模式

image

image

VIM 复制

yy

VIM 粘贴

p

VIM 删除

dd

VIM 高级设置

  1. 语法高亮
  2. 自动缩进
  3. 快捷键
  4. 自动补全
  5. 全局搜索替换
    ...

Linux shell commands / shell script

cd
ls
cd ../
cd -
pwd
cp
rm
mkdir
tar
mv
mb
tar -zcf
chmod
ssh
top
q
free

数字0含空字符到行首,^不含空字符到行首。
G移到到整个页面的最后一行的第一个非空字符。
gg移到整个页面的第一行的第一个非空字符。
w和e一般对英文作用比较好,并且大写的W E会忽略标点符号。
数字+| 移动光标所在行的第N个字符,一个汉字代表2个字符。
数字+G 移动到第N行,第一个非空字符。
{}移动到上一个或下一个段落,以空白行为划分。
()移动到上一个或下一个句子,以英文的?!等为划分,不常用。
%用来匹配括号的另一半,但只支持英文的括号。
CTRL+O 临时进入插入常态模式,即正在插入时,突然需要输入一条命令,命令执行后又回到插入模式。
J 连接此行与下一行。
A 与 I 及 a与 i,大写I在行首插入文字,大写A在行尾插入文字。
大写的O在上面插入一行,小写的O在下面插入一行。
大写X删除光标前的字符。
d0 dd等同于D
dG 删除至文章的尾部,如定位光标在第5行,则删除第5行及其后的所有内容。
d1G 删除光标所在行,及其前面的所有内容。等同于dgg
大写R进入替换模式,可以从光标处一直改到按ESC.小写替换一个字符。
大写C等同于c$替换至行尾,但输入后直接进入插入模式。
cc取代整行,也可以用大写的S。
cw只适用于英文,替换一个单字。
~ 替换大小写
s与r类似,但会直接删除字符进入插入模式。

数字+大写G 光标移动到第N行
例子:5r我 把光标所在后的4个加上光标处1个字符共5个替换为 我。
3i我 ,在光标前插入3个我,但是要按esc后才出现效果。
3dd 删除光标以下含光标处共3行。
3x删除3个字符。
这些命令最好都是把 数字放在前面。

shiftwidth 缩写 sw 可能通过 :set sw=4 让
>> 命令使整行向右移动4个字,有汉字的缩进效果哦,合令刚好相反。
textwidth 缩写为tw ,可以:set td=100,也就是每行有100个字符,它对排版,文字居中,居左,居右有作用。
:ce :ri :le

gq为重排命令,可将段落或行重新排成一块。
gqap为整段重排。gq+数字+q ,可以重排几行。
非整行复制时,若粘贴,则在行或段尾加入。整行时,P(大写)表示之上一行,小写p为在下一行粘贴。
yG复制到档尾,y1G复制到档首。y0 y$ 2yy 复制2行,y2w 复制两个字符(汉字也是复制两个)

"a 这个就表示缓冲区a ,小写时在缓冲区a 中写内容,大写时,在原有缓冲区内容的基础上增加内容。 如 "ayy 就是复制一行放到缓冲区a中。

英文.(句号)表示重做,如删除一行后,再用6. 表示再向上重新删除6行。

/搜索,向下 ?搜索向上。 *匹配光标处的文字,搜索向下。g*部分匹配光标处文字,向下。#向上与*反,g#向上与g*反。n继续寻找,N反向继续寻找。

替换 :范围 /被替换的内容/ 换成什么/ 选项 c confirm 每次替换都询问,e error 显示错误信息 g globe 整行替换(否则只替换每行的第一外)i ignore 忽略大小写。如
:1,s/lookfor/xfuture/glookforxfuture,lookfor效果一样。小写s代表替换。

mx来标记书签,x为书签位置,可以用26个小写字母来表示,当按下`x 回到标签所在位置,'x 回到标签所在行的行首。 ` 是TAB键上方的那个,后一个'为单引号。如果设置和引用书签时用大写,如`A,则可以在不同的文件之间切换,牛B啊!

阿拉伯数字的书签目录是系统自己记的,`0代表回到前一次编辑文件中离开时的最后位置 `1代表回到前两次编辑文件中离开时的最后位置 ,含0可以记10个文件。无论是何时,达到mark处,想回到原来的位置(文件),可使用ctrl+o.
:marks 获取当前的书签列表。

打开文档,若是gvim就用 :gvim+文件名,若是vim就用 :vim +文件名

*跳到与光标处一样的单词。
%匹配括号等。
w 下一个单词的词头,e 下一个单词的词尾。小写e,w 以空格划分单词,大写真正的区分单词。
^ 跳到本行的第一个非空,而0含有空哦。
g_跳到本行的第一个非空,而含有空哦。 fa 跳到当前行的a字母出现的下一个位置,f很好用哦。 3fa→ 在这行中查找a出现的第三个位置. f和t对应t为向前查。这样就推导出一个命令  dfa删除从当前光标到下一个字母a。 :e#等同于ctrl+^可以让两个打开的文件相互切换。 多文件切换编辑时的一个主要区别:如果是一次打开多个文件,叫argument list ,如果是在编辑一个文件时,又打开了其它的文件,这时这些文件叫做:bufferlist.  而多个文件切换时的命令:  :n  :N 后一个,前一个文档,只适用于argument list. :bn :bp 则适用于 bufferlist. :bl 编辑 bufferlist中的最后一个文件。 :b+文件名或编号,可以打开对应的文件。:ls可以显示文件的列表,看到编号和文件名。 在列表符号中:#代表前一次编辑的档案,%代表当前编辑的档案。+表示该文件已经修改过,-号表示bufferlist 中的文件尚未载入。  :e!放弃一切修改,重新载入这个文件,就像刚打开时那样。 :f 或 ctrl+g 会显示当前文件的名称,是否修改过,以及当前光标的位置。 :f +文件名,可以重命名当前文件。  :q! 舍弃修改,强制退出 :x 等同于 ZZ  存档后离开 ,注意区别若无修改则直接关闭,而:wq 即使无修改,退出直前也会再写入一次。 :w + 档名,另存他档,保存另一个文件。 :qa! 强迫中止当前正在进行的动作,而去执行下达的命令。 :set noswf 关掉VIM自动保存的那个紧急回复的文件。.文件名.swp 一般是隐藏的,并且没有密码功能。 :X 大写X会提示输入密码,给文件加密。 :recover +档名 紧急恢复。   :r + 文件名,可以在光标位置插入 这个文件的内容,好强大,有木有。 :35r + 文件名,将文件插入到第36行之后。 标示指令:有三种模式,字符,行,块。分别使用小字v 大写V ,CTRL+v(小写) windows下ctrl+v 是粘贴键,所以用ctrl+q 来进入其中。 可视化块会以列来标示选中,还记得列表只要标题吗,这样就很好用呢!在这个模式下,选中内容后,可以用shift+> 来将内容右移一个TAB位置。相反的符号则相反。  ctrl+w n(是字母,不是数字,可以将视窗上下一分为二),ctrl+w s 将原视窗一分为二,但第二个里的内容仍是第一个里的,即复制一个视窗。ctrl+w q 关闭视窗。 ctrl+w j   ctrl+w k 移至下一个或上一个视窗。 :sp + 文件名,可以新开一个视窗来编辑文件或新建 一个文件来编辑。 Ctrl+w o 使当前视窗成为唯一编辑的视窗,其它的隐藏掉。 @: 這是 Vim 的一個很特殊的指令,可以重複前一次的冒號命令。 :sh(ell) 執行 shell。使用 exit 回到 vim。 按下:后,可以使用上下左右键来找寻之前用过的:命令。 大寫 K 會顯示游標所在處之 word 的 man page 系統線上使用手冊。 :r !commond 這個就妙了!會在游標所在處次一行插入外部指令 commond 執行後的輸出內容。例如 :r !date 就會插入日期時間。       :h name 這樣就會叫出 name 這個說明檔,如果後面沒接 name, 則會叫出 help.txt :ver 會顯示版本  几个配置:autoindent[ai]   autowrite[aw] background[bg] backup[bk] writebackup[wb] backupdir[bdir]  browsedir[bsdir]就是菜单项 文件/打开 会弹出的文件浏览选择窗口。cindent[cin] 更适合C语言的缩进。 cmdheight[ch]状态栏的行数,建议设为2行。 compatible[cp]设为和VI兼容,但这样的话 VIM的扩展功能会受抑制。默认为OFF.  confirm[cf]各种确认动作,预设为OFF. directory[dir]swap档存放的目录。 ignorecase[ic]寻找时不分大小写,会对中文造成困扰。预设为off. incsearch[is]加强式搜索,在输入patern时就在文件内移对光标找对应的patern. hlsearch[hls]符合字串时,会反白表示,预设为OFF. textwidth[tw]一种折行功能,规定了可以一行有多宽,以放多少字节为单位。 wrapmargin[wm]与tw类似,只是宽度是从视窗右边向左边算起。 wrap假折行,只在屏幕显示,并未插入eof. wrapscan[ws]预设已开,就是在搜索时若到尾部了,可以从头开始再找。循环。 ruler[ru]在屏幕右下角显示,游标在文档中的位置,如底部,顶部或百分比。 statusline 修改状态列显示的格式。 shiftwidth[sw]设定〉〉移动的多少,可以用作缩进也行。 tabstop[ts]预设为8个字符的宽,为一个tab键的宽度。 showcmd[sc]在状态列显示目前所执行的指令及未未完成的指令片段。 showmde[smd]显示当前的模式,在载入文件时,会在这个地方显示文件名及其总行数,总字数。 visualbell 以屏幕闪动代替beep声。 list 也是一种模式,这样会让TAB的地方以^I的显示,行尾以的EOL显示成
:set nolist 也就是nooption 可以取消设置。
swapfile[swf]是否需swap至磁碟。
:history[hi]记录所用过的:后的命令频数,默认为20步。
在.vimrc文件里 "是注释的标志,其后内容不起作用。
* 指前所綁住的字元或字元集合,出現 0 次或 0 次以上。
\+ 和 * 作用相同,但不包括出現 0 次。
\= 指前所綁住的字元恰好出現 0 或 1 次。
\| 這是多選,就是 or 的意思,被 \| 隔開的 pattern,任一個符合的話就算符合。
以下是中括号的用法,表示一个范围。
[...] 字元集合,表示中括號中所有字元中的其中一個。
[?..] 這是上述 [. . . ] 的補集,表非中括號內字元的其中一個。
. 除換行字元外的任一單一字元。
? 匹配行首,指其後綁住的字串,出現在行首才符合。
匹配行尾,指其前綁住的字串,出現在行尾才符合。含換行字元。 \< 匹配字(word)首。所謂 word 包括文數字及底線。 \> 匹配字尾。這就是前所提及的限定用法 \{n,m} 指前所綁住的字元或字元集合最少出現 n 次,最多出現 m 次。n就是最小值, m是最大值。{}中若只有一个数字,则表示出现这个限定的次数。 中介字元,用来简化正则表达式的写法,如下: \s 表空白字元,即 Space 或 Tab。 \S 表非空白字元。 \d 表數目字(digits),即 [0–9]。 \D 表非數目字,即 [^0–9]。 \w 表一般字元(word character),包括底線。即 [0–9a–zA–Z_]。 \W 表非一般字元,即 [^0–9a–zA–Z_]。 \a 表英文字母(alphabetic character),即 [a–zA–Z]。 \A 表非英文字母,即 [^a–zA–Z]。 \l 表小寫字母(lowercase character),即 [a–z]。 \L 表非小寫字母,即 [^a–z]。 \u 表大寫字母(uppercase),即 [A–Z]。 \U 表非大寫字母,即 [^A–Z]。 :g/^\s*/d  删除空白行的意思。
:%s/^\d\d\d\d\d\d\d\d\d\>/ID:&/g  其中&代表要搜索的符合条件的内容。
\U 在 pattern 的位置的時候是指非大寫字
母的樣式,即 [?A–Z],但如果是在置換字串位置的時候是指將其後的字串通通改成大寫。
折叠:可以在可视模式下,选中行或块,然后用zf来折叠

demos

refs

https://github.com/xgqfrms/linux-shell-script-programming/issues/6

https://www.lanqiao.cn/courses/2/learning/?id=16

https://www.imooc.com/learn/1049

https://www.imooc.com/learn/1129



©xgqfrms 2012-2025

www.cnblogs.com/xgqfrms 发布文章使用:只允许注册用户才可以访问!

原创文章,版权所有©️xgqfrms, 禁止转载 🈲️,侵权必究⚠️!


posted @   xgqfrms  阅读(92)  评论(8编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示