從開始講Linux,我們的目標絕不止于寫幾個命令這么簡單。我們的目的是在Linux系統上做開發。因此學習Linux的開發工具也是必不可少的。本章將重點講解:包管理器apt(CentOS叫yum,這里用ubuntu舉例),vim編輯器。
一.包管理器apt
1.安裝軟件的工具
在Linux中,安裝軟件主要有以下三種方式:
1.源碼安裝
2.軟件包安裝rpm
3.包管理器apt
前面兩種方式現在我們已經基本不再使用,因為我們面臨一個重要問題——軟件依賴。
2.軟件依賴
在用源碼安裝或者軟件包安裝時,我們常會發現一個問題:即使將這個軟件“完整下載”下來,也照樣無法使用,這是因為軟件并非我們想的那么簡單,除了軟件本身,可能還附帶許多依賴庫。例如安裝ls命令,還需要附帶lib.c依賴庫。
不僅一個軟件需要多個依賴庫,甚至可以說,世界上的軟件都并非孤島狀態,他們的依賴庫很有可能是相互依賴相互包含的。
我們下載安裝的只是軟件這一種東西,而依賴我們幾乎可以說一個都沒下載下來,需要自己手動下載。為了讓用戶更方便地即下即用,因此誕生了包管理器的方式進行軟件的下載安裝。
3.包管理器apt
軟件的下載安裝即網絡下載+系統安裝(拷貝)。安裝即拷貝,而拷貝一般不會拷到某個用戶的家目錄下,因此軟件的下載安裝往往需要root權限。
wujiahao@VM-12-14-ubuntu:/$ sudo apt install sl
[sudo] password for wujiahao:
不過不必擔心,即便安裝的軟件擁有者為root,但往往會對other提供r和x權限,也就是說對于系統中任意成員都可以使用這個命令。
現在有幾個問題:
問題1:包管理器apt干了什么?
回答2:包管理器會自動解決依賴問題。簡單來說:軟件包可以看作app,而包管理器就是應用商店。
之前我們就講過打包和解壓這個命令。而打包的目的就是防止一些重要文件的缺失,apt這樣的包管理器為我們提供的軟件全是這樣完整打包封裝的,下載下來一般就能直接使用。
那么又引起了另一個問題:
問題2:Linux的軟件由誰提供?
回答2:由社區提供。
操作系統背后的配套軟件也是生態的一環,而對于操作系統來說,生態可以說是比提供的技術支持更重要的東西。一款操作系統要想被更廣大用戶使用,開發者們就會提供各種配套軟件完善生態。
我們的操作系統和社區是如何聯系的?
首先,我們可以直接訪問社區(這里用Ubuntu舉例):www.ubuntu.org
用戶依賴社區的軟件和生態,就自然有人愿意捐款維持項目開發和服務器維護。在社區中的軟件,主要有base(穩定軟件)和epel(擴展軟件源)等組成,只有一個軟件足夠穩定,暴露的問題足夠少才能被遷移為base版。
問題3:那么我們自己的機器,是如何知道軟件的下載鏈接呢?
回答3:我們自己的操作系統都是從社區下載的,當然內部是有內置鏈接的。
root@VM-12-14-ubuntu:/etc/apt# cat /etc/apt/sources.list
# See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to
# newer versions of the distribution.
deb http://mirrors.tencentyun.com/ubuntu jammy main restricted
# deb-src http://mirrors.tencentyun.com/ubuntu jammy main restricted## Major bug fix updates produced after the final release of the
## distribution.
deb http://mirrors.tencentyun.com/ubuntu jammy-updates main restricted
# deb-src http://mirrors.tencentyun.com/ubuntu jammy-updates main restricted## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team. Also, please note that software in universe WILL NOT receive any
## review or updates from the Ubuntu security team.
deb http://mirrors.tencentyun.com/ubuntu jammy universe
# deb-src http://mirrors.tencentyun.com/ubuntu jammy universe
deb http://mirrors.tencentyun.com/ubuntu jammy-updates universe
# deb-src http://mirrors.tencentyun.com/ubuntu jammy-updates universe## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team, and may not be under a free licence. Please satisfy yourself as to
## your rights to use the software. Also, please note that software in
## multiverse WILL NOT receive any review or updates from the Ubuntu
## security team.
deb http://mirrors.tencentyun.com/ubuntu jammy multiverse
# deb-src http://mirrors.tencentyun.com/ubuntu jammy multiverse
deb http://mirrors.tencentyun.com/ubuntu jammy-updates multiverse
# deb-src http://mirrors.tencentyun.com/ubuntu jammy-updates multiverse## N.B. software from this repository may not have been tested as
## extensively as that contained in the main release, although it includes
## newer versions of some applications which may provide useful features.
## Also, please note that software in backports WILL NOT receive any review
## or updates from the Ubuntu security team.
#deb http://mirrors.tencentyun.com/ubuntu jammy-backports main restricted universe multiverse
# deb-src http://mirrors.tencentyun.com/ubuntu jammy-backports main restricted universe multiversedeb http://mirrors.tencentyun.com/ubuntu jammy-security main restricted
# deb-src http://mirrors.tencentyun.com/ubuntu jammy-security main restricted
deb http://mirrors.tencentyun.com/ubuntu jammy-security universe
# deb-src http://mirrors.tencentyun.com/ubuntu jammy-security universe
deb http://mirrors.tencentyun.com/ubuntu jammy-security multiverse
# deb-src http://mirrors.tencentyun.com/ubuntu jammy-security multiverse
其實從這個文件內容來看,我使用的是騰訊的鏡像源。那么為什么需要鏡像源呢?
這些OS也好,生態也好基本都是外國人開發的,所以我們要訪問是需要一點手段的。而我們國人建立了一套國外的鏡像文件,同時更改鏈接(切換鏡像源),便于國人使用。
我們可以查看包含sl關鍵字的指令。顯示的信息依次為軟件名——版本號——提供者
root@VM-12-14-ubuntu:/# apt list|grep slWARNING: apt does not have a stable CLI interface. Use with caution in scripts.aisleriot/jammy 1:3.22.22-1 amd64
android-libboringssl-dev/jammy 10.0.0+r36-1 amd64
android-libboringssl/jammy 10.0.0+r36-1 amd64
apache2-ssl-dev/jammy-updates,jammy-security 2.4.52-1ubuntu4.16 amd64
apertium-eval-translator/jammy 1.2.1-2 all
apertium-hbs-slv/jammy 0.5.1-1 all
apertium-isl-eng/jammy 0.1.0~r66083-3 all
apertium-isl/jammy 0.1.0~r65494-2.1 all
asl-doc/jammy 0.1.7-4 all
asl-tools/jammy 0.1.7-4 amd64
aspell-sl/jammy 0.60-4 all
atomicparsley/jammy 20210715.151551.e7ad03a-1 amd64
bruteforce-salted-openssl/jammy 1.4.2-3build1
二.vim編輯器
1.歷史發展與Vi的區別
起源與演進
Vi(1976年) :由Bill Joy開發,嵌入BSD Unix系統,是首個面向屏幕的文本編輯器,但功能有限(如無多級撤銷)。
Vim(1991年) :Bram Moolenaar基于Amiga系統的Stevie編輯器重寫,命名為"Vi IMproved"(Vim),1992年發布首個公開版本。
關鍵升級:
多級撤銷(Vi僅支持單次撤銷)
跨平臺支持(Windows/Linux/macOS)
語法高亮、代碼補全、插件擴展。
Vim的核心優勢
效率設計:鍵盤為中心的操作減少鼠標依賴,降低重復操作疲勞。
可擴展性:支持Vimscript/Lua/Python等腳本語言。
生態豐富:2023年GitHub超3萬插件(如NERDTree)
2.Vim的12種模式
Vim官方定義7種基礎模式+5種派生模式,以下聚焦5種核心模式:
1. 命令模式(Command Mode)
進入方式:啟動Vim時的默認模式,或從其他模式按Esc返回。
核心功能:導航、文本操作、模式切換。
命令示例:
1. 光標移動
命令 | 功能 | 示例 |
h/j/k/l | 左/下/上/右移動 | 6j :下移6行 |
gg | 跳至文件首行 | 快速返回文件開頭 |
G | 跳至文件末行 | 查看日志結尾 |
$ | 跳至行尾 | 行尾添加分號?; |
^ | 跳至行首 | 行首插入注釋?# |
w | 下一單詞開頭 | 快速跳過參數 |
e | 下一單詞結尾 | 修改函數名 |
b | 上一單詞開頭 | 回退修正拼寫 |
nl | 移至該行第n個字符 | 對齊表格數據 |
Ctrl+f | 向下翻頁 | 瀏覽長文件 |
Ctrl+b | 向上翻頁 | 回看代碼 |
我們可以對vim進行分屏操作:
:vsp config.yml
?(垂直分屏并打開?config.yml
):sp src/main.c
?(水平分屏并打開?main.c
)
并使用shift+ww移動分屏之間的光標,這會直接影響到我們當前在對哪個分屏做操作。
2. 文本編輯
刪除操作:
x # 刪除光標處字符(如刪錯括號)
3x # 刪除光標后3字符(刪多余空格)
dd # 刪除整行(清理空行)
5dd # 刪除5行(移除廢棄代碼塊)
復制粘貼:
yy # 復制當前行
3yy # 復制3行(復制函數)
p # 粘貼到光標后(復用代碼)
替換與撤銷:
r # 替換單個字符(修正拼寫)
R # 進入替換模式(覆蓋舊變量名)
u # 撤銷(救回誤刪代碼)
Ctrl+r # 重做(恢復撤銷操作)
高效修改:
cw # 修改當前單詞(重命名變量)
c3w # 修改3個單詞(重構參數列表)
3. 行號與跳轉
Ctrl+g # 顯示當前行號(調試定位)
20G # 跳至第20行(快速定位錯誤)
2.插入模式(Insert Mode)
- 進入方式:命令模式下按?
i
(光標前插入)、a
(光標后插入)、o
(下方新行插入)。 - 核心功能:自由輸入文本,類似常規文本編輯器。
- 切換意義:脫離命令式操作,直接編輯內容。
快捷鍵 | 進入位置 | 場景示例 |
---|---|---|
i | 光標當前位置插入 | 在單詞中間補充字符 |
a | 光標下一位置插入 | 在行尾逗號后追加內容 |
o | 下方新開一行插入 | 在當前代碼塊下新增空行 |
切換命令模式:ESC
3. 底行模式(Last Line Mode)
- 進入方式:命令模式下按?
:
- 核心功能:文件操作、全局命令、配置設置。
命令 | 功能 | 示例 |
---|---|---|
:set nu | 顯示行號 | 便于代碼定位 |
:15 | 跳至第15行 | 快速修復指定行BUG |
:/include | 向下搜索"include" | 查找頭文件引用 |
:?printf | 向上搜索"printf" | 回溯打印語句 |
:w | 保存文件 | 及時保存進度 |
:q! | 強制退出不保存 | 放棄臨時修改 |
:wq | 保存并退出 | 完成編輯 |
:!command | 在不退出vim編輯器的情況下進行編譯等操作 | 完成test.c的代碼編寫后直接輸入指令編譯 |
:%s/dst/src/ | 在dst處用src替換 | 多行注釋或者輸入輸出內容批量替換 |
示例:
4. 視圖模式(Visual Mode)
- 進入方式:命令模式下按?
v
(字符選擇)、V
(行選擇)、Ctrl+v
(塊選擇)。 - 核心功能:高亮選擇文本區域進行批量操作。
y # 復制選中內容
d # 刪除選中內容
> # 向右縮進選中塊
具體操作方式:可以通過hjkl進行批量的行,列選擇;接著shift+i進入插入模式,直接輸入想要進行注釋的字符(這里用#示范),然后ESC進入命令模式即可。效果如下:
若要撤銷操作直接按u即可。
5. 替換模式(Replace Mode)
- 進入方式:命令模式下按?
R
。 - 核心功能:直接覆蓋現有文本,無需逐字刪除。
- 典型場景:修改代碼變量名時保留原格式。
其他模式:
模式 | 進入快捷鍵 | 功能 |
---|---|---|
Ex模式 | Q | 批處理命令(如:g/pattern/d ) |
終端模式 | :term | 嵌入終端操作 |
選擇模式 | gh | 圖形界面文本選擇 |
模式切換設計哲學:減少誤操作,提升專注度。各模式各司其職。
3.Vim工作流
1.基礎工作流:
#打開文件
vim test.c #進入編輯模式,編輯后ESC進入命令模式
i ->編輯模式->ESC#進入底行模式,保存并退出
:wq!
2.高效技巧:
跨文件操作::vs file2 分屏編輯。做法:在命令模式下Ctrl+w+w
會話管理::mksession 保存窗口布局。
宏錄制:qa 開始錄制 → 操作 → q 停止 → @a 重復。
3.減少模式切換:
插入模式只做輸入,其他操作用命令模式完成
熟練使用 w/e/b 替代方向鍵移動光標
4.組合命令:
d$ = 刪除至行尾(等效于 D)
yG = 復制到文件末尾
5.避免重復:
數字前綴:5dd 代替5次 dd
搜索替代手動查找::/error > 手動翻頁