Re: [code] [textadept] Key Modes

From: Qwerky <mr.qwerky.att.gmail.com>
Date: Wed, 10 Jul 2019 10:13:26 -0600

Hello,

On 2019-07-09 18:51, Mitchell wrote:
> Hi,
>
> On Tue, 9 Jul 2019, Qwerky wrote:
>
>> Hi,
>>
>> On 2019-07-09 17:11, Mitchell wrote:
>>> Hi,
>>>
>>> On Tue, 9 Jul 2019, Qwerky wrote:
>>>
>>>> Hello,
>>>>
>>>> On 2019-07-09 09:43, Mitchell wrote:
>>>>> Hi,
>>>>>
>>>>> On Mon, 8 Jul 2019, Qwerky wrote:
>>>>>
>>>>>> Hello. Key bindings provide for key modes which, according to the
>>>>>> documentation, provide a set of key bindings which are executed when
>>>>>> that
>>>>>> mode is active, to the exclusion of all other key bindings.
>>>>>>
>>>>>> Is it possible to have a mode, whose key bindings simply replace the
>>>>>> same-named bindings while that mode is active, without blocking all
>>>>>> other
>>>>>> bindings[1]?
>>>>>>
>>>>>> An example would be a rectangular-select mode which, when active,
>>>>>> would
>>>>>> replace bindings such as caret-left-extend with
>>>>>> caret-left-rectangular-extend, and so forth; but would not block
>>>>>> other
>>>>>> bindings, such as caret-left, line-down, etc. This would be
>>>>>> extremely
>>>>>> useful,
>>>>>> in the given example, for making selection easier by not having
>>>>>> to hold
>>>>>> down
>>>>>> the Alt key, and would also free up Alt key combinations for other
>>>>>> functions.
>>>>>>
>>>>>> [1] The mode may also provide new bindings which do not exist
>>>>>> outside
>>>>>> the
>>>>>> mode.
>>>>>
>>>>> Yes, I'm pretty sure this is possible. In your
>>>>> *~/.textadept/init.lua*:
>>>>>
>>>>> keys.my_mode = setmetatable({
>>>>> esc = function() keys.MODE = nil end, -- exit mode
>>>>> -- keys to handle specially go here
>>>>> }, {__index = function()
>>>>> return false -- propagate everything else
>>>>> end})
>>>>>
>>>>> Then set `keys.MODE = 'my_mode'` to initialize it (e.g. via a
>>>>> function
>>>>> bound to a key). Escape key, or whatever else you set, will go
>>>>> back to
>>>>> "normal" mode.
>>>>>
>>>>> Cheers,
>>>>> Mitchell
>>>>
>>>> Thanks a lot for the example code, but unfortunately I can't get it to
>>>> work.
>>>> I copied your code to my init.lua, and then added two keys:
>>>> 'sright' to
>>>> extend rectangular selection to the right, and 'sdown' to extend
>>>> rectangular
>>>> selection down; and in my keys.lua added 'cl' to set keys.MODE to
>>>> my_mode.
>>>> When I press Control-L, the status bar becomes blank (presumably
>>>> because I
>>>> have the buffer status written to statusbar, and have bufstatusbar
>>>> cleared);
>>>> but when I press Shift-Right or Shift-Down (or any other key), it
>>>> simply
>>>> performs its normal function, and the status bar info returns.
>>>> Here's what
>>>> I
>>>> now have:
>>>>
>>>> keys.my_mode = setmetatable({
>>>> esc = function() keys.MODE = nil end, -- exit mode
>>>> -- keys to handle specially go here
>>>> sdown = buffer.line_down_rect_extend,
>>>> sright = buffer.char_right_rect_extend
>>>> }, {__index = function()
>>>> return false -- propagate everything else
>>>> end})
>>>>
>>>> And have also tried ['sdown'] and ['sright'] with the same
>>>> results. (Also
>>>> tried keys['sdown'], but that gave an error.) Where is the problem?
>>>
>>> Please post your 'cl' keybinding.
>>>
>>> Cheers,
>>> Mitchell
>>
>> This is what I have now:
>>
>> keys.cl = function()
>> keys.MODE = my_mode
>> ui.bufstatusbar_text = 'MY MODE'
>> end
>>
>> Before that, it was just:
>>
>> keys.cl = function() keys.MODE = my_mode end
>
> You need 'my_mode' to be a string. When used as an identifier, its
> value is `nil`, so `keys.MODE` is being set to `nil`, which means
> default behavior.
>
> keys.cl = function() keys.MODE = 'my_mode' end
>
> Cheers,
> Mitchell

Duh! After correcting my dumb mistake, it now works as intended. Thanks!

But after a little investigation, I'm not sure if this is the right
path. Although there are rectangular selection functions such as
buffer.char_left_rect_extend, etc., I can't find any .lua module which
contains references to them, apart from /core/iface.lua, which
references leave me baffled. Additionally, although I see keys like
'sleft' bound to a selection function, I can't find where any Alt keys
such as 'asleft' are bound to functions.

So I suppose that somewhere there is code that says "if alt and shift
are both down, change selection mode from stream to rectangular." If
that is the case, then even though my special mode would allow using
'sright' for rectangular selection, it may still not allow 'asright' to
be bound to some other function without interference between that other
function, and the "alt+shift" code mentioned?

qwerky

-- 
You are subscribed to code.att.foicica.com.
To change subscription settings, send an e-mail to code+help.att.foicica.com.
To unsubscribe, send an e-mail to code+unsubscribe.att.foicica.com.
Received on Wed 10 Jul 2019 - 12:13:26 EDT

This archive was generated by hypermail 2.2.0 : Thu 11 Jul 2019 - 06:34:14 EDT