cursor movement in right-to-left mode



  • Hi everyone,

    Arrow key navigation seems to be defined so that right arrow always moves the cursor FORWARD. This is counter-intuitive in RTL mode, as “forward” is now in the LEFT direction, and all other programs I know work that way. Would the developers consider changing this? In the meantime, can anyone help with a workaround? I.e. can the arrow keys be mapped differently for RTL and LTR modes?

    Thank you very much,
    Nir



  • @Nir-Nagid

    you could do it with a python script

    _g = globals()                                                                  # global variable used to check status
    if not _g.get('SWITCHED_TO_RTL'):                                               # if variable not defined yet,
        SWITCHED_TO_RTL = False 
    
    # ----------------------------------------------------------------------------- 
    
    def main():                                                                     # main function to handle start/stop behavior
        global SWITCHED_TO_RTL                                                      # assining to global variable
        if SWITCHED_TO_RTL:                                                         # if currently in RTL mode
            SWITCHED_TO_RTL = False                                                 #   set flag to False
            editor.assignCmdKey(KEYS.RIGHT,2306)                                    #   and remap arrow and
            editor.assignCmdKey(KEYS.LEFT,2304)                                     #   left arrow key to default                                                    
            notepad.menuCommand(MENUCOMMAND.EDIT_LTR)                               #   change view mode back to LTR
        else:                                                                       # else
            SWITCHED_TO_RTL = True                                                  #   set the flag to true
            editor.assignCmdKey(KEYS.RIGHT,2304)                                    #   and remap arrow and
            editor.assignCmdKey(KEYS.LEFT,2306)                                     #   left arrow key         
            notepad.menuCommand(MENUCOMMAND.EDIT_RTL)                               #   change view mode to LTR
    # ----------------------------------------------------------------------------- 
            
    main()
    

    When running the script for the first time it remaps the left and right arrow key and changes the view to RTL,
    next run would reverse the changes.

    Cheers
    Claudia



  • Thank you very much Claudia, but I since realized the problem goes deeper (or is the following a separate problem?). The “push” mechanism for RTL languages in LTR mode is a bit screwy. Here’s an example: make sure you’re in LTR mode; on a blank line, enter “א”, space, “1”; on anther, enter “1”, space, “א”. Both lines look the same: “1 א” :(.

    Also, if you select the first letter in the first line, it LOOKS like the 1 is selected, but cut’n’paste it, and you’ll find the “real” first char, “א”, is the one that was selected.

    Developers? Workaround? Any other insights?

    Thank you,
    Nir



  • I’ve been working with this problem for years now… Never found a workaround - I’d love it if there was, however, it seems like most programs have this problem. Microsoft Word is one of the only programs that deal with this excellently!



  • @Nir-Nagid

    I think this is a problem of some of the lexers because if I try to do it and having python as language set it doesn’t happen.
    But if I have normal text as language, then it happens. You can workaround it by defining an empty udl and use it as “YOUR_NORMAL_TEXT”.

    Btw I guess there is a need to have more shortcuts reassigned. The once, I think, are useful are

    _g = globals()                                                                      # global variable used to check status
    if not _g.get('SWITCHED_TO_RTL'):                                                   # if variable not defined yet,
        SWITCHED_TO_RTL = False 
    
    # ----------------------------------------------------------------------------- 
    
    def main():                                                                         # main function to handle start/stop behavior
        global SWITCHED_TO_RTL                                                          # assining to global variable
        if SWITCHED_TO_RTL:                                                             # if currently in RTL mode
            SWITCHED_TO_RTL = False                                                     #   set flag to False (default)
            editor.assignCmdKey(KEYS.LEFT, 2304)                                        #   char left                                                    
            editor.assignCmdKey(KEYS.LEFT + (KEYMOD.SHIFT << 16), 2305)                 #   char left extend
            editor.assignCmdKey(KEYS.LEFT + (KEYMOD.SHIFT + KEYMOD.ALT << 16), 2428)    #   char left rect extend
            editor.assignCmdKey(KEYS.LEFT + (KEYMOD.CTRL << 16), 2308)                  #   word left
            editor.assignCmdKey(KEYS.LEFT + (KEYMOD.SHIFT + KEYMOD.CTRL << 16), 2309)   #   word left extend
            
            editor.assignCmdKey(KEYS.RIGHT, 2306)                                       #   char right
            editor.assignCmdKey(KEYS.RIGHT + (KEYMOD.SHIFT << 16), 2307)                #   char right extend
            editor.assignCmdKey(KEYS.RIGHT + (KEYMOD.SHIFT + KEYMOD.ALT << 16), 2429)   #   char right rect extend
            editor.assignCmdKey(KEYS.RIGHT + (KEYMOD.CTRL << 16), 2310)                 #   word right
            editor.assignCmdKey(KEYS.RIGHT + (KEYMOD.SHIFT + KEYMOD.CTRL << 16), 2311)  #   word right extend
            
            notepad.menuCommand(MENUCOMMAND.EDIT_LTR)                                   #   change view mode back to LTR
        else:                                                                           # else
            SWITCHED_TO_RTL = True                                                      #   set the flag to true (RTL mode)
            editor.assignCmdKey(KEYS.RIGHT, 2304)                                       #   
            editor.assignCmdKey(KEYS.RIGHT + (KEYMOD.SHIFT << 16), 2305)                #   
            editor.assignCmdKey(KEYS.RIGHT + (KEYMOD.SHIFT + KEYMOD.ALT << 16), 2428)   #   
            editor.assignCmdKey(KEYS.RIGHT + (KEYMOD.CTRL << 16), 2308)                 #   
            editor.assignCmdKey(KEYS.RIGHT + (KEYMOD.SHIFT + KEYMOD.CTRL << 16), 2309)  #   
            
            editor.assignCmdKey(KEYS.LEFT, 2306)                                        #   
            editor.assignCmdKey(KEYS.LEFT + (KEYMOD.SHIFT << 16), 2307)                 #   
            editor.assignCmdKey(KEYS.LEFT + (KEYMOD.SHIFT + KEYMOD.ALT << 16), 2429)    #   
            editor.assignCmdKey(KEYS.LEFT + (KEYMOD.CTRL << 16), 2310)                  #   
            editor.assignCmdKey(KEYS.LEFT + (KEYMOD.SHIFT + KEYMOD.CTRL << 16), 2311)   #         
            notepad.menuCommand(MENUCOMMAND.EDIT_RTL)                                   #   change view mode to RTL
    # ----------------------------------------------------------------------------- 
            
    main()
    

    Cheers
    Claudia



  • Hello all,

    @Claudia,
    Welcome back. :)

    And thanks for the script.
    Two comments:

    1. editor1 and editor2 if you want to apply the keys to both views.
    2. Ctrl + (reassigned) Arrow does not work properly when using a RTL language in LTR mode (and vice versa).

    @Nir,
    Scintilla does not fully support RTL. We should raise the issue there more frequently.

    @Davey,
    EditPad is quite a good editor which fully supports RTL and bidi.
    You can set the behavior of the left/right arrows in Options -> Configure File Types -> Editor Options -> Default text layout -> Edit.
    (I use the PRO version).

    InsertText

    Best regards.



  • @Yaron,
    Hi and thanks for the suggestion.
    My problem is that I am referring to coding - i.e., in my code I have Hebrew text (e.g. messages, dialogs etc.) and it’s extremely difficult to work with!
    So, since I use n++ for coding (as I developed a custom syntax using UDL2 as well as functions hints and function list), using editPad is not really relevant in my case… unless there’s more there than I expect… :)

    Thanks,
    David



  • Hello David,

    You’re welcome.

    NPP is undoubtedly a great editor. Combining Latin and Hebrew, however, is much easier with EditPad.
    It is a developer editor and you can set a custom syntax highlight.

    I use a toolbar button in both editors to open the current file (and line) in the other editor.

    In NPP:
    <Command name="פתח ב- EditPad..." Ctrl="no" Alt="no" Shift="no" Key="0">&quot;C:\Program Files\EditPad Pro\EditPadPro7.exe&quot; &quot;$(FULL_CURRENT_PATH)&quot; /l$(CURRENT_LINE)</Command>

    and in EditPad:
    "C:\Program Files\Notepad++\NP\notepad++.exe" "%FILE%" -n%LINE%.

    Best regards.