diff --git a/doc/dial.jax b/doc/dial.jax index b65f732..8a93f44 100644 --- a/doc/dial.jax +++ b/doc/dial.jax @@ -90,7 +90,7 @@ VISUAL mode での操作に対応~ ============================================================================== USAGE *dial-usage* -|dial.nvim|自信はキーマップの設定および上書きを行わないため、プラグインを動作 +|dial.nvim|自身はキーマップの設定および上書きを行わないため、プラグインを動作 させるために以下の設定を追加する必要があります。 > nmap (dial-increment) @@ -102,28 +102,26 @@ USAGE *dial-usage* < もしくは Lua 上で以下のように設定することもできます。 - > - vim.api.nvim_set_keymap( - "n", "", require("dial.map").inc_normal(), {noremap = true} - ) - vim.api.nvim_set_keymap( - "n", "", require("dial.map").dec_normal(), {noremap = true} - ) - vim.api.nvim_set_keymap( - "v", "", require("dial.map").inc_visual(), {noremap = true} - ) - vim.api.nvim_set_keymap( - "v", "", require("dial.map").dec_visual(), {noremap = true} - ) - vim.api.nvim_set_keymap( - "v", "g", require("dial.map").inc_gvisual(), {noremap = true} - ) - vim.api.nvim_set_keymap( - "v", "g", require("dial.map").dec_gvisual(), {noremap = true} - ) + vim.keymap.set("n", "", function() + require("dial.map").manipulate("increment", "normal") + end) + vim.keymap.set("n", "", function() + require("dial.map").manipulate("decrement", "normal") + end) + vim.keymap.set("v", "", function() + require("dial.map").manipulate("increment", "visual") + end) + vim.keymap.set("v", "", function() + require("dial.map").manipulate("decrement", "visual") + end) + vim.keymap.set("v", "g", function() + require("dial.map").manipulate("increment", "gvisual") + end) + vim.keymap.set("v", "g", function() + require("dial.map").manipulate("decrement", "gvisual") + end) < - ============================================================================== CONFIGURATIONS *dial-config* @@ -1354,18 +1352,42 @@ LUA API *dial-lua-api* *dial-lua-api-map* "dial.map" module~ -|dial.nvim| 固有のマッピングを提供するモジュールです。 +|dial.nvim| 固有のマッピングに必要な関数を提供するモジュールです。 + + *dial.map.manipulate()* +require("dial.map").manipulate(direction, mode, [group_name, addend]) + + キーマッピングの関数内で増減操作を実行します。例えば以下のように設定するこ + とで、 を押したとき dial.nvim に基づく増加が行われるようになります。 +> + vim.keymap.set("n", "", function() + require("dial.map").manipulate("increment", "normal") + end) +< + この関数は2種類の必須引数と2種類のオプション引数を持ちます。 + direction (string, "increment" | "decrement"): + "increment" を指定すると値が増加し、逆に"decrement" では減少する。 + mode (string, "normal" | "visual" | "gvisual"): + 増減操作を実施する際のモード。 + normal: NORMAL モードでの増減 + visual: VISUAL モードでの増減 + gvisual: VISUAL モードかつ、上から順に被加数が増加する + group_name (string?): + グループ名。省略した場合は `"default"` が用いられる。 + addend (integer?): + 加数。明示的に指定する場合は正の整数でなければならない。 + 省略した場合は |v:count1| の値が用いられる。 + *dial.map.inc_normal()* require("dial.map").inc_normal([group_name]) NORMAL モードにおいて与えられたグループ名をもとにインクリメントを行うため - のキーシーケンスを出力します。group_name は省略すると `default` と等価にな - ります。|vim.api| と|nvim_set_keymap| や |nvim_buf_set_keymap| を組み合わ - せて以下のような形で使用することが想定されています。 + のキーシーケンスを表す文字列を出力します。group_name は省略すると + `default` と等価になります。 > - vim.api.nvim_set_keymap( - "n", "", require("dial.map").inc_normal(), {noremap = true} + vim.keymap.set( + "n", "", require("dial.map").inc_normal() ) < diff --git a/doc/dial.txt b/doc/dial.txt index bc84629..fe3b632 100644 --- a/doc/dial.txt +++ b/doc/dial.txt @@ -106,26 +106,25 @@ plugin. Alternatively, you can configure with Lua as follows: > - vim.api.nvim_set_keymap( - "n", "", require("dial.map").inc_normal(), {noremap = true} - ) - vim.api.nvim_set_keymap( - "n", "", require("dial.map").dec_normal(), {noremap = true} - ) - vim.api.nvim_set_keymap( - "v", "", require("dial.map").inc_visual(), {noremap = true} - ) - vim.api.nvim_set_keymap( - "v", "", require("dial.map").dec_visual(), {noremap = true} - ) - vim.api.nvim_set_keymap( - "v", "g", require("dial.map").inc_gvisual(), {noremap = true} - ) - vim.api.nvim_set_keymap( - "v", "g", require("dial.map").dec_gvisual(), {noremap = true} - ) + vim.keymap.set("n", "", function() + require("dial.map").manipulate("increment", "normal") + end) + vim.keymap.set("n", "", function() + require("dial.map").manipulate("decrement", "normal") + end) + vim.keymap.set("v", "", function() + require("dial.map").manipulate("increment", "visual") + end) + vim.keymap.set("v", "", function() + require("dial.map").manipulate("decrement", "visual") + end) + vim.keymap.set("v", "g", function() + require("dial.map").manipulate("increment", "gvisual") + end) + vim.keymap.set("v", "g", function() + require("dial.map").manipulate("decrement", "gvisual") + end) < - ============================================================================== CONFIGURATIONS *dial-config* @@ -1414,16 +1413,39 @@ LUA API *dial-lua-api* A module that provides specific mappings. + *dial.map.manipulate()* +require("dial.map").manipulate(direction, mode, [group_name, addend]) + + Perform the increment/decrement operation in a Lua keymapping function. + For example, the following configuration assigns dial-based increment to + . +> + vim.keymap.set("n", "", function() + require("dial.map").manipulate("increment", "normal") + end) +< + This function has two required arguments and two optional arguments. + direction (string, "increment" | "decrement"): + "increment" increases the value, while "decrement" decreases it. + mode (string, "normal" | "visual" | "gvisual"): + The mode in which the operation is performed. + normal: in NORMAL mode + visual: in VISUAL mode + gvisual: in VISUAL mode, with addends increasing by line + group_name (string?): + Group name. If omitted, `"default"` is used. + addend (integer?): + If you specify this argument explicitly, it must be a positive + integer. If omitted, it defaults to |v:count1|. + *dial.map.inc_normal()* require("dial.map").inc_normal([group_name]) Outputs a key sequence for incrementing based on the given `group_name` in - NORMAL mode. If `group_name` is omitted, it is equivalent to `default`. It - is expected to be used in combination with |vim.api| and |nvim_set_keymap| - or |nvim_buf_set_keymap| in the following way: + NORMAL mode. If `group_name` is omitted, it is equivalent to `default`. > - vim.api.nvim_set_keymap( - "n", "", require("dial.map").inc_normal(), {noremap = true} + vim.keymap.set( + "n", "", require("dial.map").inc_normal() ) < diff --git a/lua/dial/command.lua b/lua/dial/command.lua index dd3695b..d40d2da 100644 --- a/lua/dial/command.lua +++ b/lua/dial/command.lua @@ -28,12 +28,7 @@ function M.select_augend_normal(group_name) error(("undefined augend group name: %s"):format(group_name)) end - local count = vim.v.count - if count ~= 0 then - handler:set_count(count) - else - handler:set_count(1) - end + handler:set_count(vim.v.count1) local col = vim.fn.col "." local line = vim.fn.getline "." handler:select_augend(line, col, augends) @@ -52,12 +47,7 @@ function M.select_augend_visual(group_name) error(("undefined augend group name: %s"):format(group_name)) end - local count = vim.v.count - if count ~= 0 then - handler:set_count(count) - else - handler:set_count(1) - end + handler:set_count(vim.v.count1) local mode = vim.fn.mode(0) ---@type integer diff --git a/lua/dial/map.lua b/lua/dial/map.lua index aadcee8..5ec34f0 100644 --- a/lua/dial/map.lua +++ b/lua/dial/map.lua @@ -15,7 +15,8 @@ end ---@param direction direction ---@param mode mode ---@param group_name? string -local function _cmd_sequence(direction, mode, group_name) +---@param count? integer +local function _cmd_sequence(direction, mode, group_name, count) local select if group_name == nil then select = cmdcr([[lua require"dial.command".select_augend_]] .. mode .. "()") @@ -26,9 +27,27 @@ local function _cmd_sequence(direction, mode, group_name) -- command.select_augend_normal(vim.v.count, group_name) local setopfunc = cmdcr([[let &opfunc="dial#operator#]] .. direction .. "_" .. mode .. [["]]) local textobj = util.if_expr(mode == "normal", cmdcr [[lua require("dial.command").textobj()]], "") + if count ~= nil then + if type(count) ~= "number" then + error "count must be a integer." + end + return select .. setopfunc .. count .. "g@" .. textobj + end return select .. setopfunc .. "g@" .. textobj end +---Functional interface +---@param direction direction +---@param mode mode +---@param group_name? string +---@param count? integer +function M.manipulate(direction, mode, group_name, count) + if count == nil then + count = vim.v.count1 + end + vim.cmd.normal(vim.api.nvim_replace_termcodes(_cmd_sequence(direction, mode, group_name, count), true, true, true)) +end + ---@param group_name? string ---@return string function M.inc_normal(group_name)