[Geany] Editor navigation custom keybindings

Lex Trotman elextr at xxxxx
Wed Feb 9 21:25:36 UTC 2011


Todd,

Couple of comments below that may be helpful

On 9 February 2011 22:48, Todd Chambery <todd.chambery at gmail.com> wrote:

> A newbie question:  How do I print out the strings?
>
> Copying some methods within the geany code, the below builds:
>
>
> [keys]
> line_down=C+K CA+K
> line_up=C+I CA+I
>

The string list separator is semicolon not space


>
> static void setup_sci_keys(ScintillaObject *sci)
> {
> gchar *keyconfigfile;
>  GKeyFile *keyconfig = g_key_file_new();
> keyconfigfile = g_strconcat(app->configdir, G_DIR_SEPARATOR_S, "keys.conf",
> NULL);
>  g_key_file_load_from_file(keyconfig, keyconfigfile, G_KEY_FILE_NONE,
> NULL);
>  get_keybindings(keyconfig);
>
>  g_free(keyconfigfile);
> g_key_file_free(keyconfig);
>
>
Above looks ok at first glance except for absence of error checking that
would be required in production version


>
> static void get_keybindings(GKeyFile *config)
> {
>  const gchar group[] = "keys";
> gchar **keys = g_key_file_get_keys(config, group, NULL, NULL);
>  gchar **ptr = keys;
>
>  gchar **list;
> gsize len;
>
> if (!ptr)
>  return;
>
>  while (1)
> {
>  const gchar *key = *ptr;
>
>  if (!key)
> break;
>
> list = g_key_file_get_string_list(config, group, key, &len, NULL);
> // int i=0;
> // for(i<list.length; i++) {
> // printf("%s", list[i]);
> // }
>  }
> g_strfreev(keys);
> }
>
>
>

You never increment ptr in the while loop so you only ever get the first
list. Instead of the while use:

for (ptr = keys; *ptr; ++ptr)
{
/*get the strings*/
}

and use the same thing to itterate over the strings returned in the list,
your commented out list.length won't work

You can safely pass *ptr as the key to g_key_file_get_string, you don't need
key inside the loop

You don't free the list returned, probable memory leak

Cheers
Lex


>
>
> On Sun, Jan 30, 2011 at 8:42 PM, Lex Trotman <elextr at gmail.com> wrote:
>
>>
>>
>> On 31 January 2011 12:15, Todd Chambery <todd.chambery at gmail.com> wrote:
>>
>>> Just browsing the Notepad++ code, it looks like this is the method to
>>> update Scintilla's mappings:
>>>
>>> void ScintillaAccelerator::updateKeys()
>>> {
>>> NppParameters *pNppParam = NppParameters::getInstance();
>>>  vector<ScintillaKeyMap> & map = pNppParam->getScintillaKeyList();
>>>  size_t mapSize = map.size();
>>> size_t index;
>>>
>>> for(int i = 0; i < _nrScintillas; i++)
>>>  {
>>> ::SendMessage(_vScintillas[i], SCI_CLEARALLCMDKEYS, 0, 0);
>>>  for(size_t j = mapSize - 1; j >= 0; j--) //reverse order, top of the
>>> list has highest priority
>>>  {
>>>  ScintillaKeyMap skm = map[j];
>>> if (skm.isEnabled())
>>>  { //no validating, scintilla accepts more keys
>>>  size_t size = skm.getSize();
>>> for(index = 0; index < size; index++)
>>>  *::SendMessage(_vScintillas[i], SCI_ASSIGNCMDKEY, skm.toKeyDef(index),
>>> skm.getScintillaKeyID());*
>>>  }
>>> if (skm.getMenuCmdID() != 0)
>>>  {
>>> updateMenuItemByID(skm, skm.getMenuCmdID());
>>>  }
>>> if (j == 0) //j is unsigned, so default method doesnt work
>>>  break;
>>> }
>>>  }
>>> }
>>>
>>> where they send a map of Scintilla key codes to each of the buffers?
>>>
>>
>> Yes, Geany has a binding for sending the SCI_ASSIGNCMDKEY message but it
>> isn't used anywhere.  All you need to do is write code to read the settings
>> and shove them into Scintilla.*
>>
>> *
>>
>>>
>>> Here is my Scintilla config from Notepad++:
>>>
>>>     <ScintillaKeys>
>>>         <ScintKey ScintID="2302" menuCmdID="0" Ctrl="yes" Alt="yes"
>>> Shift="no" Key="73">
>>>             <NextKey Ctrl="yes" Alt="no" Shift="no" Key="73" />
>>>         </ScintKey>
>>>         <ScintKey ScintID="2300" menuCmdID="0" Ctrl="yes" Alt="yes"
>>> Shift="no" Key="75">
>>>             <NextKey Ctrl="yes" Alt="no" Shift="no" Key="75" />
>>>         </ScintKey>
>>>         <ScintKey ScintID="2308" menuCmdID="0" Ctrl="yes" Alt="no"
>>> Shift="no" Key="37">
>>>             <NextKey Ctrl="yes" Alt="yes" Shift="no" Key="74" />
>>>         </ScintKey>
>>>         <ScintKey ScintID="2310" menuCmdID="0" Ctrl="yes" Alt="no"
>>> Shift="no" Key="39">
>>>             <NextKey Ctrl="yes" Alt="yes" Shift="no" Key="76" />
>>>         </ScintKey>
>>>         <ScintKey ScintID="2307" menuCmdID="0" Ctrl="no" Alt="no"
>>> Shift="yes" Key="39">
>>>             <NextKey Ctrl="yes" Alt="no" Shift="yes" Key="76" />
>>>         </ScintKey>
>>>         <ScintKey ScintID="2337" menuCmdID="0" Ctrl="no" Alt="no"
>>> Shift="no" Key="0" />
>>>         <ScintKey ScintID="2338" menuCmdID="0" Ctrl="yes" Alt="no"
>>> Shift="no" Key="69" />
>>>         <ScintKey ScintID="2304" menuCmdID="0" Ctrl="no" Alt="no"
>>> Shift="no" Key="37">
>>>             <NextKey Ctrl="yes" Alt="no" Shift="no" Key="74" />
>>>         </ScintKey>
>>>         <ScintKey ScintID="2453" menuCmdID="0" Ctrl="no" Alt="no"
>>> Shift="no" Key="36">
>>>             <NextKey Ctrl="yes" Alt="no" Shift="no" Key="72" />
>>>         </ScintKey>
>>>         <ScintKey ScintID="2451" menuCmdID="0" Ctrl="no" Alt="no"
>>> Shift="no" Key="35">
>>>             <NextKey Ctrl="yes" Alt="no" Shift="no" Key="186" />
>>>         </ScintKey>
>>>         <ScintKey ScintID="2180" menuCmdID="42006" Ctrl="no" Alt="no"
>>> Shift="no" Key="46">
>>>             <NextKey Ctrl="yes" Alt="no" Shift="no" Key="68" />
>>>         </ScintKey>
>>>         <ScintKey ScintID="2442" menuCmdID="0" Ctrl="yes" Alt="no"
>>> Shift="yes" Key="0" />
>>>         <ScintKey ScintID="2311" menuCmdID="0" Ctrl="yes" Alt="yes"
>>> Shift="yes" Key="76">
>>>             <NextKey Ctrl="yes" Alt="no" Shift="yes" Key="39" />
>>>         </ScintKey>
>>>         <ScintKey ScintID="2301" menuCmdID="0" Ctrl="yes" Alt="no"
>>> Shift="yes" Key="75">
>>>             <NextKey Ctrl="yes" Alt="yes" Shift="yes" Key="75" />
>>>         </ScintKey>
>>>         <ScintKey ScintID="2303" menuCmdID="0" Ctrl="yes" Alt="no"
>>> Shift="yes" Key="73">
>>>             <NextKey Ctrl="yes" Alt="yes" Shift="yes" Key="73" />
>>>         </ScintKey>
>>>         <ScintKey ScintID="2309" menuCmdID="0" Ctrl="yes" Alt="no"
>>> Shift="yes" Key="37">
>>>             <NextKey Ctrl="yes" Alt="yes" Shift="yes" Key="74" />
>>>         </ScintKey>
>>>         <ScintKey ScintID="2315" menuCmdID="0" Ctrl="yes" Alt="no"
>>> Shift="yes" Key="186">
>>>             <NextKey Ctrl="yes" Alt="yes" Shift="yes" Key="186" />
>>>         </ScintKey>
>>>         <ScintKey ScintID="2332" menuCmdID="0" Ctrl="no" Alt="no"
>>> Shift="yes" Key="36">
>>>             <NextKey Ctrl="yes" Alt="no" Shift="yes" Key="72" />
>>>         </ScintKey>
>>>         <ScintKey ScintID="2306" menuCmdID="0" Ctrl="no" Alt="no"
>>> Shift="no" Key="39">
>>>             <NextKey Ctrl="yes" Alt="no" Shift="no" Key="76" />
>>>         </ScintKey>
>>>         <ScintKey ScintID="2312" menuCmdID="0" Ctrl="yes" Alt="no"
>>> Shift="no" Key="72">
>>>             <NextKey Ctrl="yes" Alt="yes" Shift="no" Key="72" />
>>>         </ScintKey>
>>>         <ScintKey ScintID="2313" menuCmdID="0" Ctrl="yes" Alt="no"
>>> Shift="yes" Key="72">
>>>             <NextKey Ctrl="yes" Alt="yes" Shift="yes" Key="72" />
>>>         </ScintKey>
>>>         <ScintKey ScintID="2314" menuCmdID="0" Ctrl="yes" Alt="no"
>>> Shift="no" Key="186">
>>>             <NextKey Ctrl="yes" Alt="yes" Shift="no" Key="186" />
>>>         </ScintKey>
>>>         <ScintKey ScintID="2305" menuCmdID="0" Ctrl="no" Alt="no"
>>> Shift="yes" Key="37">
>>>             <NextKey Ctrl="yes" Alt="no" Shift="yes" Key="74" />
>>>         </ScintKey>
>>>     </ScintillaKeys>
>>>
>>> Do the ScintIDs look familiar?
>>>
>>
>> Just guessing what the XML means, but Ids look ok, see Geany source
>> sciltilla/include/Scintilla.h
>>
>> To be compatible with the rest of Geanys config files it would be best to
>> use a GKeyfile format instead of Notepads XML to store the settings.
>>
>> Cheers
>> Lex
>>
>>
>>
>>>
>>> On Sat, Jan 29, 2011 at 2:32 PM, Lex Trotman <elextr at gmail.com> wrote:
>>>
>>>>
>>>>
>>>> On 30 January 2011 01:38, Todd Chambery <todd.chambery at gmail.com>wrote:
>>>>
>>>>> Hi all,
>>>>>
>>>>> Is there a mechanism for customizing the cursor movement keybindings in
>>>>> Geany?
>>>>>
>>>>> I'm a happy Notepad++ user on WIndows, largely because
>>>>> it accommodates my "inverted T" editor navigation keybindings:
>>>>>
>>>>> (http://chambery.subfire.org/images/keybindings-simplified.png)
>>>>>
>>>>> Notepad++ uses Scintilla underneath, maybe I can port these over?
>>>>>
>>>>
>>>> Hi Todd,
>>>>
>>>> You are correct that these keybindings are handled by Scintilla.
>>>> Scintilla can have the keybindings configured, but Geany currently does not
>>>> have the ability to do it.  It could be a useful addition but someones got
>>>> to do it (tm) patches welcome.
>>>>
>>>> Cheers
>>>> Lex
>>>>
>>>> PS doesn't have to be a GUI configurator, just loading a file would do
>>>>
>>>>>
>>>>> Thanks,
>>>>> Todd
>>>>>
>>>>> _______________________________________________
>>>>> Geany mailing list
>>>>> Geany at uvena.de
>>>>> http://lists.uvena.de/cgi-bin/mailman/listinfo/geany
>>>>>
>>>>>
>>>>
>>>> _______________________________________________
>>>> Geany mailing list
>>>> Geany at uvena.de
>>>> http://lists.uvena.de/cgi-bin/mailman/listinfo/geany
>>>>
>>>>
>>>
>>> _______________________________________________
>>> Geany mailing list
>>> Geany at uvena.de
>>> http://lists.uvena.de/cgi-bin/mailman/listinfo/geany
>>>
>>>
>>
>> _______________________________________________
>> Geany mailing list
>> Geany at uvena.de
>> http://lists.uvena.de/cgi-bin/mailman/listinfo/geany
>>
>>
>
> _______________________________________________
> Geany mailing list
> Geany at uvena.de
> http://lists.uvena.de/cgi-bin/mailman/listinfo/geany
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.geany.org/pipermail/users/attachments/20110210/a7f4ac21/attachment.html>


More information about the Users mailing list