OSDN Git Service

TEXT_BINDINGS stay in textwidget.py.
authorSimon Forman <sforman@hushmail.com>
Sun, 22 Jul 2018 17:14:45 +0000 (10:14 -0700)
committerSimon Forman <sforman@hushmail.com>
Sun, 22 Jul 2018 17:14:45 +0000 (10:14 -0700)
joy/gui/main.py
joy/gui/textwidget.py

index 1368f4b..150028c 100755 (executable)
@@ -24,9 +24,10 @@ logging.basicConfig(
   filename=os.path.join(JOY_HOME, 'thun.log'),
   level=logging.INFO,
   )
+_log.info('Starting with JOY_HOME=%s', JOY_HOME)
 
 
-from joy.gui.textwidget import TextViewerWidget, tk, get_font, TEXT_BINDINGS
+from joy.gui.textwidget import TextViewerWidget, tk, get_font
 from joy.gui.world import StackDisplayWorld
 from joy.library import initialize
 from joy.utils.stack import stack_to_string
@@ -41,16 +42,6 @@ with open(os.path.join(args.joy_home, 'thun.config')) as f:
 GLOBAL_COMMANDS = dict(cp.items('key bindings'))
 
 
-tb = TEXT_BINDINGS.copy()
-tb.update({
-  '<F3>': lambda tv: tv.copy_selection_to_stack,
-  '<Shift-F3>': lambda tv: tv.cut,
-  '<F4>': lambda tv: tv.copyto,
-  '<Shift-F4>': lambda tv: tv.pastecut,
-  })
-defaults = dict(text_bindings=tb, width=80, height=25)
-
-
 def repo_relative_path(path):
   return os.path.relpath(
     path,
@@ -58,73 +49,71 @@ def repo_relative_path(path):
     )
 
 
-def key_bindings(*args):
-  commands = [
-    'Control-Enter - Run the selection as Joy code.',
-    'F3 - Copy selection to stack.',
-    'Shift-F3 - Cut selection to stack.',
-    'F4 - Paste item on top of stack to insertion cursor.',
-    'Shift-F4 - Pop and paste top of stack to insertion cursor.',
-    ]
-  for key, command in GLOBAL_COMMANDS.iteritems():
-    commands.append('%s - %s' % (key.strip('<>'), command))
-  print '\n'.join([''] + sorted(commands))
-  return args
+def commands():
+  # pylint: disable=unused-variable
+
+  def key_bindings(*args):
+    commands = [  # These are bound in the TextViewerWidget.
+      'Control-Enter - Run the selection as Joy code, or if there\'s no selection the line containing the cursor.',
+      'F3 - Copy selection to stack.',
+      'Shift-F3 - Cut selection to stack.',
+      'F4 - Paste item on top of stack to insertion cursor.',
+      'Shift-F4 - Pop and paste top of stack to insertion cursor.',
+      ]
+    for key, command in GLOBAL_COMMANDS.iteritems():
+      commands.append('%s - %s' % (key.lstrip('<').rstrip('>'), command))
+    print '\n'.join([''] + sorted(commands))
+    return args
+
 
+  def mouse_bindings(*args):
+    print dedent('''
+      Mouse button chords (to cancel a chord, click the third mouse button.)
 
-def mouse_bindings(*args):
-  print dedent('''
-    Mouse button chords (to cancel a chord, click the third mouse button.)
+      Left - Point, sweep selection
+      Left-Middle - Copy the selection, place text on stack
+      Left-Right - Run the selection as Joy code
 
-    Left - Point, sweep selection
-    Left-Middle - Copy the selection, place text on stack
-    Left-Right - Run the selection as Joy code
+      Middle - Paste selection (bypass stack); click and drag to scroll.
+      Middle-Left - Paste from top of stack, preserve
+      Middle-Right - Paste from top of stack, pop
 
-    Middle - Paste selection (bypass stack); click and drag to scroll.
-    Middle-Left - Paste from top of stack, preserve
-    Middle-Right - Paste from top of stack, pop
+      Right - Execute command word under mouse cursor
+      Right-Left - Print docs of command word under mouse cursor
+      Right-Middle - Lookup word (kinda useless now)
+      ''')
+    return args
 
-    Right - Execute command word under mouse cursor
-    Right-Left - Print docs of command word under mouse cursor
-    Right-Middle - Lookup word (kinda useless now)
-    ''')
-  return args
 
+  def reset_log(*args):
+    log.delete('0.0', tk.END)
+    print __doc__
+    return args
 
-def reset_log(*args):
-  log.delete('0.0', tk.END)
-  print __doc__
-  return args
 
+  def show_log(*args):
+    log_window.wm_deiconify()
+    log_window.update()
+    return args
 
-def show_log(*args):
-  log_window.wm_deiconify()
-  log_window.update()
-  return args
 
+  def grand_reset(s, e, d):
+    stack = world.load_stack() or ()
+    log.reset()
+    t.reset()
+    return stack, e, d
 
-def grand_reset(s, e, d):
-  stack = world.load_stack() or ()
-  log.reset()
-  t.reset()
-  return stack, e, d
+  return locals()
 
 
-_log.info('Starting.')
 STACK_FN = os.path.join(JOY_HOME, 'stack.pickle')
 REL_STACK_FN = repo_relative_path(STACK_FN)
 JOY_FN = os.path.join(JOY_HOME, 'scratch.txt')
 LOG_FN = os.path.join(JOY_HOME, 'log.txt')
 D = initialize()
-for func in (
-  reset_log,
-  show_log,
-  grand_reset,
-  key_bindings,
-  mouse_bindings,
-  ):
-  D[func.__name__] = func
+D.update(commands())
 world = StackDisplayWorld(repo, STACK_FN, REL_STACK_FN, dictionary=D)
+defaults = dict(width=80, height=25)
 t = TextViewerWidget(world, **defaults)
 log_window = tk.Toplevel()
 log_window.protocol("WM_DELETE_WINDOW", log_window.withdraw)
@@ -133,8 +122,9 @@ FONT = get_font('Iosevka', size=14)  # Requires Tk root already set up.
 log.init('Log', LOG_FN, repo_relative_path(LOG_FN), repo, FONT)
 t.init('Joy - ' + JOY_HOME, JOY_FN, repo_relative_path(JOY_FN), repo, FONT)
 for event, command in GLOBAL_COMMANDS.items():
-  t.bind(event, lambda _, _command=command: world.interpret(_command))
-  log.bind(event, lambda _, _command=command: world.interpret(_command))
+  callback = lambda _, _command=command: world.interpret(_command)
+  t.bind(event, callback)
+  log.bind(event, callback)
 
 
 def main():
index 47e3db6..02defe8 100644 (file)
@@ -73,10 +73,14 @@ def get_font(family='EB Garamond', size=14):
 TEXT_BINDINGS = {
 
   #I want to ensure that these keyboard shortcuts work.
+  '<Control-Return>': lambda tv: tv._control_enter,
   '<Control-v>': lambda tv: tv._paste,
   '<Control-V>': lambda tv: tv._paste,
+  '<F3>': lambda tv: tv.copy_selection_to_stack,
+  '<F4>': lambda tv: tv.copyto,
+  '<Shift-F3>': lambda tv: tv.cut,
+  '<Shift-F4>': lambda tv: tv.pastecut,
   '<Shift-Insert>': lambda tv: tv._paste,
-  '<Control-Return>': lambda tv: tv._control_enter,
   }