@@ -22,19 +22,87 @@ def change_setting(self, command_line, widget_proxy, live):
2222 """Change a setting in the ini file"""
2323 pass # different for main and pref view; defined in respective files
2424
25+
2526class ClidTextfield (npy .wgtextbox .Textfield ):
27+ """Normal textbox with home and end keys working"""
2628 def set_up_handlers (self ):
2729 super ().set_up_handlers ()
2830 self .handlers [curses .KEY_END ] = self .h_end
2931 self .handlers [curses .KEY_HOME ] = self .h_home
3032
31- def h_home (self , char ):
33+ def h_home (self , input ):
3234 self .cursor_position = 0
3335
34- def h_end (self , char ):
36+ def h_end (self , input ):
3537 self .cursor_position = len (self .value )
3638
3739
40+ class ClidVimTextfield (ClidTextfield ):
41+ """Textfield class to be used as input boxes for tag fields when editing tags
42+ if vim mode is enabled.
43+ """
44+ def __init__ (self , * args , ** kwargs ):
45+ self .vim_handlers = {
46+ # movement
47+ 'k' : self .h_exit_up ,
48+ 'j' : self .h_exit_down ,
49+ 'h' : self .h_cursor_left ,
50+ 'l' : self .h_cursor_right ,
51+ curses .ascii .SP : self .h_cursor_right , # Space
52+ curses .KEY_BACKSPACE : self .h_cursor_left ,
53+ # deletion
54+ 'X' : self .h_delete_left ,
55+ 'x' : self .h_delete_right ,
56+ # insert chars
57+ 'i' : self .h_vim_insert_mode ,
58+ 'a' : self .h_vim_append_char ,
59+ 'A' : self .h_vim_append_char_at_end ,
60+ }
61+ super ().__init__ (* args , ** kwargs ) # set_up_handlers is called in __init__
62+
63+ def vim_add_handlers (self ):
64+ """Add vim keybindings to list of keybindings"""
65+ self .add_handlers (self .vim_handlers )
66+
67+ def vim_remove_handlers (self ):
68+ """Remove vim keybindings from list of keybindings"""
69+ for handler in self .vim_handlers :
70+ del self .handlers [handler ]
71+ self .handlers [curses .KEY_BACKSPACE ] = self .h_delete_left # else nothing will happen
72+
73+ def set_up_handlers (self ):
74+ super ().set_up_handlers ()
75+ self .vim_add_handlers ()
76+ self .handlers [curses .ascii .ESC ] = self .h_vim_normal_mode # is a bit slow
77+
78+ def h_addch (self , input ):
79+ if self .parent .in_insert_mode : # add characters only if in insert mode
80+ super ().h_addch (input )
81+
82+ def h_vim_insert_mode (self , input ):
83+ """Enter insert mode"""
84+ self .parent .in_insert_mode = True
85+ self .vim_remove_handlers () # else `k`, j`, etc will not be added to text(will still act as keybindings)
86+
87+ def h_vim_normal_mode (self , input ):
88+ """Exit insert mode by pressing Esc"""
89+ self .parent .in_insert_mode = False
90+ self .cursor_position -= 1 # just like in vim
91+ self .vim_add_handlers () # removed earlier when going to insert mode
92+
93+ def h_vim_append_char (self , input ):
94+ """Append characters, like `a` in vim"""
95+ self .h_vim_insert_mode (input )
96+ self .cursor_position += 1
97+
98+ def h_vim_append_char_at_end (self , input ):
99+ """Add characters to the end of the line, like `A` in vim"""
100+ self .h_vim_insert_mode (input )
101+ self .h_end (input ) # go to the end
102+
103+ class ClidVimTitleText (npy .TitleText ):
104+ _entry_type = ClidVimTextfield
105+
38106class ClidTitleText (npy .TitleText ):
39107 _entry_type = ClidTextfield
40108
0 commit comments