Skip to content

Commit

Permalink
Merge pull request #56 from monaqa/fix-map_as_function
Browse files Browse the repository at this point in the history
change mapping into function-based interface
  • Loading branch information
monaqa committed Mar 28, 2023
2 parents 94c4649 + 5765176 commit 0fb00f5
Show file tree
Hide file tree
Showing 4 changed files with 117 additions and 64 deletions.
76 changes: 49 additions & 27 deletions doc/dial.jax
Expand Up @@ -90,7 +90,7 @@ VISUAL mode での操作に対応~
==============================================================================
USAGE *dial-usage*

|dial.nvim|自信はキーマップの設定および上書きを行わないため、プラグインを動作
|dial.nvim|自身はキーマップの設定および上書きを行わないため、プラグインを動作
させるために以下の設定を追加する必要があります。
>
nmap <C-a> <Plug>(dial-increment)
Expand All @@ -102,28 +102,26 @@ USAGE *dial-usage*
<

もしくは Lua 上で以下のように設定することもできます。

>
vim.api.nvim_set_keymap(
"n", "<C-a>", require("dial.map").inc_normal(), {noremap = true}
)
vim.api.nvim_set_keymap(
"n", "<C-x>", require("dial.map").dec_normal(), {noremap = true}
)
vim.api.nvim_set_keymap(
"v", "<C-a>", require("dial.map").inc_visual(), {noremap = true}
)
vim.api.nvim_set_keymap(
"v", "<C-x>", require("dial.map").dec_visual(), {noremap = true}
)
vim.api.nvim_set_keymap(
"v", "g<C-a>", require("dial.map").inc_gvisual(), {noremap = true}
)
vim.api.nvim_set_keymap(
"v", "g<C-x>", require("dial.map").dec_gvisual(), {noremap = true}
)
vim.keymap.set("n", "<C-a>", function()
require("dial.map").manipulate("increment", "normal")
end)
vim.keymap.set("n", "<C-x>", function()
require("dial.map").manipulate("decrement", "normal")
end)
vim.keymap.set("v", "<C-a>", function()
require("dial.map").manipulate("increment", "visual")
end)
vim.keymap.set("v", "<C-x>", function()
require("dial.map").manipulate("decrement", "visual")
end)
vim.keymap.set("v", "g<C-a>", function()
require("dial.map").manipulate("increment", "gvisual")
end)
vim.keymap.set("v", "g<C-x>", function()
require("dial.map").manipulate("decrement", "gvisual")
end)
<

==============================================================================
CONFIGURATIONS *dial-config*

Expand Down Expand Up @@ -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])

キーマッピングの関数内で増減操作を実行します。例えば以下のように設定するこ
とで、<C-a> を押したとき dial.nvim に基づく増加が行われるようになります。
>
vim.keymap.set("n", "<C-a>", 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", "<C-a>", require("dial.map").inc_normal(), {noremap = true}
vim.keymap.set(
"n", "<C-a>", require("dial.map").inc_normal()
)
<

Expand Down
70 changes: 46 additions & 24 deletions doc/dial.txt
Expand Up @@ -106,26 +106,25 @@ plugin.

Alternatively, you can configure with Lua as follows:
>
vim.api.nvim_set_keymap(
"n", "<C-a>", require("dial.map").inc_normal(), {noremap = true}
)
vim.api.nvim_set_keymap(
"n", "<C-x>", require("dial.map").dec_normal(), {noremap = true}
)
vim.api.nvim_set_keymap(
"v", "<C-a>", require("dial.map").inc_visual(), {noremap = true}
)
vim.api.nvim_set_keymap(
"v", "<C-x>", require("dial.map").dec_visual(), {noremap = true}
)
vim.api.nvim_set_keymap(
"v", "g<C-a>", require("dial.map").inc_gvisual(), {noremap = true}
)
vim.api.nvim_set_keymap(
"v", "g<C-x>", require("dial.map").dec_gvisual(), {noremap = true}
)
vim.keymap.set("n", "<C-a>", function()
require("dial.map").manipulate("increment", "normal")
end)
vim.keymap.set("n", "<C-x>", function()
require("dial.map").manipulate("decrement", "normal")
end)
vim.keymap.set("v", "<C-a>", function()
require("dial.map").manipulate("increment", "visual")
end)
vim.keymap.set("v", "<C-x>", function()
require("dial.map").manipulate("decrement", "visual")
end)
vim.keymap.set("v", "g<C-a>", function()
require("dial.map").manipulate("increment", "gvisual")
end)
vim.keymap.set("v", "g<C-x>", function()
require("dial.map").manipulate("decrement", "gvisual")
end)
<

==============================================================================
CONFIGURATIONS *dial-config*

Expand Down Expand Up @@ -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
<C-a>.
>
vim.keymap.set("n", "<C-a>", 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", "<C-a>", require("dial.map").inc_normal(), {noremap = true}
vim.keymap.set(
"n", "<C-a>", require("dial.map").inc_normal()
)
<

Expand Down
14 changes: 2 additions & 12 deletions lua/dial/command.lua
Expand Up @@ -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)
Expand All @@ -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
Expand Down
21 changes: 20 additions & 1 deletion lua/dial/map.lua
Expand Up @@ -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 .. "()")
Expand All @@ -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)
Expand Down

0 comments on commit 0fb00f5

Please sign in to comment.