Skip to content

Instantly share code, notes, and snippets.

@AlanJui
Last active August 29, 2023 05:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save AlanJui/2c6ba7d24cb17988efd8fea297779056 to your computer and use it in GitHub Desktop.
Save AlanJui/2c6ba7d24cb17988efd8fea297779056 to your computer and use it in GitHub Desktop.
使用 \v (Very Magic) 模式,可令 Neovim 更換文字作業更形簡化。

正規表達式 Very Magic 模式

前言

在 Neovim 使用正規表達式,進行文字的更換(Search and Replace)作業,幾近無所不能。但正規表達式的撰寫,有時會令人頗為心煩, 因為總要為符合「正規表達表的應用規則」,在某些字元之前補上個 "\" (反斜線),以免正規表達式的解析會「誤解」。可是,補上了反斜線之後,卻導致閱讀不易,使用者的思緒反倒被搞亂了。

在 Neovim 中,使用 \v 前綴可以開啟“very magic”模式的正規表達式。在這種模式下,正則表達式的語法更加簡單和直觀,並且不需要像在默認模式下那樣多次使用反斜線 \ 來轉義特殊字符。

在“very magic”模式下,特殊字符(如 ()[]{}.*+?^$ 等)將被視為元字符,不需要額外的轉義。

例如,假設你想在 Neovim 中搜索所有的數字,你可以使用 \d+,在非“very magic”模式下需要寫成 \\d+。使用 \v 之後,就不需要再使用額外的反斜線進行轉義。

以下是使用\v 前綴的示例:

在非“very magic”模式下:

\([0-9]\{3\}\)

在“very magic”模式下:

(\d{3})

總之,使用 \v 前綴可以使正則表達式的撰寫更加簡潔和直觀。

舉例

需求

以下為 which-key 設定的部份內容,此處針對 nvterm 插件設定「快捷鍵」。

因為不想使用 <Alt/Option> + <Key> 的操作模式,想改為 <leader> + 't' + <Key> 的方式。

【舉例說明】:若原先的設定為 <A-i>(組合按鍵: <Alt> + <i> ),則改成: <leader>ti

M.terminal = {
  t = {
    -- toggle in terminal mode
    ["<A-i>"] = {
      function()
        require("nvterm.terminal").toggle "float"
      end,
      "Toggle floating term",
    },

    ["<A-h>"] = {
      function()
        require("nvterm.terminal").toggle "horizontal"
      end,
      "Toggle horizontal term",
    },

    ["<A-v>"] = {
      function()
        require("nvterm.terminal").toggle "vertical"
      end,
      "Toggle vertical term",
    },
  },

  n = {
    -- toggle in normal mode
    ["<A-i>"] = {
      function()
        require("nvterm.terminal").toggle "float"
      end,
      "Toggle floating term",
    },

    ["<A-h>"] = {
      function()
        require("nvterm.terminal").toggle "horizontal"
      end,
      "Toggle horizontal term",
    },

    ["<A-v>"] = {
      function()
        require("nvterm.terminal").toggle "vertical"
      end,
      "Toggle vertical term",
    },

    -- new
    ["<leader>h"] = {
      function()
        require("nvterm.terminal").new "horizontal"
      end,
      "New horizontal term",
    },

    ["<leader>v"] = {
      function()
        require("nvterm.terminal").new "vertical"
      end,
      "New vertical term",
    },
  },
}

操作

先選擇欲進行「更換(Search and Replace)」的起始行與終止行,然後執行 Neovim 的更換指令如下:

:'<,'>s/\v\<A-(\w)\>/<leader>t\1/g
  • \v:要求 Neovim 解析正規表達式時,採用 Very Magic 模式;
  • <A-(\w)>:此敘述為「找到」將被更換的原設定按鍵,如: <A-i> 。其中的 (\w) 更是關鍵,因為它可萃取出原設定按鍵;
  • <leader>t\1:此敘述為「更換成...」的新設定按鍵,如:<leader>t... 。其中的 \1 便是剛才用 (\w) 萃取出的原設定按鍵。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment