点击上方“C语言与CPP编程”,选择“关注/置顶/星标公众号”; W- q5 s0 _1 }* p" {7 P: E
干货福利,第一时间送达!
) s4 A" v) t x$ ?. K" N4 Y. U' j* A1 r4 X! v7 P
wohtyxuwgc064076725426.png
9 V) y9 [6 ]; I* }6 T* T
最近有小伙伴说没有收到当天的文章推送,这是因为微信改了推送机制,有一部分小伙伴刷不到当天的文章,一些比较实用的知识和信息,错过了就是错过了,建议大家加个星标??,就能第一时间收到推送。
. E2 K' p# g, V
hd3jhd0udyp64076725526.png
. M0 Z* w( m6 S. [
6 S) B; [4 N) S2 R. O6 `5 w1 J0 Qvim 是一个很好用的编辑器,应用十分广泛。但关于 vim,总有一些你不知道的事情,我们需要持续不断的学习。
, n \ _4 Q6 [5 M: T我经常使用 vim,也经常在各大社区、论坛看到 vim 专家用户分享经验,今天我们就总结其中常用的一部分,分享给大家。
- }) M5 p7 m* {1 }) K* i1 X1,使用内置帮助(built-in help)+ S, i$ W1 M( n( c- F1 U- h
使用 vim 的内置帮助是一个好习惯(虽然很多朋友更喜欢在网上搜索相关的使用方法)。查看帮助的语法如下表格所示:' I& t F& G5 Q
前缀
3 p6 @3 g" A0 x0 j+ C& ?7 Z | 例子( t0 p' W( _$ a2 ^3 f- m# K
| 说明
4 \# U k' O3 g. _8 p | :- t0 j# n: N9 Q% R" d* e9 L
| :help :w | 有关 :w 命令的帮助
, @( H* l: ^- s* J3 w6 s | none- x: f2 j7 e6 y- o5 P) `
| :help j | 有关“j”键在正常模式上下文中的帮助 | v_+ s+ z1 c$ ]. ~0 K2 X; ^
| :help v_J | 有关在上下文中使用“J”键到视觉模式的帮助 | i_3 j# v1 M; ?% T" l% Q
| :help i_ | 有关在上下文中使用“Esc”键插入模式的帮助 | /
. q* `+ g" M# t* w& F9 T | :help /8 _4 x7 B; o z [5 H
| 有关搜索模式“
6 {2 E4 B; N% y: ~5 f”的帮助 | 2,以普通用户身份打开,以 root 用户身份保存* m% ^. w' f) Q+ ?8 J
在编辑系统文件或者受权限保护的文件的时候,很容易会忘记在 vim 编辑之前添加 sudo,这样将会以只读模式打开文件,也就是编辑后不能保存。" z. b4 V$ ]. D+ Z0 A. M
但是这时候,你可能已经对文件做了一些修改(尚未保存),很显然,强制退出不是一个好选择。% m4 |; Y! I1 i* h
dnvjz1rwarz64076725627.png
1 h8 U+ u* Y1 L. z8 J
在这些情况下,在 vim 中键入以下命令::w !sudo tee %键入此命令后,将要求您输入sudo命令的密码,然后文件就可以保存了。. T/ W# T6 h: f/ K) l! \
注:我们应该使用 sudoedit 命令而不是 sudo vim 来编辑需要超级用户权限的文件。8 R: W% r+ G7 K' _
我们将上述命令拆解来看下::w - 这是写入命令。由于没有给出参数,vim 将把整个文件写入标准输出;
5 r5 M5 \* F& ~: p$ \!sudo - 将 sudo 命令作为 shell 命令而不是 vim 命令运行;tee - tee命令用于读取标准输入并将其写入标准输出或文件;/ C5 h1 n5 N. ], b& k5 M
% - vim 将其替换为您正在编辑的当前文件的名称。
3 O q- |& u! D! n, O5 g: @:w 命令将整个文件写入 STDOUT(标准输出);然后,我们使用sudo命令(因为我们编辑的毕竟是一个系统文件)来获得临时权限。 E5 z: c* G- m( ~0 p
百分号(%)表示文件名,tee 命令从 STDOUT 获取 vim 的输出并将其写入 % 文件。 x7 p+ ]+ f7 I6 m
这基本上适用于 | sudo tee /etc/ssh/sshd_config,有点复杂...
/ }: Y+ s4 m+ B6 K; w6 X# t3,将所有空格转为制表符(或者反过来)
1 |2 K- \" z0 Q' s& g' q我们都喜欢使用制表符(tab)或者空格,但是,如果我们正在编辑的文本其缩进使用的符号正好与我们的习惯相反,该怎么办?6 K$ b, z ^4 _) x' X$ v/ `
3.1 将所有空格转换为制表符
* p) y# y( U- S* m1 k4 P如果当前文件使用空格缩进文本,希望将它们转换为制表符时,需要运行如下两个 vim 命令:/ z+ n* Q$ S% q" ? r
:set noexpandtab:retab!这样做会将所有空格转换为其等效的制表符。如果文档使用两个空格作为缩进宽度,它们将转换为1个制表符。如果 4 个空格用作单个缩进宽度时,这 4 个制表位将替换为 1 个制表字符。3.2 将所有制表符转换为空格- W+ \! L" I2 x/ Z2 O1 h' z) s
如果要编辑的文件使用制表符缩进,并且要将制表符转换为空格,则需要运行如下4个 vim 命令:5 U: T" n6 j7 p
:set expandtab:set tabstop=4:set shiftwidth=4:retab第一个命令(expandtab)告诉 vim 使用空格展开 tab,第二个命令(tabstop)设置使用多少个空格用作一个“缩进块”。在我们的例子中,我们定义了“1个tab=4个空格”;当使用>>运算符时,shiftwidth 命令用于控制缩进,这也被设置为4个空格。0 J6 `, r$ A8 Q; {1 F
最后,retab 命令将所有制表符(用于缩进)转换为空格。
$ D: ~# G0 F/ o4,缩进所有行2 _4 q9 k4 u" N/ K6 J# W9 L5 [
错误的缩进,在 python 或者 YAML 程序中会报错,导致程序不能正确运行。
5 c% C/ e0 @6 e5 n% k/ u( F要缩进所有行,按 gg 键到达文件顶部,然后按 = 键表示“缩进”,最后按 G 键表示到“最后一行”。
! j, h m- V! S2 @/ p/ t5 P) }; r这样将会自动缩进,从第一行到最后一行。 V: P- f& K0 D7 A& |/ `7 j$ g) o
如下图所示,我使用 :gg=G命令缩进的演示:
* _7 G# m- E D5 O7 \# [
wuzd12m54au64076725727.gif
0 z3 B' ]7 U+ {' C6 g! S4 ~6 Y正如你所看到的(从这个有限的预览中),所有行都正确缩进。
8 `2 w: H) `: W3 r! l5,粘贴代码时保留缩进( J' q0 L3 M3 ]7 g. {. H' o2 y
我们都有过在互联网上复制代码的时候。当将代码粘贴到文件中时,缩进都给弄乱了,这时候需要怎样做呢?% q7 r ]7 V% H& ~4 \0 _! @5 S
为了避免这种情况,请在 .vimrc 文件中添加以下代码:. u1 p' G: ?+ f7 f7 a) G; O
set pastetoggle=F2>?& |, Y9 z+ C }( b/ O
对 vimrc 文件进行如上更改后,在粘贴代码之前按 F2 键,这样做将确保代码粘贴正确的缩进。6,以正确的缩进深度开始书写
( [& y$ e! ?% y假设光标在第一行第一列,但是所要写的内容需要缩进,那在不按下制表符(tab)和空格键的情况下,应该怎样做呢?& b; q9 ^- g0 u. M3 s
答案是在正常模式下按下 S 键。
9 r( G# ^& q" p0 O, s( e: B当光标位于行的第一列时,按 Esc 键进入正常模式。然后按 S(大写)键,这会将光标移动到适当的缩进深度,并自动进入“插入”模式,以便开始键入。9 n% S1 q& L3 m
i5suelqfvw164076725828.png
3 Z# \6 p4 M: T& U上图,我的光标位于第一列,通过按S键,光标移动到正确的缩进深度,Vim从正常模式切换到插入模式。
1 M! s5 ~7 D$ q/ Z7,保存文件前显示差异2 ^; \& N1 X [7 a
我们可能遇到过这样的情况:我修改了这个文件,但是忘记都做了哪些修改了,并且我担心其中有些地方可能修改错了。
D& n2 G" w% i# @2 S解决此问题的方法是查看缓冲区和文件之间的差异。可在 vim 中执行如下命令:( J: v3 v7 \1 H4 q1 P" k V( l
:w !diff % -我们将上述命令拆解来看:2 W7 x3 k5 Y! v& Z& J( p
:w 用于保存/写入,在这个特定场景中,如果命令中没有指定文件名,则输出将写入STDIN(标准输入)文件;
, D3 O$ N4 [. U4 X- _1 C) x:! 是执行 shell 命令的语法,在这个例子中,我们在 shell 中运行 diff 命令;$ Y0 ~. T- x5 {: a( U/ T% m
% 表示未修改的当前文件的名称;试试这个::!echo %' t' t9 e! ~$ E6 Y0 f' O
- 是 diff 命令的 STDIN 文件。0 |* o Y4 _" ?4 X
因此,该命令首先将所有[未保存]内容写入STDIN文件。然后diff命令读取当前文件(%)并将其与STDIN(-)文件进行比较。
% A$ s. u) ^+ `8 m, q/ V" O$ V7 d$ l这个命令大致等同于这个shell命令:diff 0 p- f- Q8 D3 W
8,显示拼写错误5 f( Z& b% C) `9 D! `4 v
我们应该都使用过 Microsoft word,其拼写检查器在拼写错误的单词下会有一条红色的波浪线。
) @& z% g# [, \4 @vim 也内置了拼写检查器,但默认情况下是关闭的。我们可以使用如下命令启用它:
& `! z$ s" o+ y- l& x# U:set spell这样,你可能会看到拼写错误的单词被突出显示,其突出显示的方式取决于你的 vim 颜色方案。我在拼写错误的单词下面有一条白色下划线,如下图所示:
* U* a& ] P6 y0 V) N( u
pf2zh4an32h64076725928.png
1 }. }( D- ]/ s+ B s! [
要将这设置为 vim 的默认,可在 .vimrc 文件中添加如下配置:
* Z$ x( u6 `- o% ^# Cset spell9,显示行号与许多 vim 用户一样,你可能喜欢在 vim 中显示行号。
- D( }, J+ d! `+ A2 _有两种方法可以显示行号。一种是绝对行编号,在这种情况下,每行显示绝对行号,就像任何其他代码编辑器或IDE一样。% n" s: d+ y9 W$ e5 |6 G1 o
第二种是相对行号。在这种情况下,当前行的行号为0,其他行的行号为相比于光标所在行的相对数字。 a% J2 l; ?9 E8 Y3 n0 k0 b
这两种情况,也并不是只能选择一个,事实上,可以两种都要。
5 i* P5 d4 t p' J8 a# `通过在 .vimrc 中添加以下行,可以在 vim 中启用“混合行编号”:9 X8 J: W8 Y. m0 }- r5 Z
set number relativenumber这将在光标所在行显示绝对行号,在其他行显示相对行号。如下图所示:. ^/ W. R6 M, u4 y4 m
02a0a5nfwum64076726029.png
5 C% n2 n& R. e; O" U( t5 \
当前光标位于第44行,因此该行显示绝对行号;其他行(光标上方和下方的行)显示相对行号。
% m7 t# o V, s10,使用 vim 打开文件的同时将光标定位在某一行
2 c) h1 b" N% _2 F默认情况下,我们使用 vim 打开文件,光标总会在第一行。在某些时候,我们希望光标能够定位在我们指定的某一行,而不是第一行。# N$ ~/ B8 e! W3 f
可以通过使用 +n(n为行号)选项来实现这一点,当然前提是你需要知道打开的文件总行数应大于或等于 n,如下:& W, @# K' l! O; w1 }1 m5 M
vim +n file-name>11,使用可读的配色方案当谈到使用配色方案时,人们通常会选择他们觉得最吸引人或最美观的配色方案。但是,当你作为一个代码编辑器兼 IDE 的 vim 时,最好放弃一些引人注目的东西,转而使用具有更好视觉指导的配色方案。2 u/ `0 E) f }% e, b+ J
一个好的配色方案看起来很好,但是一个优秀的配色可以帮助你在颜色的帮助下轻松识别关键词、变量和其他标识符。
1 x8 S' @, z7 ~7 g/ X# P" h当然,每个人的喜好是不同的,配色当然也是不同的。我们在下图中贴出几个大家都觉得顺眼的方案,可以作为参考:
9 f- _& z& I0 l8 I6 G c" j
fl3xxlid3sg64076726129.png
/ \0 A- [/ Q/ z5 M5 E7 H' z& A D
- L7 K+ I1 X: S" C5 f
bnsth42ygwu64076726229.png
: l' }$ H1 `3 J/ Y# A ~4 o
" N; i$ G3 a1 T6 k
vzla1crgfie64076726329.png
# p/ `3 I9 q% T1 |: o* w
12,在插入模式下删除文本
4 U" ^7 c h: [7 h7 @. H6 D& A我们都知道,在正常模式(normal mode)下,可以使用 d 和 x 键删除文本,那么在插入模式下如何执行相同的操作(比如 dd)呢?' v O; q/ u/ v, @# u. |3 w) O
以下是常用的一些方案:ctrl + w 删除前一个单词(字)(相当于正常模式下的 db);
|) p9 a% y: M& W+ Wctrl + h 删除前一个字符;! ?( _* b# Q7 k( C0 C" q) ^
ctrl + u 删除当前行所有前面的字符(相当于正常模式下的 d0 );
' I/ u6 @, l% f8 S9 wctrl + k 删除当前行中所有主要字符(相当于正常模式下的 d$)。3 n8 f4 U$ ~, X2 u
来源:https://mp.weixin.qq.com/s/9hJLmv_J7UpSi_mYeGrvrQ
1 x/ B( R X4 K! E$ W: b——EOF——一个我十分佩服的朋友阿秀开发了一个互联网大厂面试真题记录网站,支持按照行业、公司、岗位、科目、考察时间等查看面试真题,有意者欢迎扫码下方二维码适用~
9 i. t) n3 h, `: E2 k& n% W3 F
vg1uaii0y4i64076726429.png
1 K) y, ^9 i' m- _& }: w7 z
, g5 E4 \5 ^6 M' t! l你好,我是飞宇,本硕均于某中流985 CS就读,先后于百度搜索以及字节跳动电商等部门担任Linux C/C++后端研发工程师。1 `$ X3 q& U( K8 ]1 y! r
同时,我也是知乎博主@韩飞宇,日常分享C/C++、计算机学习经验、工作体会,欢迎点击此处查看我以前的学习笔记&经验&分享的资源。
) G- n, Z. }* A我组建了一些社群一起交流,群里有大牛也有小白,如果你有意可以一起进群交流。& A% g) U3 k' n4 y
drsdwcrxdjt64076726530.png
4 O3 y/ H3 t5 b
欢迎你添加我的微信,我拉你进技术交流群。此外,我也会经常在微信上分享一些计算机学习经验以及工作体验,还有一些内推机会。6 j( o3 c9 j( U, G1 J* U/ ~' O5 Q. E* A
3 w8 t; g" ^' c/ h
kns5ltcbatv64076726630.png
. Y3 B4 k- k$ o2 K3 X" H* ]
加个微信,打开另一扇窗
- g; J& y' z9 h% \4 l9 I5 e
bp1glnciyhc64076726730.gif
|