在 NeoVim 中使用 Flash 取代 Easy Motion 來快速跳轉

對於常用 Vim 的人來說,Easy Motion 絕對是一個好用的插件,它可以讓你在使用 Vim 時更快速且方便的將遊標移動到螢幕上任何想要的位置。不過,對於 Easy Motion 不少人也有一些意見,例如太久沒人維護(筆者寫本文當下最後一筆 commit 是 2022 年,且只是修改文件)、實現方式老舊、慢…

為了有一個更現代、快速的類-Easy Motion 體驗,我開始轉而使用 Flash。目前已經用了半年,我認為 Flash 可以完全取代 Easy Motion,而且可以做得更好。

安裝

Flash 使用 Lua 寫成,需要有 LuaJIT 的環境(例如 Neovim)。

如果你是使用 Lazy Nvim 的話,可以在 init.lua 內加入:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
local plugins = {
{
"folke/flash.nvim",
event = "VeryLazy",
---@type Flash.Config
opts = {
labels = "asdfghjklqwertyuiopzxcvbnm",
label = { uppercase = false, },
search = { multi_window = true, },
},
-- stylua: ignore
keys = {
{ "s", mode = { "n", "x", "o" }, function() require("flash").jump() end, desc = "Flash" },
{ "S", mode = { "n", "x", "o" }, function() require("flash").treesitter() end, desc = "Flash Treesitter" },
{ "r", mode = "o", function() require("flash").remote() end, desc = "Remote Flash" },
{ "R", mode = { "o", "x" }, function() require("flash").treesitter_search() end, desc = "Treesitter Search" },
{ "<c-s>", mode = { "c" }, function() require("flash").toggle() end, desc = "Toggle Flash Search" },
},
},
}

require("lazy").setup(plugins)

如果你是用 AstroNvim 的話,可以在 plugins 資料夾下新增 flash.lua,並加入內容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
return {
{
"folke/flash.nvim",
event = "VeryLazy",
---@type Flash.Config
opts = {
labels = "asdfghjklqwertyuiopzxcvbnm",
label = { uppercase = false, },
search = { multi_window = true, },
},
-- stylua: ignore
keys = {
{ "s", mode = { "n", "x", "o" }, function() require("flash").jump() end, desc = "Flash" },
{ "S", mode = { "n", "x", "o" }, function() require("flash").treesitter() end, desc = "Flash Treesitter" },
{ "r", mode = "o", function() require("flash").remote() end, desc = "Remote Flash" },
{ "R", mode = { "o", "x" }, function() require("flash").treesitter_search() end, desc = "Treesitter Search" },
{ "<c-s>", mode = { "c" }, function() require("flash").toggle() end, desc = "Toggle Flash Search" },
},
},
}

操作

我最常使用的操作有 2 種。第一種是 s+ 搜尋文字,這個操作就很類似 Easy Motion 的 <leader><leader>,不過 Flash s 後面的搜尋文字不限數量,如果你要跳轉的目標字串開頭重複性很高的話,你可以打 2~3 個字符來匹配,被匹配的文字會高亮顯示,這時你只要再鍵入各個匹配項後的 label 就可以跳轉,而且 Flash 的跳轉可以跨分隔畫面(可以設定)。

鍵入 sun 以搜尋 un 的範例

第二個常用的是 fFf 只會搜尋並配對目前遊標以下的範圍,而 F 則只會搜尋以上的範圍。後面一樣鍵入要匹配的字符,成功匹配的文字會高亮,你可以透過重複按 f 來移動到下一個匹配項,或使用 ;. 來移動到下/上一個匹配項目。匹配範圍超過螢幕顯示,即會捲動螢幕繼續搜尋。

鍵入 fr 向下搜尋 r 的範例

延伸

Flash 還有其它功能和設定我就不一一細講了。

還有一個 vim-sneak 也是可以達成類似 Easy Motion 的操作,不過它好像只能限定向下或上搜尋,沒辦法全螢幕搜尋(Flash 的 s),所以我試用一下後就改成用 Flash 了。

附帶一提,如果有人想看我的完整 Neovim 配置,可以參考 ziteh/vim-config,透過 branch 切換。


留言可能不會立即顯示。若過了幾天仍未出現,請 Email 聯繫:)