Re: [code] [textadept] Key Modes

From: Qwerky <mr.qwerky.att.gmail.com>
Date: Wed, 10 Jul 2019 15:21:41 -0600

Hi,

On 2019-07-10 12:21, Mitchell wrote:
> Hi,
>
> On Wed, 10 Jul 2019, Qwerky wrote:
>
>> 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?
>
> Textadept's underlying text component, Scintilla, has some default key
> bindings that trigger if Textadept does not consume them.
> Alt+Shift+Arrow for rectangular selection are some of them. If you
> want to manually toggle between selection modes, you can try changing
> `buffer.selection_mode`[1], but it could be buggy. You can bind
> 'asleft' to whatever you want, but yes, Scintilla will no longer
> handle it as rectangular selection left arrow.
>
> Cheers,
> Mitchell
>
> [1]: https://foicica.com/textadept/api.html#buffer.selection_mode

Even though I bind Alt-Shift with Arrow/Home/End/PgUp/PgDn/etc., the
bindings I specify do not activate.  Rather, the Scintilla-defined
rectangular-selection functions operate.  I haven't been able to
overcome that.  Do you have any other suggestions?

Thanks,

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 - 17:21:41 EDT

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