home *** CD-ROM | disk | FTP | other *** search
/ CD Actual 3 / CD ACTUAL 3.iso / linux / incoming / jstools-.6v3 / jstools- / jstools-tk3.6v3.0 / lib / jtextvi.tcl < prev    next >
Encoding:
Text File  |  1995-02-05  |  9.4 KB  |  396 lines

  1. # jtextvi.tcl - additional procedures for vi-like Text bindings
  2. # Copyright 1992-1994 by Jay Sekora.  All rights reserved, except 
  3. # that this file may be freely redistributed in whole or in part 
  4. # for non-profit, noncommercial use.
  5. # Essentially, call
  6. #   j:tb:vi_init Text       ---   for vi-like Text bindings
  7. # You can check $j_tb(modified,$WIDGET) to see if a text widget has been
  8. # modified.  (Set it to false when you save the text widget.)
  9.  
  10. # TO DO:
  11. # ^L
  12. # sentence-manipulation stuff
  13. # case change commands, transposition commands
  14. # commands to do with mark?
  15. # word deletion - fix to use buffer
  16. # generalise movement to copying-to-cutbuffer and deletion
  17. # IMPROVE ENTRY BINDINGS
  18. # literal-insert for entry
  19.  
  20. ######################################################################
  21. # j:tb:vi_init t - set vi bindings up for widget $t (possibly "Text")
  22. ######################################################################
  23.  
  24. proc j:tb:vi_init { {t Text} } {
  25.   global j_teb
  26.   set j_teb(cutbuffer) {}
  27.   set j_teb(dragscroll,txnd) 0
  28.   set j_teb(dragscroll,delay) 50
  29.   set j_teb(scanpaste_time) 0
  30.   set j_teb(scanpaste_paste) 1
  31.   
  32.   set j_teb(keymap,$t) vi-command
  33.   
  34.   # in tk4, we need to make sure tkTextBind is called _before_
  35.   #   j:tb:key_bind!
  36.   j:tk4 {tkTextBind Enter}
  37.   
  38.   j:tb:key_bind $t
  39.   j:tb:mouse_bind $t
  40.  
  41.   
  42.   j:tkb:mkmap Text vi-command vi-command {
  43.     {Control-slash        j:tb:select_all}
  44.     {Control-backslash        j:tb:clear_selection}
  45.     
  46.     {Delete            j:tkb:vi:left}
  47.     {BackSpace            j:tkb:vi:left}
  48.     {space            j:tkb:vi:right}
  49.     {minus            j:tkb:vi:minus}
  50.     {plus            j:tkb:vi:plus}
  51.     {Return            j:tkb:vi:plus}
  52.     
  53.     {Up                j:tkb:vi:up}
  54.     {Down            j:tkb:vi:down}
  55.     {Left            j:tkb:vi:left}
  56.     {Right            j:tkb:vi:right}
  57.     
  58.     {Control-p            j:tkb:vi:up}
  59.     {Control-n            j:tkb:vi:down}
  60.     
  61.     {k                j:tkb:vi:up}
  62.     {j                j:tkb:vi:down}
  63.     {h                j:tkb:vi:left}
  64.     {l                j:tkb:vi:right}
  65.  
  66.     {Control-k            j:tkb:vi:up}
  67.     {Control-j            j:tkb:vi:down}
  68.     {Control-h            j:tkb:vi:left}
  69.     {Control-l            j:tkb:vi:right}
  70.     
  71.     {Control-b            j:tkb:scroll_up}
  72.     {Control-f            j:tkb:scroll_down}
  73.     
  74.     {x                j:tkb:delete_right}
  75.     {X                j:tkb:delete_left}
  76.     {b                j:tkb:word_left}
  77.     {B                j:tkb:word_left}
  78.     {e                j:tkb:vi:word_end}
  79.     {w                j:tkb:word_right}
  80.     {W                j:tkb:word_right}
  81.     {G                j:tkb:eof}
  82.     
  83.     {i                j:tkb:vi:insert}
  84.     {I                j:tkb:vi:Insert}
  85.     {a                j:tkb:vi:append}
  86.     {A                j:tkb:vi:Append}
  87.     {o                j:tkb:vi:open}
  88.     {O                j:tkb:vi:Open}
  89.     
  90.     {d                j:tkb:new_mode vi-delete}
  91.     {c                j:tkb:new_mode vi-change}
  92.     
  93.     {D                j:tkb:vi:d-eol}
  94.     {C                j:tkb:vi:c-eol}
  95.  
  96.     {Home            j:tkb:bol}
  97.     {End            j:tkb:eol}
  98.     
  99.     {asciicircum        j:tkb:vi:bol}
  100.     {dollar            j:tkb:vi:eol}
  101.     
  102.     {Next            j:tkb:scroll_down}
  103.     {Prior            j:tkb:scroll_up}
  104.     
  105.     {Escape            j:tkb:vi:clear_count}
  106.     {Control-bracketleft    j:tkb:vi:clear_count}
  107.     
  108.     {1                j:tkb:continue_number}
  109.     {2                j:tkb:continue_number}
  110.     {3                j:tkb:continue_number}
  111.     {4                j:tkb:continue_number}
  112.     {5                j:tkb:continue_number}
  113.     {6                j:tkb:continue_number}
  114.     {7                j:tkb:continue_number}
  115.     {8                j:tkb:continue_number}
  116.     {9                j:tkb:continue_number}
  117.     {0                j:tkb:continue_number}
  118.     
  119.     {Control-DEFAULT        j:tb:beep}
  120.     {DEFAULT            j:tb:beep}
  121.     {Shift-DEFAULT        j:tb:beep}
  122.   }
  123.  
  124.   j:tkb:mkmap Text vi-insert vi-insert {
  125.     {Delete            j:tkb:delete_left}
  126.     {BackSpace            j:tkb:delete_left}
  127.     {Return            j:tkb:insert_newline}
  128.     
  129.     {Control-i            j:tkb:self_insert}
  130.     {Control-j            j:tkb:self_insert}
  131.     {Control-h            j:tkb:delete_left}
  132.     
  133.     {Control-w            j:tkb:delete_left_word}
  134.     {Control-u            j:tkb:vi:delete_left_line}
  135.     
  136.     {Escape            j:tkb:vi:command}
  137.     {Control-bracketleft    j:tkb:vi:command}
  138.     
  139.     {Control-v            j:tkb:new_mode vi-literal}
  140.     
  141.     {Control-DEFAULT        j:tb:beep}
  142.     {DEFAULT            j:tkb:self_insert}
  143.     {Shift-DEFAULT        j:tkb:self_insert}
  144.   }
  145.   
  146.   j:tkb:mkmap Text vi-literal vi-insert {
  147.     {DEFAULT            j:tkb:self_insert}
  148.     {Shift-DEFAULT        j:tkb:self_insert}
  149.     {Control-DEFAULT        j:tkb:self_insert}
  150.     {Meta-DEFAULT        j:tkb:self_insert}
  151.   }
  152.   
  153.   # The following maps are a hideous kludge until generalised command
  154.   # structure can be implemented:
  155.   
  156.   j:tkb:mkmap Text vi-delete vi-command {
  157.     {d                j:tkb:vi:dd}
  158.     {w                j:tkb:vi:dw}
  159.     {W                j:tkb:vi:dw}
  160.     {dollar            j:tkb:vi:d-eol}
  161.     
  162.     {DEFAULT            j:tb:beep}
  163.     {Shift-DEFAULT        j:tb:beep}
  164.     {Control-DEFAULT        j:tb:beep}
  165.     {Meta-DEFAULT        j:tb:beep}
  166.   }
  167.   
  168.   j:tkb:mkmap Text vi-change vi-command {
  169.     {c                j:tkb:vi:cd}
  170.     {w                j:tkb:vi:cw}
  171.     {W                j:tkb:vi:cw}
  172.     {dollar            j:tkb:vi:c-eol}
  173.     
  174.     {DEFAULT            j:tb:beep}
  175.     {Shift-DEFAULT        j:tb:beep}
  176.     {Control-DEFAULT        j:tb:beep}
  177.     {Meta-DEFAULT        j:tb:beep}
  178.   }
  179. }
  180.  
  181. ######################################################################
  182.  
  183.  
  184. proc j:tkb:vi:command { W K A } {
  185.   if { ! [j:tb:is_bol $W]} {
  186.     j:tb:move $W {insert - 1 char}
  187.   }
  188.   j:tkb:new_mode vi-command $W $K $A
  189. }
  190.  
  191. proc j:tkb:vi:insert { W K A } {
  192.   j:tkb:new_mode vi-insert $W $K $A
  193. }
  194.  
  195. ######################################################################
  196. # based on procedures from Achim Bohnet <ach@rosat.mpe-garching.mpg.de>
  197. # TO DO:  should beep ONCE if repeating would hit edge
  198.  
  199. proc j:tkb:vi:left { W K A } {
  200.   if [j:tb:is_bol $W] {
  201.     j:beep $W
  202.   } else {
  203.     j:tkb:repeatable {
  204.       if {![j:tb:is_bol $W]} {j:tb:move $W {insert - 1 char}}
  205.     } $W
  206.   }
  207. }
  208.  
  209. proc j:tkb:vi:right { W K A } {
  210.   if [j:tb:is_eol $W] {
  211.     j:beep $W
  212.   } else {
  213.     j:tkb:repeatable {
  214.       if {![j:tb:is_eol $W]} {j:tb:move $W {insert + 1 char}}
  215.     } $W
  216.   }
  217. }
  218.  
  219. proc j:tkb:vi:up { W K A } {
  220.   if [j:tb:is_first_line $W] {
  221.     j:beep $W
  222.   } else {
  223.     j:tkb:repeatable {
  224.       if {![j:tb:is_first_line $W]} {j:tb:move $W {insert - 1 line}}
  225.     } $W
  226.   }
  227. }
  228.  
  229. proc j:tkb:vi:down { W K A } {
  230.   if [j:tb:is_last_line $W] {
  231.     j:beep $W
  232.   } else {
  233.     j:tkb:repeatable {
  234.       if {![j:tb:is_last_line $W]} {j:tb:move $W {insert + 1 line}}
  235.     } $W
  236.   }
  237. }
  238.  
  239. proc j:tkb:vi:word_end { W K A } {
  240.   j:tb:move $W {insert + 1 char}
  241.   j:tkb:repeatable {
  242.     while {[$W compare insert != end] &&
  243.            [string match "\[ \t\n\]" [$W get insert]]} {
  244.       j:tb:move $W {insert + 1 char}
  245.     }
  246.     while {[$W compare insert != end] &&
  247.            ![string match "\[ \t\n\]" [$W get insert]]} {
  248.       j:tb:move $W {insert + 1 char}
  249.     }
  250.     j:tb:move $W {insert - 1 char}
  251.   } $W
  252. }
  253.  
  254. proc j:tkb:vi:open { W K A } {
  255.   global j_ed
  256.   
  257.   $W mark set insert "insert lineend "
  258.   $W insert insert "\n"
  259.   set j_ed(vi,$W,insert-begin) [$W index insert]    ;# NOT YET USED
  260.   j:tkb:vi:insert $W $K $A
  261.   j:text:mark_dirty $W
  262. }
  263.  
  264. proc j:tkb:vi:Open { W K A } {
  265.   global j_ed
  266.   
  267.   $W mark set insert "insert linestart"
  268.   $W insert insert "\n"
  269.   $W mark set insert "insert - 1line"
  270.   set j_ed(vi,$W,insert-begin) [$W index insert]    ;# NOT YET USED
  271.   j:tkb:vi:insert $W $K $A
  272.   j:text:mark_dirty $W
  273. }
  274.  
  275. ######################################################################
  276.  
  277. # vi beeps on escape:
  278. proc j:tkb:vi:clear_count { W K A } {
  279.   j:beep $W
  280.   j:tkb:clear_count $W $K $A
  281. }
  282.  
  283. # vi bol is first _printing_ character (non-whitespace):
  284. proc j:tkb:vi:bol { W K A } {
  285.   j:tkb:bol $W $K $A
  286.   while {[string match "\[ \t\]" [$W get insert]]} {
  287.     j:tb:move $W {insert + 1 char}
  288.   }
  289. }
  290.  
  291. # vi eol leaves cursor on last character _before_ newline:
  292. proc j:tkb:vi:eol { W K A } {
  293.   j:tkb:eol $W $K $A
  294.   if { ! [j:tb:is_bol $W]} {
  295.     j:tb:move $W {insert - 1 char}
  296.   }
  297. }
  298.  
  299. proc j:tkb:vi:plus { W K A } {
  300.   global j_teb
  301.   j:tkb:vi:down $W $K $A
  302.   j:tkb:vi:bol $W $K $A
  303. }
  304.  
  305. proc j:tkb:vi:minus { W K A } {
  306.   global j_teb
  307.   j:tkb:vi:up $W $K $A
  308.   j:tkb:vi:bol $W $K $A
  309. }
  310.  
  311. proc j:tkb:vi:append { W K A } {
  312.   global j_teb
  313.   if { ! [j:tb:is_bol $W]} {
  314.     j:tb:move $W {insert + 1 char}
  315.   }
  316.   j:tkb:vi:insert $W $K $A
  317. }
  318.  
  319. proc j:tkb:vi:Insert { W K A } {
  320.   global j_teb
  321.   j:tkb:vi:bol $W $K $A
  322.   j:tkb:vi:insert $W $K $A
  323. }
  324.  
  325. proc j:tkb:vi:Append { W K A } {
  326.   global j_teb
  327.   j:tkb:eol $W $K $A
  328.   j:tkb:vi:insert $W $K $A
  329. }
  330.  
  331. ######################################################################
  332. # used for Control-u in insert mode:
  333.  
  334. proc j:tkb:vi:delete_left_line { W K A } {
  335.   if [$W compare {insert linestart} < insert] {
  336.     global j_teb
  337.     set j_teb(modified,$W) 1
  338.     
  339.     j:text:delete $W [$W index {insert linestart}] [$W index insert]
  340.   }
  341. }
  342.  
  343. ######################################################################
  344. # the following are probably temporary kludges; see jbindtext.tcl:
  345.  
  346. proc j:tkb:vi:dd { W K A } {
  347.   set start [$W index "insert linestart"]
  348.   j:tkb:vi:down $W $K $A        ;# repeatable
  349.   set end [$W index "insert linestart"]
  350.   j:text:delete $W $start $end
  351. }
  352.  
  353. proc j:tkb:vi:dw { W K A } {
  354.   set start [$W index insert]
  355.   j:tkb:word_right $W $K $A        ;# repeatable
  356.   set end [$W index insert]
  357.   j:text:delete $W $start $end
  358.   if { ! [j:tb:is_bol $W]} {
  359.     j:tb:move $W {insert - 1 char}
  360.   }
  361. }
  362.  
  363. proc j:tkb:vi:d-eol { W K A } {
  364.   j:text:delete $W [$W index insert] [$W index "insert lineend"]
  365.   j:tkb:clear_count $W $K $A
  366.   if { ! [j:tb:is_bol $W]} {
  367.     j:tb:move $W {insert - 1 char}
  368.   }
  369. }
  370.  
  371. proc j:tkb:vi:cc { W K A } {
  372.   j:tkb:vi:dd $W $K $A            ;# repeatable
  373.   j:tkb:vi:insert $W $K $A
  374. }
  375.  
  376. proc j:tkb:vi:cw { W K A } {
  377.   j:tkb:vi:dw $W $K $A            ;# repeatable
  378.   j:tkb:vi:append $W $K $A
  379. }
  380.  
  381. proc j:tkb:vi:c-eol { W K A } {
  382.   j:tkb:vi:d-eol $W $K $A        ;# repeatable
  383.   j:tkb:vi:append $W $K $A
  384. }
  385.  
  386. ######################################################################
  387. # deprecated alias for backwards-compatibility:
  388. ######################################################################
  389.  
  390. proc j:tb:vi_bind { W } {
  391.   j:tb:vi_init $W
  392. }
  393.