色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Linux下Vim編輯器的使用技巧

馬哥Linux運維 ? 來源:博客園 ? 2025-04-01 17:36 ? 次閱讀

【Vim】常用總結?

簡介?

24beea82-0d60-11f0-9310-92fbcf53809c.pngimage

什么是vim??

Linux下兩大編輯神器之一 vim

? Linux/Unix下使用最多的編輯器

? vi的改進版

? 可能是最難上手的編輯器之一

為什么要學習vim??

都21世紀了,為什么還需要學習vim?

? 只要你用服務器,vim就是個必備技能

? 后端和運維工程師必須掌握的編輯器,不然服務器上操作很尷尬

? 可以純鍵盤編輯,提升編輯效率

初識vim?

據說Stackoverflow幫助過上百萬開發者退出過vim!

1. 輸入vim命令進入vim

2. 進去之后似乎沒法輸入東西,起始默認進去是normal模式

3. 使用:q可以退出vim

開始編輯?

進入編輯模式就可以像其他編輯器一樣編輯了

? 使用i(insert)進入編輯模式,開始輸入文字

?i表示(insert),a(append),o(open a line below)

? 使用Esc可以退出編輯模式,又回到normal模式。

? 使用:wq保存退出

w(write),q(quit)

insert -> normal:使用Esc

normal -> insert:(小寫是操作字符大寫是操作

?i:(insert)表示進入insert編輯模式后,在當前字符的前面插入

insert

?a:(append)表示進入insert編輯模式后,在當前字符后附加插入

append

?o:(open a line below)表示進入insert編輯模式后,在當前行下新啟一行插入

open a line below

?I:(insert before line)表示在當前行的最前面插入

insert before line

?A:(append after line)表示在當前行的最后附加插入

append after line

?O:(open a line above)表示在當前行上新啟一行插入

append a line above

保存:

?:w:(write)寫入,保存

write

?:q:(quit)退出

quit

?:wq:(write and quit)保存并退出

write and quit

vim,為什么你有這么多模式?

怪異的vim模式?

vim和其他很多編輯器的區別在于多種模式

? 進入vim默認是normal(普通)模式?為什么不是編輯模式呢?

? 使用a(append)、i(insert)等進入編輯模式

? 還有cmd命令模式和v(visual)可視化模式

為什么進入vim不能插入-normal模式?

奇怪的是,為什么vim進入之后不像其他編輯器一樣直接插入?

? 進入Vim默認是normal(普通)模式。使用Esc從插入回到普通模式

? 普通模式下可以進行各種命令操作和移動

? 大部分情況下你是在瀏覽而不是編輯,所以Vim默認是normal

Insert(插入)模式?

插入模式下Vim可以直接編輯,和其他編輯器一樣

? 使用i(insert) 、a(append) 、o(open a line below)進入插入模式

? 使用Esc退出插入模式到normal模式

Command(命令)模式?

Normal模式下輸入:之后執行命令,比如保存退出:wq一氣呵成

? 顧名思義,執行Vim命令,比如保存:w,退出:q

? 比如分屏::vs(vertical split),:sp(split)

? 比如使用::% s/foo/bar/g全局替換

%:表示本文件全部文本
g:表示全局替換

Visual(可視)模式?

Visual模式一般用來塊狀選擇文本(類比使用Alt+鼠標拖動)

? Normal模式下使用v進入visual選擇

? 使用V選擇行

? 使用ctrl+v進行方塊選擇

vim編輯小技巧?

如何快速糾錯(insert模式下)?

代碼就像人生,總是經常出錯,需要我們快速修正

? 進入Vim之后首先使用a/i/o之一進入插入模式

?ctrl+h刪除上一個字符,ctrl+w刪除上一個單詞,ctrl+u刪除當前行

快速切換insert和normal模式?

很多鍵盤的鍵位設置,Esc按起來不方便,不方便切換到normal

? 使用Ctrl+c代替Esc(但是可能會中斷某些插件)或者ctrl+[

?gi快速跳轉到你最后一次編輯的地方并進入插入模式

? 在配置章節我們會講解如何映射方便的快捷鍵來替代Esc

vim快速移動大法?

↓CloseCode↓

h          # 光標左移,同  方向鍵
j          # 光標下移,同  方向鍵
k          # 光標上移,同  方向鍵
l          # 光標右移,同  方向鍵
Ctrl+e       # 向上滾動一行
Ctrl+y       # 向下滾動一行
Ctrl+u       # 向上滾動半屏 --> Move up 1/2 a screen
Ctrl+d       # 向下滾動半屏 --> Move down 1/2 a screen
Ctrl+f       # 向下滾動一屏 --> Move forward one full screen
Ctrl+b       # 向上滾動一屏 --> Move back one full screen
0          # 跳到行首,數字 0,效用等同于  鍵
^          # 跳到從行首開始第一個非空白字符
$          # 跳到行尾,效用等同于  鍵
gg         # 跳到第一行,效用等同于 Ctrl+
G          # 跳到最后一行,效用等同于 Ctrl+
NG         # 跳到第 N 行,比如 10G 是移動到第 10 行
:N         # 跳到第 N 行,比如 :10 是移動到第 10 行
10%         # 移動到文件 10% 處
N|         # 移動到當前行的 N 列
w          # 跳到下一個單詞開頭(word:標點或空格分隔的單詞)
W          # 跳到下一個單詞開頭(Word:空格分隔的單詞)
e          # 跳到下一個單詞尾部(word:標點或空格分隔的單詞)
E          # 跳到下一個單詞尾部(Word:空格分隔的單詞)
b          # 跳到上一個單詞開頭(word:標點或空格分隔的單詞)
B          # 跳到上一個單詞開頭(Word:空格分隔的單詞)
ge         # 跳到前一個單詞結尾
)          # 向前移動一個句子(句號分隔)
(          # 向后移動一個句子(句號分隔)
}          # 向前移動一個段落(空行分隔)
{          # 向后移動一個段落(空行分隔)
       # 移動到下一行首個非空字符
N      # 光標向下移動 N 行
+          # 移動到下一行首個非空字符(同回車鍵)
-          # 移動到上一行首個非空字符
H          # 移動到屏幕上部(H: High)
M          # 移動到屏幕中部(M: Middle)
L          # 移動到屏幕下部(L: Low)
      # 按住 Shift 按左鍵,向左移動一個單詞
      # 按住 Shift 按右鍵,向右移動一個單詞
       # 按住 Shift 按上鍵,向上翻頁
      # 按住 Shift 按下鍵,向下翻頁
gm         # 移動到的行中間
gj         # 光標向下移動一個屏幕行(忽略自動換行)
gk         # 光標向上移動一個屏幕行(忽略自動換行)
zz         # 調整光標所在行到屏幕中央
zt         # 調整光標所在行到屏幕上部
zb         # 調整光標所在行到屏幕下部

反人類的hjkl?

眾所周知,vim normal模式使用了反人類的hjkl來移動

? 據說編輯器作者在編寫vim的時候鍵盤還沒流行上下左右按鍵

?h(左) ,j(下) ,k(上) ,l(右) ,移動也不會讓手指脫離主鍵盤區

? 相信我,逼著自己使用hjkl一段時間之后,你會體會到它非常有效率

使用hjkl?

只需要幾天的適應,你就可以熟練使用hjkl來移動
24e3b75e-0d60-11f0-9310-92fbcf53809c.png

在單詞之間“飛舞”(normal模式下)?

在單詞之間移動是我們瀏覽操作中最常使用的命令

?w/W移到下一個word/WORD開頭。e/E下一個word/WORD尾

?b/B回到上一個word/WORD開頭,可以理解為backword

? word指的是以非空白符分割的單詞, WORD以空白符分割的單詞

行間搜索移動?

同一行快速移動的方式其實是搜索一個字符并且移動到該字符

? 使用f{char}可以移動到char字符上,t{char}移動到char的前一個字符

f:(find)
t:(until)

[引用]

? 如果第一次沒搜到,可以用分號(;)/逗號(,)繼續搜該行下一個/上一個

? 大寫的F{char}表示反過來搜前面的字符

vim水平移動?

如何快速移動到一行的行首或者行尾呢?

?0移動到行首第一個字符,^移動到第一個非空白字符

^:在正則表達式中,表示行的開頭

?$移動到行尾,g_移動到行尾非空白字符

$:在正則表達式中,表示行的結尾

? 記住常用的0和$就可以滿足日常需求了

Vim垂直移動?

我們還可以在句子(sentence)和段落(paragraph)間移動(不常用)

? 使用括號()在句子間移動,你可以用:help (來查看幫助

? 使用{}在段落之間移動

? 插件章節我們會講如何用easy-motion插件移動,這些命令就都不用記憶啦

Vim頁面移動?

翻頁命令太多, 2/8定律,記住常見的就能滿足需求

?gg/G移動到文件開頭和結尾,你可以使用ctrl+o快速返回

?nG移動到文件第n行,可以配合命令使用,如dnG表示刪除到第n行

?H/M/L跳轉到屏幕的開頭(Head),中間(Middle)和結尾(Lower)

?Ctrl+u,ctrl+f上下翻頁(upword/forward)。zz把屏幕置為中間

什么是vim的text object?

↓CloseCode↓

0          # 到行首,數字 0
^          # 到行首非空字符,可以使用 0w 代替 ^,按鍵更方便
$          # 到行尾
iw         # 整個單詞 Word(不包括分隔符)
aw         # 整個單詞 Word(包括分隔符)
iW         # 整個 Word(不包括分隔符)
aW         # 整個 Word(包括分隔符)
is         # 整個句子 (s: sentence)(不包括分隔符)
ib         # 小括號內(b: brackets)
ab         # 小括號內(包含小括號本身)
iB         # 大括號內
aB         # 大括號內(包含大括號本身)
i)         # 小括號內
a)         # 小括號內(包含小括號本身)
i]         # 中括號內
a]         # 中括號內(包含中括號本身)
i}         # 大括號內
a}         # 大括號內(包含大括號本身)
i'         # 單引號內
a'         # 單引號內(包含單引號本身)
i"         # 雙引號內
a"         # 雙引號內(包含雙引號本身)
2i)         # 往外兩層小括號內
2a)         # 往外兩層小括號內(包含小括號本身)
2f)         # 到第二個小括號處
2t)         # 到第二個小括號前

Text Object(文本對象)?

如果你學過主流的編程語言,一定知道面向對象編程

? Vim里文本也有對象的概念,比如一個單詞,一段句子,一個段落

? 很多其他編輯器經常只能操作單個字符來修改文本,比較低效

? 通過操作文本對象來修改要比只操作單個字符高效

文本對象:

? 單詞w(word)

? 句子s(sentence)

? 段落p(paragraph)

? 標簽t(tag)

? 小括號b(bracket)、大括號B

文本對象操作方式?

之前我們已經使用過文本對象了,回憶下dw(刪除一個單詞)

?[number] [text object]

? 或者 [number] [text object]

? number表示次數,command是命令,d(delete),c(change),y(yank)

? text object是要操作的文本對象

通過示例來學習?

?iw表示inner word,如果鍵入viw命令,那么首先v將進入選擇模式,然后iw將選中當前單詞。

?aw表示around word,它不但會選中當前單詞,還會包含當前單詞之后的空格。

以下實例中的**[]表示作用范圍**:

?iw
This is a[test]sentence.

?aw
This is a **[test ]**sentence.

?iw
This is a[...test...]sentence.

?aw
This is a **[...test... ]**sentence.

?is
...sentence.[This is a sentence.]This...

?as
...sentence. **[This is a sentence. ]**This...
End of previous paragraph.

?ip
[This is a paragraph. It has two sentences.]
The next.
End of previous paragraph.

?ap
[This is a paragraph. It has two sentences.

]The next.

?ip
[hello world]

?ap
[hello world]

?i(ori)
1*([2+3])

?a(ora)
1*[(2+3)]

?i
The <**[tag]**>

?a
The[]

?i{ori}
some{[code block]}

?a{ora}
some[{code block}]

?i[ori]
some [[code block]]

?a[ora]
some[[code block]]

?i"
The "[best]"

?a"
The["best"]

?i'
The '[best]'

?a'
The['best']

vim快速增刪改查命令?

數字+命令+對象表示多次執行命令,如2dw

或者命令+數字+對象,如d2w

Vim增加字符?

增加字符就是進入插入模式,開始敲鍵盤吧

? 進入插入模式編輯文本

? 使用a/i/o進入插入模式

? 還記得A/I/O是什么作用么?

↓CloseCode↓

i          # 在光標處進入插入模式
I          # 在行首進入插入模式
a          # 在光標后進入插入模式
A          # 在行尾進入插入模式
o          # 在下一行插入新行并進入插入模式
O          # 在上一行插入新行并進入插入模式
gi         # 進入到上一次插入模式的位置
        # 退出插入模式
Ctrl+[       # 退出插入模式,等價于 Esc 鍵

Vim快速刪除?

如何快速刪除一個字符或者單詞呢 ?

? Vim在normal模式下使用x快速刪除一個字符

? 使用d(delete)配合文本對象快速刪除一個單詞daw(delete around word)

dw:默認為daw

?d和x都可以搭配數字來執行多次

Vim快速修改?

相比刪除,更常用修改,一般是刪除之后改成我們期望的文本

? normal 模式下,常用有三個,r(replace),c(change),s(substitute)

? 使用r可以替換一個字符。

? 使用s替換并進入插入模式

? 使用c配合文本對象,我們可以快速進行修改整個文本對象。如ci"、ciw

↓CloseCode↓

r          # 替換當前字符
R          # 進入替換模式,直至 Esc 離開
s          # 替換字符(刪除光標處字符,并進入插入模式,前可接數量)
S          # 替換行(刪除當前行,并進入插入模式,前可接數量)
cc         # 改寫當前行(刪除當前行并進入插入模式),同 S
cw         # 改寫光標開始處的當前單詞
ciw         # 改寫光標所處的單詞
caw         # 改寫光標所處的單詞,并且包括前后空格(如果有的話)
c0         # 改寫到行首
c^         # 改寫到行首(第一個非零字符)
c$         # 改寫到行末
C          # 改寫到行尾(同 c$)
ci"         # 改寫雙引號中的內容
ci'         # 改寫單引號中的內容
cib         # 改寫小括號中的內容
cab         # 改寫小括號中的內容(包含小括號本身)
ci)         # 改寫小括號中的內容
ci]         # 改寫中括號中內容
ciB         # 改寫大括號中內容
caB         # 改寫大括號中的內容(包含大括號本身)
ci}         # 改寫大括號中內容
cit         # 改寫 XML tag 中的內容
cis         # 改寫當前句子
c2w         # 改寫下兩個單詞
ct(         # 改寫到小括號前
x          # 刪除當前字符,前面可以接數字,3x 代表刪除三個字符
X          # 向前刪除字符
dd         # 刪除(剪切)當前行,并把刪除的行存到剪貼板里 --> Delete (cut) a line
d0         # 刪除(剪切)到行首
d^         # 刪除(剪切)到行首(第一個非零字符)
d$         # 刪除(剪切)到行末
D          # 刪除(剪切)到行末(同 d$)
dw         # 刪除(剪切)當前單詞
diw         # 刪除(剪切)光標所處的單詞
daw         # 刪除(剪切)光標所處的單詞,并包含前后空格(如果有的話)
di"         # 刪除雙引號中的內容
di'         # 刪除單引號中的內容
dib         # 刪除小括號中的內容
di)         # 刪除小括號中的內容
dab         # 刪除小括號內的內容(包含小括號本身)
di]         # 刪除中括號中內容
diB         # 刪除大括號中內容
di}         # 刪除大括號中內容
daB         # 刪除大括號內的內容(包含大括號本身)
dit         # 刪除 XML 中 tag 中的內容
dis         # 刪除當前句子
d2w         # 刪除下兩個單詞
dt(         # 刪除到小括號前
dgg         # 刪除到文件頭部
dG         # 刪除到文件尾部
d}         # 刪除下一個段落
d{         # 刪除上一個段落
Nd         # 刪除從當前行開始的 N 行
:Nd         # 刪除第 N 行
:1,10d       # 刪除 1-10 行
J          # 將多行合并為一行
.          # 重復上一次操作
~          # 替換大小寫
g~iw        # 替換當前單詞的大小寫
gUiw        # 將單詞轉成大寫
guiw        # 將當前單詞轉成小寫
guu         # 全行轉為小寫
gUU         # 全行轉為大寫
<< ? ? ? ? ? ? ? ? ?# 減少縮進
>>         # 增加縮進
==         # 自動縮進。當前文件所有行自動縮進對齊:gg=G
Ctrl+A       # 增加數字
Ctrl+X       # 減少數字

Vim查詢?

查詢單詞也是一個常用操作

? 使用/或者?進行前向或者反向搜索

? 使用n/N跳轉到下一個或者上一個匹配

next

? 使用*或者#進行當前單詞的前向和后向匹配

*:在正則表達式中表示出現0次或多次。

↓CloseCode↓

/pattern      # 從光標處向文件尾搜索 pattern
?pattern      # 從光標處向文件頭搜索 pattern
n          # 向同一方向執行上一次搜索
N          # 向相反方向執行上一次搜索
%          # 匹配括號移動,包括 (),{},[]。結合以下兩個命令對程序員來說是相當強大(前提:需要把光標先移到括號上)
*          # 向下搜索光標所在的單詞
#          # 向前搜索光標所在的單詞
f       # 向后搜索當前行第一個為  的字符,2fv 可以找到第二個 v 字符
F       # 向前搜索當前行第一個為  的字符
t       # 向后搜索當前行第一個為  的字符前
T       # 向前搜索當前行第一個為  的字符前
;          # 重復上次的字符查找命令(f/t命令)
,          # 反轉方向查找上次的字符查找命令(f/t命令)
tx         # 搜索當前行到指定 字符串 之前
fx         # 搜索當前行到指定 字符串 之處

重復命令?

↓CloseCode↓

.          # 小數點,即重復(Dot)命令,重復執行上一次命令
N     # 重復某個命令 N 次,例如:10k,光標上移 10 行

命令行模式?

搜索命令(如何搜索替換)?

Vim替換命令?

substitute命令允許我們查找并且替換掉文本,并且支持正則式

:[range]s(substitute)/{pattern}/{string}/[flags]

?range:表示范圍。比如:10,20表示10-20行,%表示本文件中所有的行。

?pattern:是要替換的模式,正則表達式

?string:是替換后文本

**注意:**此命令不僅能用來替換,還能用來刪除!如 刪除所有星號*,命令為:%s/*//g

替換范圍range?

你可以在命令之前設置一個范圍。以下是一些方法:

?m, n:表示范圍為從第 m 行到第 n 行

?1,:表示范圍為從第 1 行到當前行

**注意:**第一行的行號是已知的,行號為 1;而最后一行的行號是未知的,所以我們只用給最后一行分配一個符號代表即可。

除了數字之外,還可以使用這些符號作為范圍:

?.:表示當前行,可以省略。如.,3表示當前行到第 3 行。

?$:表示文件中的最后一行。如3,$表示第 3 行到最后一行。

?+n:表示當前行的后 n 行。3,+1或者3,.+1,.可以用或不用,表示第 3 行到當前行后的 1 行。

?%:表示本文件中所有的行。

在 Vim 中,%通常表示整個文件。

示例:

?:1,5g/console/d匹配第 1 行和第 5 行之間的字符串"console"并刪除它們。

?:,5g/console/d如果逗號之前沒有地址,則從當前行開始。它在當前行和行 5 之間尋找字符串"console"并刪除它們。

?:3,g/console/d如果逗號后沒有地址,則以當前行結束。它尋找第 3 行和當前行之間的字符串"console"并刪除它們。

?:3g/console/d如果僅傳遞一個沒有逗號的地址,則它只執行第 3 行的命令。它查看第 3 行,如果字符串"console",它將刪除它。

替換模式pattern?

請參照正則表達式

替換標志位flag?

Flags有幾個常用的標志

? 默認為空,表示僅替換一行上的第一個匹配項

?g(global) 表示改變一行上的每個符合條件的匹配項,全局范圍內執行

global

?c(confirm)表示確認 ,可以確認或者拒絕修改

confirm

?n(number)報告匹配到的次數而不替換,可以用來查詢匹配次數

number::%s/xxx//gn可以查詢匹配次數

↓CloseCode↓

&  Reuse the flags from the previous substitute command. Must be passed as the first flag.
g  Replace all matches in the line.
c  Ask for substitution confirmation.
e  Prevent error message from displaying when substitution fails.
i  Perform case insensitive substitution
I  Perform case sensitive substitution

There are more flags that I do not list above. To read about all the flags, check out .:h s_flags

全局命令(如何對匹配行執行命令)?

global命令實際上是分成兩步執行:首先掃描[range]指定范圍內的所有行,給匹配{pattern}的行打上標記;然后依次對打有標記的行執行{command}命令,如果被標記的行在對之前匹配行的命令操作中被刪除、移動或合并,則其標記自動消失,而不對該行執行{command}命令。{command}可以是一個ex命令,也可以是用|分隔的多個ex命令,這樣我們就可以對被標記行,或從標記行尋址到的行進行多種不同的操作。

全局命令執行步驟:

1. 掃描[range]指定范圍內的所有行,給匹配{pattern}的行打上標記;

2. 依次對打有標記的行執行{command}命令,如果被標記的行在對之前匹配行的命令操作中被刪除、移動或合并,則其標記自動消失,而不對該行執行{command}命令。

全局命令(The Global Command)?

Vim 的全局命令用于同時在多行上運行命令行命令。

特別注意:全局命令是對匹配的,來進行行操作,操作對象是整個行,而不僅僅是匹配的那一部分字符。

全局命令具有以下語法:

?:[range]g(global)/{pattern}/{command}
該模式匹配包含該模式的所有行,類似于 substitute 命令中的模式。該命令可以是任何命令行命令。
全局命令的工作方式是對匹配pattern的每一行執行command命令。

反向全局命令?

要在不匹配的行上運行全局命令,可以運行:

?:[range]g(global)!/{pattern}/{command}

? 或:v/{pattern}/{command}

通過示例來學習?

如果你有下列表達式:

↓CloseCode↓

const one = 1;
console.log("one: ", one);

const two = 2;
console.log("two: ", two);

const three = 3;
console.log("three: ", three);

要刪除所有包含“控制臺”的行,您可以運行::g/console/d

結果:

↓CloseCode↓

const one = 1;

const two = 2;

const three = 3;

如果使用反向全局命令,則它將刪除所有不包含“console”的行

外部命令?

在Unix系統內部,您會發現許多小型的,超專業化命令,每個命令只做一件事(而且能很好地完成)。您可以將這些命令鏈接在一起以共同解決一個復雜的問題。如果可以從Vim內部使用這些命令,那不是很好嗎?

答案是肯定的!在本章中,您將學習如何擴展Vim以使其與外部命令無縫協作。

!命令?

Vim有一個!命令,可以執行三件事:

1.將外部命令的STDOUT讀入當前緩沖區。
2.將緩沖區的內容作為STDIN寫入外部命令。
3.從Vim內部執行外部命令。

讓我們一個個認真看一下。

將外部命令的標準輸出STDOUT讀入Vim?

將外部命令的STDOUT讀入當前緩沖區的語法為:

↓CloseCode↓

:r !{cmd}

:r是Vim的讀命令。如果不帶!使用它,則可以使用它來獲取文件的內容。如果當前目錄中有文件file1.txt,運行:

↓CloseCode↓

:r file1.txt

Vim會將file1.txt的內容放入當前緩沖區。

如果您運行的:r命令后面跟一個!和外部命令,則該命令的輸出將插入到當前緩沖區中。要獲取ls命令的結果,請運行:

↓CloseCode↓

:r !ls

它返回類似下列的文本:

↓CloseCode↓

file1.txt
file2.txt
file3.txt

您可以從curl命令讀取數據:

↓CloseCode↓

:r !curl -s 'https://jsonplaceholder.typicode.com/todos/1'

r命令也接受一個地址:

↓CloseCode↓

:10r !cat file1.txt

現在,將在第10行之后插入來自運行cat file.txt的STDOUT。

將緩沖區內容寫入外部命令?

:w命令除了保存文件,還可以用來將當前緩沖區中的文本作為作為STDIN傳遞給外部命令。語法為:

↓CloseCode↓

:w !cmd

如果您具有以下表達式:

↓CloseCode↓

console.log("Hello Vim");
console.log("Vim is awesome");

確保在計算機中安裝了node,然后運行:

↓CloseCode↓

:w !node

Vim將使用node執行Javascript表達式來打印"Hello Vim"和"Vim is awesome"。

當使用:w命令時,Vim使用當前緩沖區中的所有文本,與global命令類似(大多數命令行命令,如果不給它傳遞范圍,則僅對當前行執行該命令)。如果您通過:w來指定地址:

↓CloseCode↓

:2w !node

"Vim"只使用第二行中的文本到node解釋器中。

:w !node和:w! node形式上區別很小,但功能上相隔千里。使用:w !node,您是將當前緩沖區中的文本"寫入"到外部命令node中。用:w! node,則您將強制保存文件并將其命名為"node"。

執行外部命令?

您可以使用bang命令從Vim內部執行外部命令。語法為:

↓CloseCode↓

:!cmd

要以長格式查看當前目錄的內容,請運行:

↓CloseCode↓

:!ls -ls

要終止在PID 3456上運行的進程,可以運行:

↓CloseCode↓

:!kill -9 3456

您可以在不離開Vim的情況下運行任何外部命令,因此您可以專注于自己的任務。

編解碼?

【Linux】Shell命令相關英文縮寫含義

? md5

? xxd

? base64

Java的.class字節碼文件?

**注意:**無論是字節碼文件也好,二進制文件也罷,都不是給人類看的,編輯器逆向反編譯不出來是合理的。
可以使用md5來判斷是否為同一個文件

使用vim不方便看,可以下載jar下來丟到vscode里看

配合xxd查看并編輯二進制文件?

用vim打開 test.bin,vim 的 -b 選項是告訴 vim 打開的是一個二進制文件,不指定的話,會在后面加上 0x0a ,即一個換行符。

↓CloseCode↓

vim -b test.bin

在命令模式下鍵入::%!xxd

? 這里的冒號:是進入 Vim 的 command-line mode,跟一般的 Vim 指令相同,例如存檔(:w)等。

? 百分比符號%是指定 ex command-line ranges,代表整個文檔,也就是說將整個文檔內容都進行轉換。

? 感嘆號!是指定 filter commands,filter command 是一個可從標準輸入讀取資料,經過一些處理之后,輸出至標準輸出的外部指令,而這里我們使用 xxd 這一個打印 16 進制數據的命令作為 filter command。

如果 vim 后面沒有加 -b 選項就會出現可惡的 0x0a:
2538d7de-0d60-11f0-9310-92fbcf53809c.pngimage 如果有 -b 選項就不會有這種情況:
2545c660-0d60-11f0-9310-92fbcf53809c.pngimage

過濾文本?

如果給!范圍,則可用于過濾文本。假設您有:

↓CloseCode↓

hello vim
hello vim

讓我們使用tr(translate)命令將當前行大寫。運行:

↓CloseCode↓

:.!tr '[]' '[]'

結果:

↓CloseCode↓

HELLO VIM
hello vim

命令分解:

?.!在當前行執行filter命令。

?!tr '[]' '[]'調用tr外部命令將所有小寫字符替換為大寫字符。

必須傳遞范圍以運行外部命令作為過濾器。如果您嘗試在沒有.的情況下運行上述命令(:!tr '[]' '[]'),則會看到錯誤。

假設您需要使用awk命令刪除兩行的第二列:

↓CloseCode↓

:%!awk "{print $1}"

結果:

↓CloseCode↓

hello
hello

命令分解:

?:%!在所有行(%)上執行filter命令。

?awk "{print $1}"僅打印匹配項的第一列。

您可以使用管道運算符(|)鏈接多個命令,就像在終端中一樣。假設您有一個包含這些美味早餐的文件:

↓CloseCode↓

name price
chocolate pancake 10
buttermilk pancake 9
blueberry pancake 12

如果您需要根據價格對它們進行排序,并且僅以均勻的間距顯示菜單,則可以運行:

↓CloseCode↓

:%!awk 'NR > 1' | sort -nk 3 | column -t

結果:

↓CloseCode↓

buttermilk pancake 9
chocolate pancake 10
blueberry pancake 12

命令分解:

?:%!將過濾器應用于所有行(%)。

?awk 'NR > 1'僅從第二行開始顯示文本。

?|鏈接下一個命令。

?sort -nk 3使用列3(k 3)中的值對數字進行排序(n)。

?column -t以均勻的間距組織文本。

普通模式命令?

在普通模式下,Vim有一個過濾運算符(!)。如果您有以下問候:

↓CloseCode↓

hello vim
hola vim
bonjour vim
salve vim

要大寫當前行和下面的行,可以運行:

↓CloseCode↓

!jtr '[a-z]' '[A-Z]'

命令分解:

?!j運行常規命令過濾器運算符(!),目標是當前行及其下方的行。回想一下,因為它是普通模式運算符,所以適用語法規則"動詞+名詞"。

?tr '[a-z]' '[A-Z]'將小寫字母替換為大寫字母。

filter normal命令僅適用于至少一行以上的motion或至少一行以上的文本對象。如果您嘗試運行!iwtr'[az]''[AZ]'(在內部單詞上執行tr),您會發現它在整個行上都應用了tr命令,而不是光標所在的單詞。

vim如何編輯命令(如 粘貼一個命令)?

問題速成解決方式?

怎樣在vim的命令行中拷貝,粘貼?

在vim的普通模式下,輸入:進入命令行模式,我們可以在屏幕下方輸入我們想讓vim執行的命令。

有時候,我們需要在命令行中執行拷貝粘貼,例如 我們想要查找替換正文中的特殊字符,但我們又不知道怎么在命令行中輸入這個特殊字符。
查找還好說,不一定非要在命令行中輸入這個特殊字符,只要把光標放在這個特殊字符上,按*向下查找,按#向上查找。
但是如果我們要替換這個特殊字符,就必須在命令行中輸入它了,但是又不知道怎么輸入這個特殊字符,怎么辦?
答案是拷貝粘貼,先在正文中復制這個字符,然后粘貼在命令行中。

可是怎么在命令行中實現粘貼呢?別急,介紹一個好東西:命令行窗口。
在正常模式下,輸入q:,就打開了命令行窗口。
命令行窗口中都是我們輸入過的命令,在這個窗口中我們可以像編輯正文一樣編輯新的命令,或修改舊的命令。
因為像編輯普通緩沖區一樣,自然可以拷貝粘貼了。
編輯完之后,在想要執行的命令上按回車,就ok了。
命令執行后,命令行窗口也自動關閉了。

命令行窗口?

“歷史記錄”窗口顯示以前使用的命令行命令的列表,但是不能從“歷史記錄”窗口執行該命令。若要在瀏覽時執行命令,請使用命令行窗口。有三個不同的命令行窗口:

↓CloseCode↓

q:  Command-line window
q/  Forward search window
q?  Backward search window

q(quick,快速的):

?q::命令行命令編輯,可以看到所有使用過的命令的歷史記錄

?q/:向前搜索命令編輯,可以看到所有使用過的向前搜索命令的歷史記錄

?q?:向后搜索命令編輯,可以看到所有使用過的向后搜索命令的歷史記錄

運行q:以啟動命令行命令的命令行窗口。Vim 將在屏幕底部啟動一個新窗口。您可以使用 Up 或 Ctrl-p 鍵向上遍歷,使用 Down 或 Ctrl-n 鍵向下遍歷。如果按下回車,Vim 將執行該命令。若要退出命令行窗口,請按 Ctrl-c、 Ctrl-w c 或鍵入: quit。

類似地,要啟動用于搜索的命令行窗口,可以運行向前搜索的q/和向后搜索的q?。

vim復制粘貼與寄存器的使用?

Vim Normal模式復制粘貼?

初學者會感覺Vim復制粘貼比較奇怪,先從normal模式學習

? normal模式下復制粘貼分別使用y(yank)和p(put) ,剪貼d(delete)和p(put)

? 我們可以使用v(visual)命令選中所要復制的地方,然后使用p粘貼

? 配合文本對象:比如使用yiw復制一個單詞,yy復制一行
Vim里的剪貼(Cut)復制(copy)粘貼(paste)
分別是delete/yank/put

↓CloseCode↓

p          # 粘貼到光標后
P          # 粘貼到光標前
v          # 進入可視模式
y          # 復制標記內容
V          # 可視模式按行標記
Ctrl+V       # 可視模式按列標記
y$         # 復制當前位置到本行結束的內容
yy         # 復制當前行 --> Yank (copy) a line
Y          # 復制當前行,同 yy
yiw         # 復制當前單詞
Nyy         # 復制光標下 N 行內容
ddp         # 剪切當前行并粘貼(先刪除當前行復制到寄存器,并粘貼)
v0         # 選中當前位置到行首
v$         # 選中當前位置到行末
viw         # 選中當前單詞
vib         # 選中小括號內的內容
vi)         # 選中小括號內的內容
vi]         # 選中中括號內的內容
viB         # 選中大括號內的內容
vi}         # 選中大括號內的內容
vis         # 選中句子中的內容
vab         # 選中小括號內的內容(包含小括號本身)
va)         # 選中小括號內的內容(包含小括號本身)
va]         # 選中中括號內的內容(包含中括號本身)
vaB         # 選中大括號內的內容(包含大括號本身)
va}         # 選中大括號內的內容(包含大括號本身)
:set paste     # 允許粘貼模式(避免粘貼時自動縮進影響格式)
:set nopaste    # 禁止粘貼模式
"?yy        # 復制當前行到寄存器 ? ,問號代表 0-9 的寄存器名稱
"?d3j        # 刪除光標下三行內容,并放到寄存器 ? ,問號代表 0-9 的寄存器名稱
"?p         # 將寄存器 ? 的內容粘貼到光標后
"?P         # 將寄存器 ? 的內容粘貼到光標前
:registers     # 顯示所有寄存器內容
:[range]y      # 復制范圍,比如 :20,30y 是復制 20 到 30 行,:10y 是復制第十行
:[range]d      # 刪除范圍,比如 :20,30d 是刪除 20 到 30 行,:10d 是刪除第十行
"_[command]     # 使用 [command] 刪除內容,并且不進行復制(不會污染寄存器)
"*[command]     # 使用 [command] 復制內容到系統剪貼板(需要 Vim 版本有 clipboard 支持)

Insert模式下的復制粘貼?

很多人會使用鼠標進行選中,然后使用ctrl+v或者cmd+v粘貼

? 這個和其他的文本編輯器差不多,但是粘貼代碼有個坑

? 很多人在vimrc中設置了autoindent ,粘貼Python代碼縮進錯亂
這個時候需要使用:set paste和:set nopaste解決

?Ctrl-r {register}:可以粘貼寄存器{register}中的內容。

系統剪貼板寄存器為"+

什么是Vim的寄存器??

你有沒有好奇? Vim在normal模式下復制/剪貼的內容去了哪?

? Vim里操作的是寄存器而不是系統剪貼板,這和其他編輯器不同

? 默認我們使用d刪除或者y復制的內容都放到了“無名寄存器”

? 用x刪除一個字符放到無名寄存器,然后p粘貼,可以調換倆字符

深入寄存器(register)?

Vim不使用單一剪貼板進行剪貼、復制與粘貼,而是多組寄存器

? 通過"{register}前綴可以指定寄存器,不指定默認用無名寄存器

? 比如使用"ayiw復制一個單詞到寄存器a中,"bdd刪除當前行到
寄存器b中

? Vim中""表示無名寄存器,缺省使用。""p其實就等同p

其他常見寄存器?

除了有名寄存器a-z, Vim中還有一些其他常見寄存器

? 復制專用寄存器"0:使用y復制文本同時會被拷到復制寄存器0

? 系統剪貼板"+:可以在復制前加上"+復制到系統剪貼板

? 其他一些寄存器比如"%:當前文件名,".:上次插入的文本

:set clipboard=unnamed:可以讓你直接復制粘貼系統剪貼板內容

強大的vim宏(macro)?

從需求說起?

從一個需求說起,給多行url鏈接加上雙引號,你會怎么做呢?
25540d4c-0d60-11f0-9310-92fbcf53809c.png

什么是Vim宏(macro)?

很多使用Vim很久的Vimer都沒用過宏

? 宏可以看成是一系列命令的集合

? 我們可以使用宏「錄制」一系列操作,然后用于「回放」

? 宏可以非常方便地把一系列命令用在多行文本上

如何使用宏?

宏的使用分為錄制和回放,是不是有種拍電影的感覺

? Vim使用q{register}來錄制,同時也是q結束錄制

quick

? 使用q{register}選擇要保存的寄存器,把錄制的命令保存其中

? 使用q結束錄制

? 使用@{register}回放寄存器中保存的一系列命令

用宏解決剛才的問題?

現在你知道宏怎么用了,如何解決剛才的問題呢?

? 先給一行加上雙引號,然后再回放到其他所有行

? 我們先使用q{register}開始錄制,給一行加上雙引號,之后使用q退出

? 在剩下的所有行中回放錄制的宏(使用可視模式選中,然后使用宏)

需要使用v可視模式選擇所有url,再使用:normal在命令模式下使用normal模式下的命令。

不使用宏解決剛才的問題?

可以通過可視模式選擇所有url
可以使用:normal,在命令模式使用normal模式的命令
:normal I"
:normal A"

vim補全大法?

什么是補全??

只要手速快,補全什么的都是浮云

? 補全是根據當前環境上下文由編輯器“猜”你想輸入的東西

? 比如補全一個單詞、文件名,或者代碼中的函數名、變量名等

? Vim中提供了多種補全功能,還可以由插件拓展功能實現代碼補全

vim中常用的補全?

Vim中有很多種補全的方式

命令 補全類型
普通關鍵字
當前緩沖區關鍵字
包含文件關鍵字
標簽文件關鍵字
字典查找
整行補全
文件名補全
全能(Omni)補全

常見的三種補全類型?

記不住不用擔心,根據筆者經驗,最常用的就三種

? 使用ctrl+n和ctrl+p補全單詞

? 使用ctrl+x和ctrl+f補全文件名

? 使用ctrl+x和ctrl+o補全代碼,需要開啟文件類型檢查,安裝插件

vim多文件操作?

Buffer Window Tab?

我們先來介紹幾個多文件操作相關的概念

? Buffer是指打開的一個文件的內存緩沖區

? 窗口是Buffer可視化的分割區域

? Tab可以組織窗口為一個工作區
25726134-0d60-11f0-9310-92fbcf53809c.png

Buffer?

Buffer-什么是緩沖區??

? Vim 打開一個文件后會加載文件內容到緩沖區

? 之后的修改都是針對內存中的緩沖區,并不會直接保存到文件

? 直到我們執行:w(write)的時候才會把修改內容寫入到文件里

Buffer切換?

那如何在buffer之間切換呢?

? 使用:ls會列舉當前緩沖區,然后使用:b n跳轉到第n個緩沖區

?:bpre、:bnext、:bfirst、:blast

? 或者用:b buffer_name加上tab補全來跳轉

Window窗口?

窗口是可視化的分割區域

? 一個緩沖區可以分割成多個窗口,每個窗口也可以打開不同緩沖區

?s水平分割,v垂直分割。或者:sp和:vs

? 每個窗口可以繼續被無限分 割(看你屏幕是否夠大)

分割窗口示例?

窗口分割效果
25853174-0d60-11f0-9310-92fbcf53809c.png

如何切換窗口?

切換窗口的命令都是使用Ctrl+w(window)作為前綴

命令 用途
w 在窗口間循環切換
h 切換到左邊的窗口
j 切換到下邊的窗口
k 切換到上邊的窗口
l 切換到右邊的窗口

如何重排窗口??

重排窗口可以改變窗口的大小:h window-resize查看文檔

命令 用途
= 使所有窗口等寬、等高
_ 最大化活動窗口的高度
| 最大化活動窗口的寬度
[N]_ 把活動窗口的高度設為[N]行
[N]| 把活動窗口的寬度設為[N]列

Tab(標簽頁)將窗口分組?

Tab是可以容納-系列窗口的容器(:h tabpage)

? Vim的Tab和其他編輯器不太一樣,可以想象成Linux的虛擬桌面

? 比如一個Tab全用來編輯Python文件, 一個Tab全是HTML文件

? 相比窗口, Tab一般用的比較少, Tab太多管理起來也比較麻煩

Tab(標簽頁)操作?

Tab使用不多,簡單了解一下常用操作就好

命令 用途
:tabe[edit] {filename} 在新標簽頁中打開
T 把當前窗口移到一個新標簽頁
:tabc [close] 關閉當前標簽頁及其中的所有窗口
:tabo [only] 只保留活動標簽頁,關閉所有其他標簽頁

Tab(標簽頁)切換操作?

如何切換不同的標簽頁,一般建立兩個就好,太多不好操作

Ex命令 普通模式命令 用途
:tabn[next] {N} {N}gt 切換到編號為{N} 的標簽頁
:tabn[next] gt 切換到下一標簽頁
:tabp[previous] gT 切換到上一標簽頁

vim設置?

設置文件行號:set nu,取消文件行號:set nonu
設置高亮:syntax on

常用操作總結?

u:undo,撤銷上次命令
ctrl + r:redo,恢復撤銷的命令

https://blog.csdn.net/NickDeCodes/article/details/129170764

vim查看壓縮文件?

↓CloseCode↓

vim javaTest.jar

然后篩選壓縮文件內的文件,按下回車,則可進入文件

請你務必,一而再,再而三,三而不竭,千次萬次,毫不猶豫地救自己于這世間水火。

鏈接:https://www.cnblogs.com/blknemo/p/14088271.html

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    87

    文章

    11392

    瀏覽量

    211899
  • VIM
    VIM
    +關注

    關注

    0

    文章

    135

    瀏覽量

    15508
  • 編輯器
    +關注

    關注

    1

    文章

    811

    瀏覽量

    31515

原文標題:Vim 高效編輯技巧總結:提升你的編程效率

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 0人收藏

    評論

    相關推薦

    linux中vi、vim編輯器常用的技巧

    今天浩道跟大家分享硬核干貨,關于linux中vi、vim編輯器常用的技巧!
    發表于 09-21 14:04 ?680次閱讀

    常用編輯器Vim編輯器

    Linux我們對文本進行編輯,經常用到的編輯器就是Vi/Vim,Vi/Vim命令眾多,功能強
    發表于 08-22 09:48

    嵌入式學習-常用編輯器Vim編輯器

    Linux我們對文本進行編輯,經常用到的編輯器就是Vi/Vim,Vi/Vim命令眾多,功能強
    發表于 08-23 09:12

    Linux怎么使用vim編輯器

    VimLinux操作系統中最常用一個編輯器。如配置文件的更改、環境變量的設置等等基本上都是在這個vim編輯器上完成。所以這是
    發表于 04-03 07:22

    vim Linux文本編輯器

    vimLinux文本編輯器vim——最強大的文本編輯器——擺脫鼠標vi—vim—gvim三種模式:①命令模式:yy(復制)、p(粘貼)、dd(刪除)、u(恢復)②插入模式:i/a(進
    發表于 12-15 06:30

    linux文本編輯器工具下載

    linux文本編輯工具:VIM是優秀的開源文本編輯器,是Linux/UNIX用戶非常常用的文本編輯
    發表于 06-02 22:30 ?31次下載

    VIM編輯器學習

     Vim是一個類似于Vi的文本編輯器,不過在Vi的基礎上增加了很多新的特性,Vim普遍被推崇為類Vi編輯器中最好的一個,事實上真正的勁敵來自Emacs的不同變體。 
    發表于 08-11 16:58 ?1084次閱讀

    Linux系統vi(vim編輯器命令使用教程

    vi(vim)是上Linux非常常用的代碼編輯器,很多Linux發行版都默認安裝了vi(vim)。vi(
    的頭像 發表于 10-12 16:53 ?4633次閱讀

    Vim更現代直觀的Linux文本編輯器

    一些流行的命令行文本編輯器包括 Vi、Vim 和 Nano。這些工具非常流行,它們預裝在大多數 Linux 發行版中。但是,某些編輯器(如 Vi 或
    的頭像 發表于 02-24 10:08 ?1156次閱讀

    vim編輯器操作指令大全

    vim編輯器的完整操作命令 在Linux,可以鍵入vimtutor命令,有一個包含實操的vim教程。 1.VI的三種命令模式
    發表于 04-28 16:25 ?0次下載

    你會使用 Linux 編輯器 vim 嗎?

    vim:是一款編輯器,只負責寫代碼;相當于 windows 的記事本;
    的頭像 發表于 05-10 18:21 ?986次閱讀
    你會使用 <b class='flag-5'>Linux</b> <b class='flag-5'>編輯器</b> <b class='flag-5'>vim</b> 嗎?

    linux怎么執行vim編輯的程序

    Linux中,你可以通過以下步驟執行Vim編輯器中編寫的程序: 打開終端或命令行界面。 使用Vim編輯器打開你的程序文件。假設你的程序文件
    的頭像 發表于 11-26 15:45 ?1322次閱讀

    linux使用vim新建并編輯文件

    Linux系統Vim是一款功能強大的文本編輯器。它可以用于新建并編輯文件,具有很多高級功能和快捷鍵。下面是關于如何在
    的頭像 發表于 11-28 15:17 ?3807次閱讀

    vim編輯器如何使用

    Vim編輯器是一個功能強大的文本編輯器,它基于Vi進行改進,并增加了許多新特性。Vim編輯器的使用主要涉及其不同的工作模式及相應操作。以下是
    的頭像 發表于 08-30 14:58 ?687次閱讀

    vim編輯器命令模式使用方法

    文本。 1. Vim編輯器概述 Vim(Vi IMproved)是一款高度可定制的文本編輯器,起源于Vi編輯器
    的頭像 發表于 08-30 15:01 ?763次閱讀
    主站蜘蛛池模板: 国产精品爆乳尤物99精品 | 国产在线精彩视频 | 哒哒哒高清视频在线观看 | 亚洲精品无码成人AAA片 | 久久内在线视频精品mp4 | 亚洲精品自在线拍2019 | 偷偷鲁青春草原视频分类 | 两个洞一起插哦!好刺激 | 男女做爽爽爽视频免费软件 | 99久久精品费精品蜜臀AV | 一本色道久久综合亚洲精品加 | 99re久久热在线播放8 | 达达兔欧美午夜国产亚洲 | 欧美一区二区视频高清专区 | 51成人精品午夜福利AV免费七 | 久久中文字幕乱码免费 | 老司机亚洲精品影院在线观看 | 99精品免费在线观看 | 四房播播开心五月 | www.久艹| 国产午夜不卡在线观看视频666 | 久久综合色超碰人人 | 精品AV无码一二三区视频 | 国产成人mv 在线播放 | 97超碰97资源在线观看视频 | 国产精品高清在线观看地址 | 亚洲精品无码久久久久A片空 | 伦理片午夜在线视频 | 澳大利亚剧满足在线观看 | 暖暖 日本 视频 在线观看免费 | 国产一区二区三区乱码在线观看 | 国产乱人精品视频AV麻豆 | 干性感美女 | 2020最新国产自产精品 | 樱花草在线影视WWW日本动漫 | 欧美乱码伦视频免费66网 | 国产AV在线传媒麻豆 | 18禁无遮挡羞羞污污污污免费 | qvod影院| 国色精品VA在线观看免费视频 | 亚洲欧美自拍明星换脸 |

    電子發燒友

    中國電子工程師最喜歡的網站

    • 2931785位工程師會員交流學習
    • 獲取您個性化的科技前沿技術信息
    • 參加活動獲取豐厚的禮品