Vim 命令從頭學習記錄

學習鏈接:eleon-vim基礎教程

Vim - 基礎翻屏操作

光標移動:hjkl 20j 向下移動20行,w 向后移動一個字符,b 向前移動一個字符。

Ctrl + u 向上翻半頁 UP
Ctrl + d 向下翻半頁 Down
Ctrl + f 向下翻整頁 Forward
Ctrl + b 向上翻整頁 Backward

大寫M 跳轉到屏幕中間 Middle
大寫L 跳轉到屏幕最后一行 Last Line
大寫H 跳轉到屏幕第一行 Home

Count + 大寫H 光標移動到頂部下面的count行。
Count + 大寫L 光標移動到底部上面的count行。

Ctrl + e 向下翻一行,光標不動
Ctrl + y 向上翻一行,光標不動

Vim - 編輯操作

復制yy=Y 復制光標所在行,3yy 復制光標所在行以在內的三行, y$ 復制光標所在字符至行尾的內容。
粘貼p P 一個是粘貼到光標或行之前,一個是之后。
刪除dd 刪除本行,3dd 刪除光標所在行以在內的三行,D = d$刪除光標所在字符至行尾的內容。
剪切x 剪切當前字符,3x 剪切當前字符在內的三個字符
交換字符順序xp ,其實就是先剪切后粘貼
合并行:大寫J 無論光標在哪里,都能把下一行的內容補到當前行尾,間隔一個空格。(在代碼整理的時候用嗎???)
替換光標處字符(單詞打錯了后很常用):rb 就可以把光標所在位置字符替換成b,Rccc 就可以把光標所在位置和其后面的倆字符都替換成b。
s 會刪除掉單個字符然后進入插入模式。 S會刪除掉光標所在行讓后進入插入模式。
變更ccS的作用一樣。
撤銷u 或者 U 都行,撤銷上一步。
重做Ctrl + ru作用的反向
大小寫轉換gu + Motion , gU + Motion 其中Motion可以是w表示轉換單詞,如果是2w就是轉換當前單詞在內的倆單詞。
重復上次修改:點“.” 可以重復上次的命令操作。

Vim - 文本對象(常用)

Operation + type + Object 的組合
Operation: 可能是d,y, c, v
Type:只有兩種 ai,分別表示all和in
Object:可以是一堆括號{ [ ( " '等,也可也是w(word)s(句子)t(tab,html用到)

Vim - 縮進

1 手動縮進
>> :增加縮進
<< :減小縮進
3>> :當前行以下3行增加縮進,減小縮進類似。
> % :當光標放在大括號上時有效,對當前塊進行增加縮進操作,減小縮進類似。
> i { :為{}內的內容(不含{})增加縮進
> a { :為包含{}在內的塊兒內內容增加縮進

2 自動縮進
== :對當前行自動縮進
4== :對當前行及下面三行執行自動縮進
=i{ :對{中的內容自動縮進
=a{ :對{中的內容包括{自動縮進(常用)
=% :當貫標在括號上時自動縮進整個塊

3 縮進格式設置
set shiftwidth=8 設置縮進操作長度為8個空格的長度(如果tab為4個空格,則縮進就是兩個制表符,如果tab為8個空格,則縮進就是1個制表符)
set tabstop=4 設置tab的長度為4,當在命令模式下進行縮進時起作用。
set expandtab插入模式和命令模式都起作用,使用手動縮進插入的是空格。此時如果在插入模式下敲入tab,則插入的是空格
set noexpandtab expandtab 的反面,使用手動縮進插入的是制表符。此時如果在插入模式下敲入tab,則插入的是制表符
上面的命令與手動自動縮進命令的配合來編寫符合原代碼規范的代碼。
set softtabstop=8 只在插入模式起作用。 注意與tabstop的不同。如果你想手動寫tab則要修改這個命令。
在檢查更改時如果要檢查自己的設置是否正確使用倆命令:
set list 顯示特殊符號,如$表示行尾,Ctrl+I表示tab制表符
set nolist 隱藏特殊符號

4 插入模式下編輯下一行時如何自動縮進
set <自動縮進類型>: 類型有四種,autoindentsmartindent, cindent, indentexpr;
我現在先使用cindent, 是用于c語言時的縮進格式。 我找了很長時間,網上的教程都是東拼西湊,原來學習還得需要系統,這塊東西如果光靠一個博客就搞明白的確很費精力。

Vim - 折疊-Floding

如果有不需要的代碼可以折疊起來。也可以參考手冊命令模式輸入:help folding
當前我,幾乎不咋用,只有使用vim -d 進行文件對比的時候使用。僅列在這,詳情參考vim 基礎教程
z + f + Motion : 創建當前行至Motion為一個折疊。
count + z + F: 創建當前行之后count行的折疊。
z + f + %:查找光標所在的塊進行塊兒折疊。
z + o 打開折疊,z + O 遞歸打開折疊。
z + c 折疊起來,z + C 遞歸折疊起來。
z + d 刪除光標所在行折疊,z + D 遞歸刪除光標所在塊折疊。
z + E 刪除所有折疊。

Vim - Buffers 多文件(很重要)

命令模式下有如下命令,我曾苦苦找尋,如今發現vim本身就特么強大的一批了,我還裝個毛線的nvim. lvim,騎驢覓驢而已。
e + 文件名 打開并激活指定文件(e為edit)
ls, buffers, files 列出緩沖區文件,這仨命令一樣的作用
b add b.txt 向緩沖區列表添加新文件但不激活。
b d 3 刪除緩沖區編號為3的文件,d也可寫作delete, 如果刪除當前文件不需要加數字即可。
b+空格+Tab 先在命令模式輸入ls進入buffer列表,然后輸入該命令tab就可實現文件跳轉,哈哈好方便啊,我之前都打開一堆vim窗口,簡直是浪費聲明臥槽了。
bn, bp 可以切換到buffer中下一個nexp文件,上一個privious文件
b3 ,buffer3 都可以切換到buffer中符號為3的文件。
b# 訪問剛剛訪問的文件,這個應該最常用了。
bf, bl 可以跳轉到buffer中第一個文件,最后一個文件
b1.txt, buffer1.txt 都可以切換到指定文件名的文件,支持tab補全。
set hidden 當寫入內容后不保存也能切換不同文件 set nohidden作用相反。

Vim - Windows 多窗口

可以將一個窗口分隔成多個窗口,不常用,如果對比文件直接vim -d 不更方便?但是還是記錄下基本用法,以免以后用到查找。
sp + 文件名,split的縮寫,橫向分隔窗口打開指定文件
vs + 文件名,vertical split縮寫,縱向分隔窗口打開指定文件
Ctrl + W + Motion Motion 可以是hjkl實現窗口切換
Ctrl + W + w 輪換窗口
Ctrl + W + + 增加窗口高度。Ctrl + W + -減小窗口高度。
Ctrl + W + > 增加窗口寬度。Ctrl + W + <減小窗口寬度。
Ctrl + W + Count + action 其中action可以是上面的窗口操作,比如窗口寬度增大4個格:ctrl + W + 4 + >
Ctrl + W + _ 最大化窗口高度; Ctrl + W + | 最大化窗口寬度;
Ctrl + W + = 調整窗口為一致性大小。
Ctrl + W + H/J/K/L 注意motion為大寫,用于調整光標所在窗口在屏幕的位置。
Ctrl + W + q 退出當前窗口
Ctrl + W + = 除當前窗口之外全部退出,等價于on。

Vim - tabs 多標簽

vim -p 文件1 文件2 以TAB形式打開指定文件
vim -p * 以TAB形式打開當前目錄所有文件
:tabe + 文件名 以TAB形式打開新文件,常用(tab edit)
gt:tabn跳到下一個tab.
gT:tabp跳到上一個tab.
數字 + gt:tabn + 數字 跳到指定序號的的tab
:tabl 跳到最后一個tab
:tabm + 數字 (tab move)將當前tab插入到指定數字的位置
:tabc (tab close)
:tabo 只保留當前窗口 (tab only)

《思考 buffers Windows tabs 的關系》

之前都是先搜索怎么配置,網上找到博客一通復制粘貼,跟著人家的命令就開始用,也不知到為啥,但是最終還是被這些概念搞煩了,最后使用最簡單的vim 打開一個文件的最原始狀態。現在機緣成熟,我學到這里了,也該搞明白他們的關系了,看這個大佬博客:如何理解并正確使用 Vim 中的 Buffer、Window 和 Tab

總結
buffers: 為文件在內存中的緩存數據,每個文件對應內存中唯一的buffer。
Windows: 在一個電腦屏幕大小的空間,劃分不同的小窗口,每個小窗口可以顯示一個打開的文件。可以說Windows可以規定一個窗口的布局。
tabs:每個tab可以理解為一個電腦屏幕,每個tab里面都可以有一種窗口布局。不同tab之間的窗口沒關系。

我應該如何使用 tabs 和 buffer ?
Windows使用的很少,當我使用vim filename.c 打開一個文件,找到一個目標函數,轉到定義時此時跳到另外一個文件,此時通過:ls可以到這個文件的buffer也被激活了,這就已經打開了多buffer.
當我要 porting 兩個不同工程的代碼時,我可以為每個工程打開一個tag。這樣可以方便的實現復制。
之前我都是使用多tag, 每個tag顯示一個文件,但是當你使用ctags工具跳轉時,tag顯示的名稱已經不是原來的文件了,會把自己搞暈。(如果能時刻顯示當前打開buffer對應的文件就好了)

Vim 寄存器

無名寄存器(Unnamed): (沒錯就是個雙引號)
用于保存d, c, x, s, y操作的內容。可以通過命令行輸入:reg "來查看無名寄存器的內容。

數字寄存器(Number): 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. 一共10個數字寄存器。
0號寄存器 保存y操作的內容。
1-9 號寄存器 保存d, c操作的內容,且保存的內容會隨著操作的進行逐漸向后搬移,1號寄存器始終保存著最新刪除的內容。
搜索寄存器/,當執行搜索字符后,這個寄存器保存剛剛的搜索記錄。
系統剪切板寄存器:+ 和 * 。在ubuntu中看到兩個寄存器的內容一致,都來自鼠標或鍵盤復制得到的內容。

只讀寄存器:有三個,分別為:

  • 文件名寄存器:%
  • 命令寄存器::
  • 插入文本寄存器:.

Named - 寄存器a-z 共26個寄存器。比較常用,如果想要將指定內容復制到指定寄存器,需要" + 寄存器 + 操作,其中寄存器小寫表示替換大寫表示追加,vim普通命令模式下例子:
"ayaw :將單詞 復制 到 a 寄存器。
"byiw :將單詞 復制 到 b 寄存器。
"Cyaw :將單詞 追加 到 c 寄存器。
"ap :將 a 寄存器中的內容粘貼到光標位置。

思考:這一堆寄存器什么時候用?
當我們要跨文件進行大量復制粘貼時,如果只是使用0號寄存器,我們就得來回切換文件,此時若使用vim提供的Named寄存器單次保存不同內容就可以提升編輯效率。還有就是用于存儲錄制的宏。

寄存器內容查看reg + 寄存器名
寄存器內容操作Count + " + 寄存器名 + 操作
舉例:3"+p"+3p 都是將+寄存器中的內容粘貼到光標處重復3次。

Vim - Macro 宏(需要用寄存器存儲)

宏就是一個錄制好的一串命令,如果這個命令需要多次重復操作,你就可以錄制一個宏到指定的Named 寄存器,這樣下次就不用一個一個敲了(但是覺的還是很少用到)。
記錄宏的步驟:
開始記錄宏:q + 寄存器名
輸入宏命令
按下q結束宏錄制

使用宏的步驟:
使用錄制的宏命令:@ + 寄存器名
使用最近一次錄制的宏命令:@@

追加宏內容:q + 大寫寄存器名
多次重復宏命令:count + @ + 寄存器名

舉例子:
比如我想要實現按下@c來快速將本行行首添加//注釋掉本行(想法牛逼,很實用)。
比如我想要實現按下@d來快速將本行行尾添加;

Vim - Marks書簽(需要用寄存器存儲)

用到小寫和大寫兩種寄存器,每個文件內有一套小寫Named寄存器提供文件內書簽跳轉(局部跳轉),而文件之間有大寫Named寄存器可以實現文件之間書簽跳轉(全局跳轉)。
添加書簽:m + Named寄存器
清理書簽:delmarks a 可清理a書簽
查看書簽:marks + 要查看的寄存器(此時區分小寫還是大寫)
跳轉到書簽所在行: ' + Named寄存器 (單引號)
跳轉到書簽所在行與列: ` + Named寄存器(反引號)

范式:Operation + ' + Named寄存器(單引號)
比如:
d'a :刪除當前光標所在行至a寄存器書簽所在行之間的內容。
y'a :復制光標所在行至a寄存器書簽所在行之間的內容。
c'a :刪除當前光標所在行至a寄存器書簽所在行之間的內容并進入插入模式。

思考:書簽什么時候用?
通過marks查看寄存器存儲的標簽,可見他會隨著你刪除代碼動態更新,這比較有用。
1,多文件穿梭,可能你說用buffers的命令bn就夠了,但是書簽可以更快的跳轉到目標位置,還能跟隨刪除粘貼等命令移動。
2,調試過程中,可以標記報錯位置,快速往返于代碼和日志。

Vim - 插入模式下的快捷鍵

  1. 進入插入模式常用的有:i, l, a, A, o, O, ea
  2. Ctrl + y : 插入光標之前行的內容,一直操作就可以一直復制。
  3. Ctrl + e : 插入光標之后行的內容,一直操作就可以一直復制。
  4. Ctrl + r + =:將表達式求值并插入。(會議一下:在命令模式使用“ap插入寄存器內容)
  5. Ctrl + r + 寄存器將寄存器內容插入
  6. Ctrl + t當前行增加縮進
  7. Ctrl + d當前行減小縮進
  8. Ctrl + w刪除光標前面的單詞
  9. Ctrl + h:刪除光標前面的字符
  10. Ctrl + o:切換到普通模式,完成一個命令后,重新進入插入模式。

插入模式下比較常用的操作
縮進應該比較少用,我只需要知道如何在命令模式自動管理縮進就夠了。刪除操作吧,都是退回到命令模式切換光標位置或者按上下左右切換位置,感覺都不咋用。

Vim - 視圖模式

之前我只知道Ctrl+V, 用來對那幾行前面插入注釋,但不知道為何他只能選擇一個方塊兒,后面的內容就無法選中。。。
小寫v: 基于字符模式選擇,從光標所在字符開始選中。
大寫V:基于行選擇,從光標所在行開始選中整行。
Ctrl + v:基于塊,可以選中方塊兒形狀的內容。(可配合小寫o,大寫O來快速跳轉光標位置)
gv:選中之前選擇的內容。
小寫u大寫U來切換文本大小寫,~也可切換大小寫。
> 增加縮進,< 減小縮進。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/79536.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/79536.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/79536.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux系統編程--基礎指令(!!詳細講解+知識拓展)

第一講 基礎指令 ? 我們現如今自己使用的電腦大部分是用的都是windows或者macOS&#xff0c;并配合上由微軟和蘋果開發的圖形化界面&#xff0c;所以使用鼠標再屏幕上進行點擊即可完成許多任務。但是作為操作系統的學習者&#xff0c;在linux的基礎上不再使用圖形化界進行操作…

ADK 第四篇 Runner 執行器

智能體執行器 Runner&#xff0c;負責完成一次用戶需求的響應&#xff0c;是ADK中真正讓Agent運行起來的引擎&#xff0c;其核心功能和Agents SDK中的Runner類似&#xff0c;具體作用如下&#xff1a; 會話管理&#xff1a;自動讀取/寫入 SessionService&#xff0c;維護歷史信…

【Tauri2】37——后端處理invoke

目錄 前言 正文 隨便看看 看看get 看看parse_invoke_request 看看message_handler 看看handle_ipc_message 看看webview的on_message方法 第一種情況的處理 第二種情況的處理 運行通信函數 返回的處理 整個流程 前言 【Tauri2】033 __TAURI_INTERNALS__和invoke-C…

kotlin 05flow -從 LiveData 遷移到 Kotlin Flow 完整教程

一 從 LiveData 遷移到 Kotlin Flow 完整教程 LiveData 長期以來是 Android 架構組件中狀態管理的核心&#xff0c;但隨著 Kotlin Flow 的成熟&#xff0c;Google 官方推薦將現有 LiveData 遷移到 Flow。本教程基于官方文章并擴展實踐細節&#xff0c;完成平滑遷移。 一、為什…

C++負載均衡遠程調用學習之獲取主機信息功能

目錄 01Lars-lbAgentV0.2-賦值均衡數據結構關系分析 02 Lars-lbAgent0.2-host_info-load_balance-route_lb數據結構的定義 03Lars-lbAgentV0.2-proto協議的定義 04 Lars-lbAgentV0.2-route_lb與UDP server的關聯 05 -Lars-lbAgentV0.2-route_lb與UDP server的關聯 06Lars…

2025系統架構師---論軟件的設計模式論文

2023 年,我所在的公司承擔了某部網絡靶場的研發任務。我作為公司的技 術總監,希望能打造基于網絡靶場的系列產品,參與到項目的設計中,以期開發 擴展性和可維護性良好的網絡靶場,為以后的產品開發打下基礎。網絡靶場是網 絡安全技術研究的基礎支撐平臺,它利用虛擬的和實物…

Kubernetes排錯(七)-節點排錯

1、節點 Crash 與 Vmcore 分析 kdump 介紹? 目前大多 Linux 發新版都會默認開啟 kdump 服務&#xff0c;以方便在內核崩潰的時候, 可以通過 kdump 服務提供的 kexec 機制快速的啟用保留在內存中的第二個內核來收集并轉儲內核崩潰的日志信息(vmcore 等文件), 這種機制需要服務…

【QT】QT中的軟鍵盤設計

QT的軟鍵盤設計 1.軟鍵盤制作步驟2.介紹有關函數的使用3.出現的編譯錯誤及解決辦法示例代碼1&#xff1a;按鍵事件實現軟鍵盤現象&#xff1a;示例代碼2&#xff1a;按鍵事件實現軟鍵盤&#xff08;加特殊按鍵&#xff09;現象&#xff1a; 軟鍵盤移植到新的工程的步驟&#xf…

【LaTeX+VSCode本地Win11編譯教程】

LaTeXVSCode本地編譯教程參考視頻&#xff1a; LaTeXVSCode本地編譯教程 下面提供一種Win11的Latex環境配置和設置方案&#xff0c;首先vscode安裝參考博客&#xff1a;【VscodeGit教程】&#xff0c;然后準備安裝Latex相關組件 在 https://miktex.org/download 下載 miktex 并…

2025五一杯數學建模ABC題賽題已出

2025五一杯數學建模ABC題賽題已出 A: B: C:

Springclound常用五大組件及其使用原理

注冊中心Eureka Eureka-Server&#xff1a;就是服務注冊中心&#xff08;可以是一個集群&#xff09;&#xff0c;對外暴露自己的地址。 提供者&#xff1a;啟動后向Eureka注冊自己信息&#xff08;地址&#xff0c;服務名稱等&#xff09;&#xff0c;并且定期進行服務續約 …

Docker —— 隔離的基本操作(2)

Docker —— 隔離的基本操作&#xff08;2&#xff09; unshareunshare 命令詳解基本語法常用選項常用示例實際應用場景注意事項與 Docker 的關系1. 執行命令2. 修改主機名3. 退出命名空間4. 驗證宿主機主機名關鍵原理類比 Docker 容器總結 實戰操作一&#xff08;PID 隔離&…

Java List分頁工具

PageUtil.java import com.google.common.collect.Lists; import com.jd.platform.hotkey.dashboard.common.domain.Page; import org.springframework.util.CollectionUtils;import java.util.ArrayList; import java.util.List;public class PageUtil {/*** 通用分頁工具類*…

中陽策略:如何從K線行為中提取交易邏輯信號?

中陽策略&#xff1a;如何從K線行為中提取交易邏輯信號&#xff1f; 在量化趨勢研究中&#xff0c;中陽形態常被視作市場動能變化的重要標志。它不僅代表價格的強勢上行&#xff0c;更隱含著主力資金換手與情緒轉換的信號。將“中陽”這一結構元素抽象為模型中的“強動能突破”…

Java SE(8)——繼承

1.繼承的概念&作用 在Java中&#xff0c;繼承是面向對象編程的三大基本特性之一&#xff08;還有封裝和多態&#xff09;&#xff0c;允許一個類&#xff08;子類/繼承類&#xff09;繼承另一個類&#xff08;父類/基類&#xff09;的屬性和方法 繼承的核心目的是&#xf…

Python爬蟲(18)反爬攻防戰:動態IP池構建與代理IP實戰指南(突破95%反爬封禁率)

目錄 引言一、背景&#xff1a;為什么代理IP是爬蟲的“第二生命”&#xff1f;1.1 反爬系統的IP檢測三把刀1.2 代理IP的核心價值 二、基礎實戰&#xff1a;快速搭建代理IP系統2.1 免費代理IP的獲取與篩選2.2 代理IP的智能容錯機制 三、高階攻防&#xff1a;突破企業級反爬封鎖3…

LFU算法解析

文章目錄 LFU緩存中關鍵變量的訪問與更新機制1. min_freq - 最小頻率訪問時機更新時機更新示例 2. capacity - 緩存容量訪問時機更新時機訪問示例 3. key_to_node - 鍵到節點的映射訪問時機更新時機更新示例 4. freq_to_dummy - 頻率到鏈表啞節點的映射訪問時機更新時機更新示例…

ByteArrayInputStream 類詳解

ByteArrayInputStream 類詳解 ByteArrayInputStream 是 Java 中用于從字節數組讀取數據的輸入流&#xff0c;位于 java.io 包。它允許將內存中的字節數組當作輸入流來讀取&#xff0c;是處理內存數據的常用工具。 1. 核心特性 內存數據源&#xff1a;從字節數組&#xff08;b…

rvalue引用()

一、先確定基礎:左值(Lvalue)和右值(Rvalue) 理解Rvalue引用,首先得搞清楚左值和右值的概念。 左值(Lvalue):有明確內存地址的表達式,可以取地址。比如變量名、引用等。 復制代碼 int a = 10; // a是左值 int& ref = a; // ref也是左值右值(Rval…

吳恩達深度學習作業 RNN模型——字母級語言模型

一. 簡單復習一下RNN RNN RNN適用于處理序列數據&#xff0c;令是序列的第i個元素&#xff0c;那么就是一個長度為的序列&#xff0c;NLP中最常見的元素是單詞&#xff0c;對應的序列是句子。 RNN使用同一個神經網絡處理序列中的每一個元素。同時&#xff0c;為了表示序列的…