79 lines
1.9 KiB
Lua
79 lines
1.9 KiB
Lua
|
-- 依次定字
|
||
|
-- 来源:
|
||
|
-- https://github.com/BlindingDark/rime-lua-select-character/blob/master/lua/select_character.lua
|
||
|
-- http://lua-users.org/lists/lua-l/2014-04/msg00590.html
|
||
|
local function utf8_sub(s, i, j)
|
||
|
i = i or 1
|
||
|
j = j or -1
|
||
|
|
||
|
if i < 1 or j < 1 then
|
||
|
local n = utf8.len(s)
|
||
|
if not n then return nil end
|
||
|
if i < 0 then i = n + 1 + i end
|
||
|
if j < 0 then j = n + 1 + j end
|
||
|
if i < 0 then i = 1 elseif i > n then i = n end
|
||
|
if j < 0 then j = 1 elseif j > n then j = n end
|
||
|
end
|
||
|
|
||
|
if j < i then return "" end
|
||
|
|
||
|
i = utf8.offset(s, i)
|
||
|
j = utf8.offset(s, j + 1)
|
||
|
|
||
|
if i and j then
|
||
|
return s:sub(i, j - 1)
|
||
|
elseif i then
|
||
|
return s:sub(i)
|
||
|
else
|
||
|
return ""
|
||
|
end
|
||
|
end
|
||
|
|
||
|
local function first_character(s)
|
||
|
return utf8_sub(s, 1, 1)
|
||
|
end
|
||
|
|
||
|
local function last_character(s)
|
||
|
return utf8_sub(s, -1, -1)
|
||
|
end
|
||
|
|
||
|
local function get_commit_text(context, fun)
|
||
|
local candidate_text = context:get_selected_candidate().text
|
||
|
local selected_character = fun(candidate_text)
|
||
|
|
||
|
context:clear_previous_segment()
|
||
|
local commit_text = context:get_commit_text()
|
||
|
|
||
|
context:clear()
|
||
|
|
||
|
return commit_text .. selected_character
|
||
|
end
|
||
|
|
||
|
local function select_character(key, env)
|
||
|
local engine = env.engine
|
||
|
local context = engine.context
|
||
|
local config = engine.schema.config
|
||
|
|
||
|
-- 选择开头字
|
||
|
local first_key = config:get_string('key_binder/select_first_character') or 'bracketleft'
|
||
|
-- 选择末尾字
|
||
|
local last_key = config:get_string('key_binder/select_last_character') or 'bracketright'
|
||
|
|
||
|
local commit_text = context:get_commit_text()
|
||
|
|
||
|
if (key:repr() == first_key and commit_text ~= "") then
|
||
|
engine:commit_text(get_commit_text(context, first_character))
|
||
|
|
||
|
return 1 -- kAccepted
|
||
|
end
|
||
|
|
||
|
if (key:repr() == last_key and commit_text ~= "") then
|
||
|
engine:commit_text(get_commit_text(context, last_character))
|
||
|
|
||
|
return 1 -- kAccepted
|
||
|
end
|
||
|
|
||
|
return 2 -- kNoop
|
||
|
end
|
||
|
|
||
|
return select_character
|