vim 操作

啟動參數

  • -p 可將多個檔案各別開到標籤頁

快速鍵

  • = 文字重新排版、格式化
  • za 開關 fold
  • . 重複文字操作
  • @: 重複指令操作
  • ^ / Home 前往行開頭
  • $ / End 前往行結尾
  • g t / Ctrl+PageDown 下一個標籤頁
  • g shift+t / Ctrl+PageUp 上一個標籤頁
  • i 在所在位置開始編輯
    • a 在所在位置之後開始編輯
    • o 往下開新行,並進入編輯
    • shift+o 往上開新行,並進入編輯
  • I 在所在行開頭開始編輯
  • d 刪除選取範圍內的區塊
    • d w 往右刪除一個字 (用空白或符號斷字)
    • d $ 刪除此行右邊所有字
    • d ^ 刪除此行左邊所有字
    • d d 刪除整行
    • d f 字元 刪除從遊標到第一次出現指定字元內的字(不換行,包含該字元)
  • v 字元選取
    • shift+v 行選取
    • ctrl+v 區塊選取
  • y 複製 (其他刪除操作也會複製起來,只是此指令不會刪除)
    • 選取後 y 可複製選取範圍
    • yy 複製整行
    • yw 複製一個詞
    • y$ 從遊標開始複製到該行結尾
    • 以此類推
  • p 貼上到後面
    • shift+p 貼上到前面
  • w 前往遊標所在詞結尾
  • >> 增加縮排
  • << 減少縮排
  • Ctrl+w s 畫面橫向分割
    • Ctrl+w v 畫面垂直分割
    • Ctrl+w h / Ctrl+w ← 切換到左邊畫面,右 (l / )、上 (j / )、下 (k / ) 依此類推
  • Ctrl+x Ctrl+f 自動完成檔案路徑
  • Ctrl+x Ctrl+l 整行自動完成,內建只會幫你從其他檔案找開頭一樣的行…
  • Ctrl+u 還原,在插入模式下可用
  • Ctrl+w g f 將游標所在行視為檔案路徑,打開到新的分頁
  • Ctrl+w g F 將游標所在行視為檔案路徑,打開到新的分頁並跳到指定行數
  • qa 開始錄製巨集 a,q 停止錄製
  • @a 執行巨集 a
  • zz 捲動畫面使游標在畫面垂直置中

指令

所有指令在沒有歧義的情況下可以省略後面的輸入,比如 tabedit 可以寫成 tabe

  • :tabedit 在新頁籤打開檔案
  • :args dir/* | argdo tabedit 一次打開多個標籤頁 (會影響到目前所在標籤頁,待改良)
  • :tabmove +n 目前標籤頁往後移n個
  • :tabmove -n 目前標籤頁往前移n個
  • :tabmove n 目前標籤頁移到第n個 (從 0 開始)
  • :s/a/b/g 純文字替換 a 為 b,g 表示取代全部,/ 可以替換成其他符號以方便取代 / 本身,比如 :s#/#\#g
  • :s/\v(\d+)/"\1"/g 開頭的 \v 表示使用正規式做取代 (否則正規式需要依賴更多逃逸字元表示),\1 表示取前面的第一組 () 比對到的字串
  • :qa 關閉所有開啟的檔案
  • :registers 顯示所有暫存器狀態,暫存器就是 vim 的剪貼簿,簡寫成 :reg
  • :nohlsearch 取消目前的搜尋高亮,簡寫成 :noh
  • :windo diffthis 在分割畫面的情況下,可以將兩份內容做差異比對
  • :s/XD/y A 尋找包含字串 XD 的行,逐一複製進 a 暫存器的結尾 (暫存器大寫表示放到結尾)
  • /XD 尋找字串 XD
  • `/\v\d` 開頭的 \v 表示使用正規式尋找,此例是尋找所有數字

Related posts

Serde 對現有值進行複寫的反序列化

Serde 反序列化除了基於預設值複寫外,也可以基於其他現有值複寫,通過不在文件上寫明的公開穩定特徵方法 serde::Deserialize::deserialize_in_place() 可以做到。

原始碼中的註解表示,這個方法被隱藏的原因是新手很少使用。我說這很常用吧....

Rust 巨集語法 macro_rules

參考:

https://doc.rust-lang.org/reference/macros-by-example.htmlhttps://veykril.github.io/tlborm/decl-macros/minutiae/fragment-specifiers.html

巨集語法太廣了,看起來還有 @內部規則 之類的用法,之後再看...

定義巨集

macro_rules! 巨集名稱 {
比對規則 => { 產生程式 };
...
}

比對規則

參數輸入

使用巨集時填入的參數會基於 Rust 語法被編譯器分解為帶階層的字串組,再對規則做比對

a+b 會分解為 a +...

在 Rust 用 trait 實現 OOP 的單層多重繼承

有了這寫法,就可以輕鬆實現多種功能隨意組合了

純方法,沒有依賴結構

直接寫 trait 跟 impl Trait for Struct {}

有依賴結構

// 功能 A
mod func_a {
#
pub struct FuncAStruct...

原子操作 memory order 設定

這個設定可以限制 CPU 亂序執行的執行順序,簡單說明如表:

設定值讀寫順序relaxedOO不影響acquireOX後面的程式要等這行執行完了才會執行,即後面的程式不會早於此操作執行。releaseXO前面的程式要都執行完了才會執行後面的程式,即前面的程式不會晚於此操作執行acq_relOO等同 acquire + releaseseq_cstOO視操作類型加上 acquire, release, acq_rel 其一,並依序向其他線程同步consumeOX等同 acquire,但只向與該變數有關的線程同步據說編譯器沒實作這東西,沒驗證是否為真

整理資訊原文

memory_order_relaxed:純原子操作,不影響順序memory_order_acquire:只能用於取值,且確保後面變數的讀寫操作不會再取值前開始(即保證後面的變數操作不會被往前排)memory_order_release:只能用於寫值,寫值前會確保前面變數的讀寫操作都完成了(即保證前面的變數操作不會被往後排)關聯點:使用 memory_order_acquire 的線程會向使用 memory_order_release...

Leave a Comment

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *