########################################################################
#
# "main_tcl" : Tvi, ᥤ Tcl ץ㷲
#
# Copyright (c) 1998,1999  Motomu Nakashima
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2, or (at your option) 
# any later version.
#
# This program is distributed in the hope that it will be useful, 
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
# GNU General Public License for more details.
#
########################################################################

# ɥι⤵ resize ˤäѤ줿Ȥˡ
# ѿ columns, lines  ꤹ
proc reconfig_lines { } {
    global columns lines
    set wm_value [wm geometry . ]
    set wm_value [string trimright $wm_value 0123456789 ]
    set wm_value [string trimright $wm_value +- ]
    set wm_value [string trimright $wm_value 0123456789 ]
    set wm_value [string trimright $wm_value +- ]
    set wm_value [string trimleft $wm_value 0123456789 ]
    set wm_value [string trimleft $wm_value x ]
    set lines $wm_value

    set wm_value [wm geometry . ]
    set wm_value [string trimright $wm_value 0123456789 ]
    set wm_value [string trimright $wm_value +- ]
    set wm_value [string trimright $wm_value 0123456789 ]
    set wm_value [string trimright $wm_value +- ]
    set wm_value [string trimright $wm_value 0123456789 ]
    set wm_value [string trimright $wm_value x ]
    set columns $wm_value
}

# Button-1 줿Ȥư
proc tkTextButton1 {w x y} {
    global tkPriv

    set tkPriv(selectMode) char
    set tkPriv(mouseMoved) 0
    set tkPriv(pressX) $x
    # $w mark set insert [tkTextClosestGap $w $x $y]
    # $w mark set anchor insert
    $w mark set anchor [tkTextClosestGap $w $x $y]
    # if {[$w cget -state] == "normal"} {focus $w}
}

# 쥯Υڡ
proc tkTextPaste {w} {
    # $w mark set insert [tkTextClosestGap $w $x $y]
    catch {$w insert insert [selection get -displayof $w]}
    if {[$w cget -state] == "normal"} {focus $w}
}

# bell ĹĤ餹ץ
# ö .garbage  focus Ƥơָˤޤ᤹
proc belll { } { 
   set now_focus [ focus ]
   focus .garbage
   bell
   after 150
   update
   focus "$now_focus"
}

# ON/OFF
proc kanji_onoff { } {
   global kanji_flag

   # բ
   if {$kanji_flag == 0} {
   kinput_start .text over
   set kanji_flag 1

   # 󢪥
   } else {
   kanjiInput end .text
   set kanji_flag 0
   }
}

# ֤򵭲ƤɤΥե饰 mem_y 򥯥ꥢ
proc clear_mem_y { } {
             global mem_y
             set mem_y 0
}

# Խȥ򥯥ꥢ
proc clear_edit_entry { } {
          .navi.edit configure -state normal
          .navi.edit  delete 0 end
}

# õ
proc cursor_clear { } {
     .text tag remove cur 1.0 end
      lower .cursor
}

# ֤
proc cursor_put { } {
    .text see insert
    .text tag remove cur 1.0 end
    lower .cursor
    place .cursor -x [expr [lindex [.text bbox insert] 0] \
                                        + [winfo x .text] ] \
                  -y [expr [lindex [.text bbox insert] 1] \
                                        + [winfo y .text] ]
    if {[.text index "insert linestart"] != \
                     [.text index "insert lineend"] } {
        .text tag add cur insert "insert + 1 c"
    } else {
        raise .cursor
    }
}

# Хåե(yanked_text)ȤĴ٤ɽץ
proc research_buffer { } {
   .navi.buffer configure -state normal
   # ξ
   if {[string length [.buffer.yanked_text get 1.0 end]] == 1 } {
      .navi.buffer delete 0 end

   # Ԥξ
   } elseif {[string compare \
                [.buffer.yanked_text index "end -1 c linestart"] \
                [.buffer.yanked_text index "end -1 c lineend"]] == 0} { 
       set lines_buffer \
            [ expr int([.buffer.yanked_text index end]) - 2 ]
          .navi.buffer delete 0 end
          .navi.buffer insert insert $lines_buffer 
              if { [expr $lines_buffer] == 1 } {
              .navi.buffer insert insert " line" 
              } else {
              .navi.buffer insert insert " lines" 
              }

   # (Ԥ)ʸξ(˲ԥ̵)
   } else {

      # set chars_buffer [string length \
      #         [.buffer.yanked_text get 1.0 "end - 1 c "]]
      #    .navi.buffer delete 0 end
      #    .navi.buffer insert insert $chars_buffer 
      #        if { [expr $chars_buffer] == 1 } {
      #        .navi.buffer insert insert " char" 
      #        } else {
      #        .navi.buffer insert insert " chars" 
      #        }

      # ޤԿ n ׻
      set n [expr int([.buffer.yanked_text index "end linestart"]) - 1 ]

      # ʸ򣰤˥å
      set sum_of_chars 0

      # n ԤĹ򤽤줾
      for {set i 1} { $i <= $n } {incr i 1} {
         .buffer.yanked_text mark set insert $i.0
         set sum_of_chars [expr $sum_of_chars + \
            [expr [string trimleft \
                  [string trimleft \
               [.buffer.yanked_text index "insert lineend"] $i ] . ] ] ]
         # ԥɤʬ
         set sum_of_chars [ expr $sum_of_chars + 1 ] 
      }
      # ǽԤβԥɤʬȴƤ
      set sum_of_chars [ expr $sum_of_chars - 1 ] 

     .buffer.yanked_text mark set insert end

     .navi.buffer delete 0 end
     .navi.buffer insert insert $sum_of_chars 
        if { [expr $sum_of_chars] == 1 } {
           .navi.buffer insert insert " char" 
        } else {
           .navi.buffer insert insert " chars" 
        }

   } 
   .navi.buffer configure -state disabled
}

##############################################################
#
#                     ưط
#
##############################################################

# 򱦤˰ư
proc insert_right { } {
    global mem_y
    global insert_pos_x

    if {[string compare [ .text index "insert + 1 chars" ] \
        [ .text index "insert lineend " ]] == 0 } { 
         belll
    } elseif { [string compare \
                  [.text index "insert linestart"] \
                  [.text index "insert lineend"]] == 0} {
         belll 
    } else { 
        .text mark set insert "insert + 1 chars "
    }
    set insert_pos_x [ lindex [ .text bbox insert ] 0 ]
    clear_mem_y 
}

# 򺸤˰ư
proc insert_left { } {
    global mem_y
    global insert_pos_x

    if {[string compare [ .text index "insert" ] \
                  [ .text index "insert linestart " ]] == 0 } { 
         belll
    } else { 
        .text mark set insert "insert - 1 chars "
    } 
    set insert_pos_x [ lindex [ .text bbox insert ] 0 ]
    clear_mem_y 
}

# 򲼤˰ư
proc insert_down { } {
    global mem_y
    global insert_pos_x insert_pos_y
    global lines image_line
    global fontheight

    .text see insert ;# Τ

    if {$mem_y == 0} {
           set insert_pos_x [ lindex [ .text bbox insert ] 0 ]
    } 
    set insert_pos_y [ lindex [ .text bbox insert ] 1 ]
    set old_insert_pos_y  $insert_pos_y 

    # եԤä٥Ĥ餹
    if {[string compare [.text index "insert lineend + 1 c"] \
                        [.text index end] ] == 0 } {
         belll 
    } else {
        if { $insert_pos_y == [expr $fontheight * ($lines -1 ) + 3 ] } {
            # ̤βüä饹뤹
            .text yview scroll 1 units 
            set old_insert_pos_y  -100 
        } else {
            # ̤βüʤä鲼˰ư
            set insert_pos_y  [expr $insert_pos_y + $fontheight ]
        }
        .text mark set insert @$insert_pos_x,$insert_pos_y

        set mem_y 1

        # ǡԤʤä飱ʸ᤹
        if {[string compare [.text index insert] \
                  [.text index "insert lineend"]] == 0 } {
        if {[string compare [.text index "insert linestart"] \
                [.text index "insert lineend"]] != 0 } {
            .text mark set insert "insert -1 c"
        } }
    }
}

# ˰ư
proc insert_up { } {
    global mem_y
    global insert_pos_x insert_pos_y
    global lines
    global fontheight

    .text see insert ;# Τ

    if {$mem_y == 0} {
           set insert_pos_x [ lindex [ .text bbox insert ] 0 ]
    } 
    set insert_pos_y [ lindex [ .text bbox insert ] 1 ]
    set old_insert_pos_y  $insert_pos_y 

    # եƬԤä٥Ĥ餹
    if { [.text index "insert linestart"] == 1.0} {
         belll 
    } else {
         if { $insert_pos_y == 3 } {
              # ̤ξüä饹뤹
             .text yview scroll -1 units 
         } else {
              # ̤ξüʤä顤˰ư
              set insert_pos_y  [expr $insert_pos_y - $fontheight ]
         }
        .text mark set insert @$insert_pos_x,$insert_pos_y

         set mem_y 1

         # ǡԤʤä飱ʸ᤹
         if {[string compare [.text index insert] \
                  [.text index "insert lineend"]] == 0 } {
         if {[string compare [.text index "insert linestart"] \
                [.text index "insert lineend"]] != 0 } {
            .text mark set insert "insert -1 c"
         }
      }
   }
}

proc return_on_virtual { } {
    insert_down 
    clear_mem_y 
    .text xview moveto 0.0 

    # Ƭ
    .text mark set insert "insert linestart"

    # θ¤걦˿ʤ
    while {[string compare [.text get insert "insert + 1 c"] " "] \
                                                             == 0 } {
       .text mark set insert "insert + 1 c" 
    }
    cursor_put 
}

# "G" ˤ른 (Ի)
proc jump_by_large_g {} {
    global navi_edit
    global backup_edit_entry

   .navi.edit configure -state normal
    set n [.navi.edit  get ] 
    set n [string trim $n G ] 
    if {[string compare $n "" ] == 0 } { 
         set n [ expr floor([.text index end]) ] 
    } elseif {[string match *dd $n] == 1 } {
         set n [ expr floor([.text index end]) ] 
    } elseif {[string compare $n "$" ] == 0 } { 
         set n [ expr floor([.text index end]) ] 
    } 

   .text mark set insert [expr int(floor($n)) ].0 
    cursor_put

    clear_edit_entry
    set navi_edit $backup_edit_entry

   .navi.edit configure -state disabled
    focus .virtual  
}

# "G" ˤ른 (ʤǸι)
proc jump_by_large_g_from_virtual {} {
    global navi_edit

   .text yview moveto 1.0 
   .text mark set insert "end lineend"
    if {[string compare [.text index "insert linestart"] \
                        [.text index "insert lineend"] ] != 0 } {
         .text mark set insert "insert - 1 c"
    }
    cursor_put
    focus .virtual  
}

# ƬʤԤǤʤä飱ʸ᤹
proc back_one_char_when_escape { } {
    if {[string compare [.text index insert] \
                   [.text index "insert linestart"]] != 0 } {
       if {[string compare [.text index "insert linestart"] \
                   [.text index "insert lineend"]] != 0 } {
                         .text mark set insert "insert -1 c"
       }
    }
}

# Сˤ
proc text_yview args  {
    global insert_pos_x
    global insert_pos_y
    global lines

    eval .text yview $args
    .text mark set insert @$insert_pos_x,$insert_pos_y

    # ǡԤʤä飱ʸ᤹
    if {[string compare [.text index insert] \
                        [.text index "insert lineend"]] == 0 } {
        if {[string compare [.text index "insert linestart"] \
                            [.text index "insert lineend"]] != 0 } {
            .text mark set insert "insert -1 c"
        }
    }
    cursor_put
}

# ڡ
proc forward_one_page { } { 
    global insert_pos_x
    global insert_pos_y

    set xandy [ lindex [ .text yview ] 1 ]
   .text yview scroll 1 page
    set new_xandy [ lindex [ .text yview ] 1 ]
 
    # ѲʤХ٥Ĥ餷ϰưʤ
    # ѲХư
    if { $xandy == $new_xandy } { 
        bell
    } else { 
        .text mark set insert @0,3
    }
    cursor_put
}

# ڡ
proc backward_one_page { } { 
    global insert_pos_x
    global insert_pos_y
    global lines
    global fontheight

    set xandy [ lindex [ .text yview ] 1 ]
   .text yview scroll -1 page
    set new_xandy [ lindex [ .text yview ] 1 ]
 
    # ѲʤХ٥Ĥ餷ϰưʤ
    # ѲХư
    if { $xandy == $new_xandy } { 
        bell        
    } else { 
        .text mark set insert @0,[expr $fontheight * ($lines -1 ) + 3 ]
    }
    cursor_put
}

# Ⱦڡ
proc forward_half_page { } { 
    global insert_pos_x
    global insert_pos_y
    global lines

    set xandy [ lindex [ .text yview ] 1 ]

    set half_page [expr int($lines/2)]
   .text yview scroll $half_page units 

    set new_xandy [ lindex [ .text yview ] 1 ]
 
    # ѲʤХ٥Ĥ餷ϰưʤ
    # ѲХư
    if { $xandy == $new_xandy } { 
        bell
    } else { 
        .text mark set insert @0,$insert_pos_y
    }
    cursor_put
}

# Ⱦڡ
proc backward_half_page { } { 
    global insert_pos_x
    global insert_pos_y
    global lines

    set xandy [ lindex [ .text yview ] 1 ]

    set half_page [expr int($lines/2)]
   .text yview scroll -$half_page units 

    set new_xandy [ lindex [ .text yview ] 1 ]
 
    # ѲʤХ٥Ĥ餷ϰưʤ
    # ѲХư
    if { $xandy == $new_xandy } { 
        bell
    } else { 
        .text mark set insert @0,$insert_pos_y
    }
    cursor_put
}

# $ ˤԤκǸؤΰư
proc goto_lineend_by_dollar { } {
    global insert_pos_x
    .text mark set insert "insert lineend" 

    # ԤʤУʸ᤹
    if {[string compare [.text index "insert linestart"] \
                        [.text index "insert lineend"  ] ] != 0 } {
          .text mark set insert "insert -1 c"
    }
    set insert_pos_x [ lindex [ .text bbox insert ] 0 ]
    cursor_put
}

#######################################################################
#
#   Խط
#
#   ԽطΥޥɤϡɥɥŪ˹Ԥʤˡ
#   ɤʥޥɤǤʲΤ褦ѿǼ褦ˤ롥
#
#   csi             ޥɳϻ index
#   go_csi_dsi      ֤˰ư륳ޥ
#   dsi             ϰ֤ index
#   dei             ()λ index
#   delete_command  ޥ(dei)
#   dchars          ʸ
#   go_dsi_pisi     ϻץϤ index ؤΰưޥ
#   pisi            ץ index
#   pichars         ץʸ
#   piei            ץλ index
#   go_piei_isi     ץ()Ϥ index ؤΰưޥ
#   isi              index
#   insert_command  ޥ(ichars)
#   ichars          ʸ
#   iei             λ index
#   go_iei_cei      λ饳ޥɽλindex ؤΰưޥ
#   cei             ޥɽλ index
#######################################################################

# ϥޥɤǤΥפư
proc escape_on_text { } {
    global command_name
    global isi iei ichars cei
    global insert_command
    global go_iei_cei
    global undo_flag
    global colored

    set iei [.text index insert]
    set ichars [.text get $isi $iei ]
    set insert_command "" ; # insert_command ϶ˤƤ
    set go_iei_cei "back_one_char_when_escape" 
    eval $go_iei_cei
    set cei [.text index insert]

    # .navi.edit ˤʤäޥɤɽ
    .navi.edit configure -state normal
      .tmp delete 0 end  
      .tmp insert 0 $ichars  
       set number [.tmp index end]
       set chars "chars"
       if { $number == "0" } { set chars "char" } ; # 0 ʸξ
       if { $number == "1" } { set chars "char" } ; # 1 ʸξ
      .navi.edit delete 0 end
      .navi.edit insert 0 "$command_name $number $chars"
    .navi.edit configure -state disabled

    focus .virtual 
    cursor_put 
    clear_mem_y 
    catch {kanjiInput end .text} ; # kinput2 λ
    set undo_flag 1

    # դ
    if {$colored=="1"} {
        colorize $isi $iei
    }

    # ϤʸΥå
    latex_check
}

# "i" ˤ
proc i_on_virtual { } {
    global command_name
    global csi dsi dei dchars pisi pichars piei isi
    global go_csi_dsi go_dsi_pisi delete_command go_piei_isi
    global saved_flag

    # Saved ե饰򿲤
    set saved_flag 0

    # [Saved]  [Modified] ˤ
    filename_modified

    focus .text 
    cursor_clear

    # .navi.edit ˥ޥɤɽ
    clear_edit_entry
   .navi.edit insert 0 {[Inserting...]}
   .navi.edit configure -state disabled

    set command_name "i"
    set csi [.text index insert]
    set go_csi_dsi ""
    set dsi $csi
    set delete_command { set dei $dsi }
    eval $delete_command
    set dchars ""
    set go_dsi_pisi ""
    set pisi $csi
    set pichars ""
    set piei $csi
    set go_piei_isi ""
    set isi  $csi
}

# "I" ˤ
proc large_i_on_virtual { } {
    global command_name
    global csi dsi dei dchars pisi pichars piei isi
    global go_csi_dsi go_dsi_pisi delete_command go_piei_isi
    global saved_flag

    # Saved ե饰򿲤
    set saved_flag 0

    # [Saved]  [Modified] ˤ
    filename_modified

    focus .text 
    cursor_clear

    # .navi.edit ˥ޥɤɽ
    clear_edit_entry
   .navi.edit insert 0 {[Inserting...]}
   .navi.edit configure -state disabled

    set command_name "I"
    set csi [.text index insert]
    set go_csi_dsi { .text mark set insert "insert linestart" }
    eval $go_csi_dsi
    set dsi [.text index insert]
    set delete_command { set dei $dsi }
    set dei $dsi
    set dchars ""
    set go_dsi_pisi ""
    set pisi $dsi
    set pichars ""
    set piei $dsi
    set go_piei_isi ""
    set isi  $dsi
}

# "a" ˤ
proc a_on_virtual { } {
    global command_name
    global csi dsi dei dchars pisi pichars piei isi
    global go_csi_dsi go_dsi_pisi delete_command go_piei_isi
    global saved_flag

    # Saved ե饰򿲤
    set saved_flag 0

    # [Saved]  [Modified] ˤ
    filename_modified

    focus .text 
    cursor_clear

    # .navi.edit ˥ޥɤɽ
    clear_edit_entry
   .navi.edit insert 0 {[Appending...]}
   .navi.edit configure -state disabled

    set command_name "a"
    set csi [.text index insert]
    set go_csi_dsi ""
    set dsi $csi
    set delete_command { set dei $dsi }
    eval $delete_command
    set dchars ""
    set go_dsi_pisi ""
    set pisi $csi
    set pichars ""
    set piei $csi
    set go_piei_isi { 
        if {[.text index insert] != [.text index "insert lineend"]} {
                       .text mark set insert "insert + 1c" } }
    eval $go_piei_isi
    set isi [.text index insert ]
}

# "A" ˤ
proc large_a_on_virtual { } {
    global command_name
    global csi dsi dei dchars pisi pichars piei isi
    global go_csi_dsi go_dsi_pisi delete_command go_piei_isi
    global saved_flag

    # Saved ե饰򿲤
    set saved_flag 0

    # [Saved]  [Modified] ˤ
    filename_modified

    focus .text 
    cursor_clear

    # .navi.edit ˥ޥɤɽ
    clear_edit_entry
   .navi.edit insert 0 {[Appending...]}
   .navi.edit configure -state disabled

    set command_name "a"
    set csi [.text index insert]
    set go_csi_dsi ""
    set dsi $csi
    set delete_command { set dei $dsi }
    eval $delete_command
    set dchars ""
    set go_dsi_pisi ""
    set pisi $csi
    set pichars ""
    set piei $csi
    set go_piei_isi { .text mark set insert "insert lineend" }
    eval $go_piei_isi
    set isi [.text index insert ]
}

# "o" ˤ
proc o_on_virtual { } {
    global command_name
    global csi dsi dei dchars pisi pichars piei isi
    global go_csi_dsi go_dsi_pisi delete_command go_piei_isi
    global saved_flag

    # Saved ե饰򿲤
    set saved_flag 0

    # [Saved]  [Modified] ˤ
    filename_modified

    focus .text 
    cursor_clear

    # .navi.edit ˥ޥɤɽ
    clear_edit_entry
   .navi.edit insert 0 {[Inserting...]}
   .navi.edit configure -state disabled

    set command_name "o"
    set csi [.text index insert]
    set go_csi_dsi ""
    set dsi $csi
    set delete_command { set dei $dsi }
    eval $delete_command
    set dchars ""
    set go_dsi_pisi { .text mark set insert "insert lineend" }
    eval $go_dsi_pisi
    set pisi [.text index insert ]
    set pichars "\n"
   .text insert insert $pichars 
    set piei [.text index insert]
    set go_piei_isi ""
    eval $go_piei_isi
    set isi [.text index insert ]
    .text see insert
}

# "O" ˤ
proc large_o_on_virtual { } {
    global command_name
    global csi dsi dei dchars pisi pichars piei isi
    global go_csi_dsi go_dsi_pisi delete_command go_piei_isi
    global saved_flag

    # Saved ե饰򿲤
    set saved_flag 0

    # [Saved]  [Modified] ˤ
    filename_modified

    focus .text 
    cursor_clear

    # .navi.edit ˥ޥɤɽ
    clear_edit_entry
   .navi.edit insert 0 {[Inserting...]}
   .navi.edit configure -state disabled

    set command_name "O"
    set csi [.text index insert]
    set go_csi_dsi ""
    set dsi $csi
    set delete_command { set dei $dsi }
    eval $delete_command
    set dchars ""
    set go_dsi_pisi { .text mark set insert "insert linestart" }
    eval $go_dsi_pisi
    set pisi [.text index insert ]
    set pichars "\n"
   .text insert insert $pichars 
    set piei [.text index insert]
    set go_piei_isi { .text mark set insert "insert -1 c" }
    eval $go_piei_isi
    set isi [.text index insert ]
}

# "s" ˤ룱ʸ
proc s_on_virtual { } {
    global command_name
    global csi dsi dei dchars pisi pichars piei isi
    global go_csi_dsi go_dsi_pisi delete_command go_piei_isi
    global saved_flag

    # Ԥä٥Ĥ餷Ʋ⤷ʤ
    if {[string compare [.text index "insert linestart"] \
                        [.text index "insert lineend"]] == 0 } {
        belll ; return }

    # Saved ե饰򿲤
    set saved_flag 0

    # [Saved]  [Modified] ˤ
    filename_modified

    focus .text 
    cursor_clear

    # .navi.edit ˥ޥɤɽ
    clear_edit_entry
   .navi.edit insert 0 {[Inserting...]}
   .navi.edit configure -state disabled

    set command_name "s"
    set csi [.text index insert]
    set go_csi_dsi ""
    set dsi $csi
    set delete_command { set dei [.text index "$dsi +1c"] }
    eval $delete_command
    set dchars [.text get $dsi $dei]
    .text delete $dsi $dei
    set go_dsi_pisi ""
    set pichars ""
    set pisi $csi
    set piei $csi
    set go_piei_isi ""
    set isi $csi
}

# "S" ˤ룱Ժ
proc large_s_on_virtual { } {
    global command_name
    global csi dsi dei dchars pisi pichars piei isi
    global go_csi_dsi go_dsi_pisi delete_command go_piei_isi
    global saved_flag

    # Saved ե饰򿲤
    set saved_flag 0

    # [Saved]  [Modified] ˤ
    filename_modified

    focus .text 
    cursor_clear

    # .navi.edit ˥ޥɤɽ
    clear_edit_entry
   .navi.edit insert 0 {[Inserting...]}
   .navi.edit configure -state disabled

    set command_name "S"
    set csi [.text index insert]
    set go_csi_dsi { .text mark set insert "insert linestart" }
    eval $go_csi_dsi
    set dsi [.text index insert]
    set delete_command { set dei [.text index "$dsi lineend"] }
    eval $delete_command
    set dchars [.text get $dsi $dei]
    .text delete $dsi $dei
    set go_dsi_pisi ""
    set pichars ""
    set pisi $dsi
    set piei $dsi
    set go_piei_isi ""
    set isi $dsi
}

# "C" ˤޤǺ
proc large_c_on_virtual { } {
    global command_name
    global csi dsi dei dchars pisi pichars piei isi
    global go_csi_dsi go_dsi_pisi delete_command go_piei_isi
    global saved_flag

    # Saved ե饰򿲤
    set saved_flag 0

    # [Saved]  [Modified] ˤ
    filename_modified

    focus .text 
    cursor_clear

    # .navi.edit ˥ޥɤɽ
    clear_edit_entry
   .navi.edit insert 0 {[Inserting...]}
   .navi.edit configure -state disabled

    set command_name "C"
    set csi [.text index insert]
    set go_csi_dsi ""
    set dsi $csi
    set delete_command { set dei [.text index "$dsi lineend"] }
    eval $delete_command
    set dchars [.text get $dsi $dei]
    .text delete $dsi $dei
    set go_dsi_pisi ""
    set pichars ""
    set pisi $csi
    set piei $csi
    set go_piei_isi ""
    set isi $csi
}

# "r" ˤ룱
proc replace_one_char { } {
    global insert_replace
    global csi isi
    global go_csi_dsi dsi go_dsi_pisi pisi pichars piei go_piei_isi 
    global insert_command command_name
    global undo_flag
    global saved_flag

    # Saved ե饰򿲤
    set saved_flag 0

    # [Saved]  [Modified] ˤ
    filename_modified

    set undo_flag 1
    set csi [.text index insert]
    set dsi $csi 
    set go_csi_dsi ""
    set go_dsi_pisi ""
    set pisi $csi 
    set pichars ""
    set piei $csi 
    set go_piei_isi ""
    set insert_command ""
    set isi $csi
    set command_name "r"

    set insert_replace $csi ; # ֤δƻ˻Ѥѿ
                            ; # ߤΰ֤ϿƤ

    # navi.edit ȥν
    clear_edit_entry 
   .navi.edit insert 0 {[Replacing...]}
   .navi.edit configure -state disabled 

    focus .text
    watch_text_one ; # ִƻץ
}

# "r" ǥ뤬ư餹ޣʸõȴץ
proc watch_text_one { } {
    global insert_replace
    global navi_edit
    global delete_command 
    global dei isi iei
    global dchars ichars
    global go_iei_cei
    global ichars
    global dsi
    global colored

    # ǥå֤Ѥäɤ
    if {[.text index insert] != $insert_replace} {
    # ԤѤäƤޤäƤ뤫ɤ
    if {[expr int([.text index insert]) - int($insert_replace)] != 0} {

    # ԤˤԤѤäƤޤä硤ȴ
        set dchars [.text get insert "insert +1c"]

        # ξ硤dei Τä(dei ϤǤ̵Τ)
        # dsi ʸʤƤĤäƤ
        set dsi_line [string trimright \
                     [string trimright $dsi 0123456789] .]
        set dsi_char [string trimleft \
                     [string trimleft $dsi 0123456789] .]
        set dei $dsi_line.[expr $dsi_char +1 ]
        set delete_command { set dei [.text index "insert +1c"] }

       .text delete insert "insert +1c" 

        set isi [.text index "insert -1c"]
        set ichars "\n"
        set iei [.text index insert]
        set go_iei_cei ""

        set insert_replace -1.0 ; # ǥ롼פȴ褦ˤʤ
        focus .virtual
        set navi_edit "r 1 char"
        cursor_put
        clear_mem_y

        # դ
        if {$colored=="1"} {
            colorize $isi $iei
        }
        return


    # ԤѤäƤʤ
    } else {
       set char_now  [string trimleft \
               [string trimleft [.text index insert] 0123456789] .]
       set char_prev [string trimleft \
               [string trimleft $insert_replace 0123456789] .]
       set n [expr $char_now - $char_prev]

       # ˥뤬ʤ
       if {$n > 0} {
           set delete_command { set dei [.text index "insert +1c"] }
           set dchars [.text get insert "insert +1c"]

          .text delete insert "insert +1c"
           if {$n > 1} {
             .text delete "insert - [expr $n - 1 ] c" insert
              belll } ; # ʸʾξ硤;ʬϾäƥ٥Ĥ餹
          .text mark set insert "insert -1c"
           eval $delete_command

           set isi [.text index insert]
           set ichars [.text get insert "insert +1c"]
           set iei [.text index "insert +1c"]
           set go_iei_cei { .text mark set insert "insert -1c" }

           set insert_replace -1.0 ; # ǥ롼פȴ褦ˤʤ
           focus .virtual
           set navi_edit "r 1 char"
           cursor_put
           clear_mem_y

           # դ
           if {$colored=="1"} {
               colorize $isi $iei
           }
           return

       # ʳξ(ɤ硩)
       # ٥Ĥ餷 .navi.edit  "r 0 char" ȽФ
       } else {
#           set dei [.text index insert]
#           set delete_command { set dei [.text index insert] }
#           set dchars [.text get insert insert]
#           set isi $dei
#           set ichars ""
#           set iei $dei
#           set go_iei_cei ""
#
#           belll
#           set navi_edit "r 0 char"
#           focus .virtual
#          .text mark set insert insert+1char
#           clear_mem_y
#           return
       }
    }
    }
    after 1 {  if {[focus]==".virtual"} { 
               # Escape ȴƤޤä
                 set dei [.text index insert]
                 set delete_command { set dei [.text index insert] }
                 set dchars [.text get insert insert]
                 set isi $dei
                 set ichars ""
                 set iei $dei
                 set go_iei_cei ""
                 belll
                 return 
             } 
              watch_text_one  } ; # ʬȤκƵư
}

# "R" ˤ
proc replace_many { } {
    global insert_replace
    global csi isi
    global go_csi_dsi dsi go_dsi_pisi pisi pichars piei go_piei_isi 
    global insert_command command_name
    global undo_flag
    global saved_flag

    # Saved ե饰򿲤
    set saved_flag 0

    # [Saved]  [Modified] ˤ
    filename_modified

    set undo_flag 1
    set csi [.text index insert]
    set dsi $csi 
    set go_csi_dsi ""
    set go_dsi_pisi ""
    set pisi $csi 
    set pichars ""
    set piei $csi 
    set go_piei_isi ""
    set insert_command ""
    set isi $csi
    set command_name "R"

    set insert_replace $csi ; # ֤δƻ˻Ѥѿ
                            ; # ߤΰ֤ϿƤ
   .replaced_text delete 1.0 end ; #ϤƱ˾äʸγǼ˻

    # navi.edit ȥν
    clear_edit_entry 
   .navi.edit insert 0 {[Replacing...]}
   .navi.edit configure -state disabled 

    cursor_clear
    focus .text 
    watch_text
}

# "R" ǥ뤬ưõ
proc watch_text { } {
    global insert_replace
    global delete_command 
    global dei isi iei
    global dchars ichars
    global go_iei_cei
    global ichars
    global csi
    global num_chars ; # ɥǻȤ global ˤ
     
    # ǥå֤Ѥäɤ
    if {[.text index insert] != $insert_replace} {
    # ԤѤäƤޤäƤ뤫ɤ
    if {[expr int([.text index insert]) - int($insert_replace)] != 0} {
    # ԤˤԤѤäƤޤäƤ
       .text delete "insert linestart" "insert linestart + 1 c" 
        set insert_replace -1.0
        return
    # ԤѤäƤʤ
    } else {
        # ޤʸʤ
        set char_now  [string trimleft \
                [string trimleft [.text index insert] 0123456789] .]
        set char_prev [string trimleft \
                [string trimleft $insert_replace 0123456789] .]
        set n [expr $char_now - $char_prev]

        # ˥뤬ʤ
        # (ʤĿʬʸõ .replaced_text ˳Ǽ)
        if {$n > 0} {
            for {set i 1} { $i <= $n } {incr i} {
                # ã顤insert⡼ɤ˰ܹ
                if {[string compare [.text index insert] \
                         [.text index "insert lineend"]]==0} {
                         set insert_replace -1.0
                         return
                }
               .replaced_text insert end \
                      [.text get insert "insert + 1 c"]
               .text delete insert "insert + 1 c"
            }
            set insert_replace [.text index insert]

        # ˥뤬ä
        # (.replaced_text ʸĥᤷƤ)
        } else {
           .text insert insert \
                    [.replaced_text get "end - 1 c + $n c" "end - 1 c"]
           .replaced_text delete "end - 1 c + $n c" "end - 1 c"
           .text mark set insert "insert - 1 c"
            set insert_replace [.text index insert]
        }
    }
    }
    after 1 { 
        # פˤ꽪λݤν
        if {[focus]==".virtual"} { 
            # ޤִʸ(num_chars)
           .replaced_entry delete 0 end
           .replaced_entry insert 0 [.replaced_text get 1.0 end]
            set num_chars [.replaced_entry index end]
            set csi_line [string trimright \
                         [string trimright $csi 0123456789] .]
            set csi_char [string trimleft \
                         [string trimleft $csi 0123456789] .]

            set dei $csi_line.[expr $csi_char + $num_chars - 1]
            set delete_command \
                  { set dei [.text index "insert + $num_chars c -1c"] }

            set dchars [.replaced_text get 1.0 "end-1c"]
           # set isi $csi
           # set ichars [.text get $isi "insert +1c"]
           # set iei [.text index insert]
           # set go_iei_cei ""
           # set cei $iei
           # return 
        } watch_text } ; # ʬȤκƵư
}

# "x" ˤ
proc delete_by_x { } {

    # Ԥʤä飱ʸä
    if {[string compare [.text index "insert linestart"] \
                    [.text index "insert lineend"]] != 0 } {

    focus .garbage ;# ץȼ¹ϥ٥Ȥդʤ
    global after_id
    after cancel $after_id ;#  after 򥭥󥻥뤹

    global csi dsi dei dchars pisi pichars piei isi ichars iei cei
    global go_csi_dsi go_dsi_pisi go_piei_isi go_iei_cei
    global delete_command insert_command
    global undo_flag
    global saved_flag
    global colored

    # Saved ե饰򿲤
    set saved_flag 0

    # [Saved]  [Modified] ˤ
    filename_modified

    set undo_flag 1
    set csi [.text index insert]
    set go_csi_dsi ""
    set dsi $csi
    set dei [.text index "insert +1c"]
    set dchars [.text get insert "insert + 1c"]
    # delete_command ϰʲΤ褦ĹΤ redo ΤȤ˥Хåե
    # ʤФʤʤ...
    set delete_command { set dei [.text index "insert +1c"] 
        .buffer.yanked_text delete 1.0 end
        .buffer.yanked_text insert 1.0 [.text get insert "insert +1c"]
        research_buffer }
    set go_dsi_pisi ""
    set pisi $csi
    set pichars ""
    set piei $csi
    set go_piei_isi ""
    set isi $csi
    set insert_command ""
    set ichars ""
    set iei $csi
    set go_iei_cei ""

    # ХåեˤǼ
    .buffer.yanked_text delete 1.0 end 
    .buffer.yanked_text insert 1.0 $dchars 
    research_buffer

    # ǣʸä
    .text delete insert "insert + 1 c"

 
    # ǡԤʤä飱ʸ
    if {[string compare [.text index insert] \
                [.text index "insert lineend"]] == 0 } {
      if {[string compare [.text index "insert linestart"] \
             [.text index "insert lineend"]] != 0 } {
          .text mark set insert "insert -1 c"
          set go_iei_cei { .text mark set insert "insert -1 c" }
      }
    }
 
    set cei [.text index insert]

    .navi.edit configure -state normal
    .navi.edit delete 0 end
    .navi.edit insert end "1x"
    .navi.edit configure -state disabled

    cursor_put

    # Ϣ³ x κǸä饭󥻥뤵줺˿դ
    if {$colored=="1"} {
        set after_id [ after 200 "colorize $isi $isi" ]
    }
    update
    focus .virtual ;# focus ᤹

    } else { 
    belll} ; # Ԥä鲿⤻˥٥Ĥ餹
}

# "X" ˤ뺸ʸ
proc delete_by_large_x { } {
    global csi dsi dei dchars pisi pichars piei isi ichars iei cei
    global go_csi_dsi go_dsi_pisi go_piei_isi go_iei_cei
    global delete_command insert_command
    global undo_flag
    global saved_flag
    global colored

    # ԤƬä鲿⤷ʤǥ٥Ĥ餹
    if {[string compare [.text index "insert linestart"] \
                        [.text index insert]] == 0 } {
        belll ; return }

    # Saved ե饰򿲤
    set saved_flag 0

    # [Saved]  [Modified] ˤ
    filename_modified

    set undo_flag 1
    set csi [.text index insert]
    set go_csi_dsi { .text mark set insert "insert -1c" }
    eval $go_csi_dsi
    set dsi [.text index insert]
    set dei [.text index "insert +1c"]
    # delete_command ϰʲΤ褦ĹΤ redo ΤȤ˥Хåե
    # ʤФʤʤ...
    set delete_command { set dei [.text index "insert +1c"] 
        .buffer.yanked_text delete 1.0 end
        .buffer.yanked_text insert 1.0 [.text get insert "insert +1c"]
        research_buffer }
    set dchars [.text get insert "insert + 1c"]
    set go_dsi_pisi ""
    set pisi $csi
    set pichars ""
    set piei $csi
    set go_piei_isi ""
    set isi $csi
    set insert_command ""
    set ichars ""
    set iei $csi
    set go_iei_cei ""

    # ХåեˤǼ
    .buffer.yanked_text delete 1.0 end 
    .buffer.yanked_text insert 1.0 $dchars 
    research_buffer

    # ǣʸä
    .text delete insert "insert + 1 c"

    set cei [.text index insert]

    .navi.edit configure -state normal
    .navi.edit delete 0 end
    .navi.edit insert end "1x"
    .navi.edit configure -state disabled

    # դ
    if {$colored=="1"} {
        colorize $isi $iei
    }
}


# "x" ˤ(¿)
proc delete_many_by_x { } {
    global csi dsi dei dchars pisi pichars piei isi ichars iei cei
    global go_csi_dsi go_dsi_pisi go_piei_isi go_iei_cei
    global delete_command insert_command
    global num_chars ; # ɥΤȤѤ
    global undo_flag
    global saved_flag
    global colored

    global backup_edit_entry

    # Ԥʤää
    if {[string compare [.text index "insert linestart"] \
                        [.text index "insert lineend"]] != 0 } {

    set line [expr int([.text index insert])]
    # insert ʸܤ
    set char [string trimleft \
             [string trimleft [.text index insert] $line ] . ]
    # ʸܤ
    set char_e [string trimleft \
               [string trimleft \
               [.text index "insert lineend" ] $line ] . ]
   
    set n [string trimright [.navi.edit get] x] ; # ʸ
    set n2 [string trimright $n 0123456789]
        # ̯ʤȤ򤷤Ƥ硤̵ˤ
        if {[string compare $n2 ""] != 0 } {
            belll
            .navi.edit configure -state normal
            .navi.edit delete 0 end
            .navi.edit insert end "$backup_edit_entry"
            .navi.edit configure -state disabled
            focus .virtual
            return
        } 

    # Saved ե饰򿲤
    set saved_flag 0

    # [Saved]  [Modified] ˤ
    filename_modified

    set undo_flag 1
    set csi [.text index insert]
    set go_csi_dsi ""
    set dsi $csi
    set go_dsi_pisi ""
    set pisi $csi
    set pichars ""
    set piei $csi
    set go_piei_isi ""
    set isi $csi
    set insert_command ""
    set ichars ""
    set iei $csi
    set go_iei_cei ""

    # n ʸǤ
    if {[expr $char + $n ] <= $char_e } {
        # ХåեˤǼ
        .buffer.yanked_text delete 1.0 end
        .buffer.yanked_text insert \
                       1.0 [.text get insert "insert + $n c" ]

        # ɥɥ
        set dei [.text index "insert + $n c"]
        set num_chars $n
        set delete_command \
             { set dei [compute_dei_for_nx_redo $num_chars] }
        set dchars [.text get insert "insert + $n c"]

        # Ǻ
        .text delete insert "insert + $n c" 
 
    # nʸǤʤ
    } else {
        # ХåեˤǼ
        .buffer.yanked_text delete 1.0 end
        .buffer.yanked_text insert \
                       1.0 [.text get insert "insert lineend" ]

        # ɥɥ
        set dei [.text index "insert lineend"]
        set num_chars $n
        set delete_command \
             { set dei [compute_dei_for_nx_redo $num_chars] }
        set dchars [.text get insert "insert lineend "]

        # Ǻ
        .text delete insert "insert lineend"
        belll ; # ٥Ĥ餹
    }
    research_buffer
    .navi.edit configure -state normal
    .navi.edit delete 0 end
    .navi.edit insert end $n
    .navi.edit insert end "x"
    .navi.edit configure -state disabled
 
    set go_iei_cei { compute_go_iei_cei_for_nx }
    compute_go_iei_cei_for_nx
    set cei [.text index insert]

    } else { 
         belll
        .navi.edit configure -state normal
        .navi.edit delete 0 end
        .navi.edit insert end "$backup_edit_entry"
        .navi.edit configure -state disabled
    }
    cursor_put
    focus .virtual

    # դ
    if {$colored=="1"} {
        colorize $isi $iei
    }
}

# "x" ˤ(¿)Υɥκݤ dei 
proc compute_dei_for_nx_redo { num_chars } {

    set line [expr int([.text index insert])]
    # insert ʸܤ
    set char [string trimleft \
             [string trimleft [.text index insert] $line ] . ]
    # ʸܤ
    set char_e [string trimleft \
               [string trimleft \
               [.text index "insert lineend" ] $line ] . ]
   
    set n $num_chars ; # ʸ

    # n ʸǤ
    if {[expr $char + $n ] <= $char_e } {
        set dei [.text index "insert + $n c"]
        .buffer.yanked_text delete 1.0 end
        .buffer.yanked_text insert 1.0 \
                  [.text get insert "insert + $n c"]
        research_buffer 
        return $dei

    # nʸǤʤ
    } else {
        belll
        set dei [.text index "insert lineend "]
        .buffer.yanked_text delete 1.0 end
        .buffer.yanked_text insert 1.0 \
                  [.text get insert "insert lineend"]
        research_buffer 
        return $dei
    }
}

# "x" ˤ(¿)Υɥκݤ˹ǶԤʤä飱ʸ
proc compute_go_iei_cei_for_nx { } {

    if {[string compare [.text index insert] \
                 [.text index "insert lineend"]] == 0 } {
       if {[string compare [.text index "insert linestart"] \
              [.text index "insert lineend"]] != 0 } {
           .text mark set insert "insert -1 c" } }
}

# "X" ˤ뺸ʸ(¿)
proc delete_many_by_large_x { } {
    global csi dsi dei dchars pisi pichars piei isi ichars iei cei
    global go_csi_dsi go_dsi_pisi go_piei_isi go_iei_cei
    global delete_command insert_command
    global num_chars ; # ɥΤȤѤ
    global undo_flag
    global saved_flag
    global colored

    global backup_edit_entry

    # Ԥʤää
    if {[string compare [.text index "insert linestart"] \
                        [.text index "insert lineend"]] != 0 } {

    set line [expr int([.text index insert])]
    # insert ʸܤ
    set char [string trimleft \
             [string trimleft [.text index insert] $line ] . ]
    # ʸ
    set n [string trimright [.navi.edit get] X]
    set n2 [string trimright $n 0123456789]

        # ̯ʤȤ򤷤Ƥ硤̵ˤ
        if {[string compare $n2 ""] != 0 } {
            belll
            .navi.edit configure -state normal
            .navi.edit delete 0 end
            .navi.edit insert end "$backup_edit_entry"
            .navi.edit configure -state disabled
            focus .virtual
            return
        } 

    # Saved ե饰򿲤
    set saved_flag 0

    # [Saved]  [Modified] ˤ
    filename_modified

    set undo_flag 1
    set csi [.text index insert]
    set go_dsi_pisi ""
    set pisi $csi
    set pichars ""
    set piei $csi
    set go_piei_isi ""
    set isi $csi
    set insert_command ""
    set ichars ""
    set iei $csi
    set go_iei_cei ""

    set go_csi_dsi { go_csi_dsi_for_n_large_x }
    eval $go_csi_dsi
    set dsi [.text index insert]

    # ХåեˤǼ
#    .buffer.yanked_text delete 1.0 end
#    .buffer.yanked_text insert 1.0 [.text get $dsi $csi ]
    set dei $csi
    set delete_command { set dei $csi }
    set dchars [.text get $dsi $csi ]

    # Ǻ
    .text delete $dsi $csi
 
#    research_buffer
    .navi.edit configure -state normal
    .navi.edit delete 0 end
    .navi.edit insert end $n
    .navi.edit insert end "X"
    .navi.edit configure -state disabled

    } else { 
         belll
        .navi.edit configure -state normal
        .navi.edit delete 0 end
        .navi.edit insert end "$backup_edit_entry"
        .navi.edit configure -state disabled
    }
    cursor_put
    focus .virtual
    # դ
    if {$colored=="1"} {
        colorize $isi $iei
    }
}

# nX κݤ go_csi_dsi
proc go_csi_dsi_for_n_large_x { } {
    set line [expr int([.text index insert])]

    # insert ʸܤ
    set char [string trimleft \
             [string trimleft [.text index insert] $line ] . ]

    # ʸ
    set n [string trimright [.navi.edit get] X]
   
    if { $n >= $char } {
        # ޤХåե˳Ǽ
        .buffer.yanked_text delete 1.0 end
        .buffer.yanked_text insert 1.0 \
                  [.text get "insert linestart" insert]
        research_buffer 
        # 줫ư
        .text mark set insert "insert linestart"
    } else {
        # ޤХåե˳Ǽ
        .buffer.yanked_text delete 1.0 end
        .buffer.yanked_text insert 1.0 \
                  [.text get "insert -$n c" insert]
        research_buffer 
        # 줫ư
        .text mark set insert "insert -$n c"
    }
}


# "D" ˤޤǤκ
proc delete_by_large_d { } {
    global csi dsi dei dchars pisi pichars piei isi ichars iei cei
    global go_csi_dsi go_dsi_pisi go_piei_isi go_iei_cei
    global delete_command insert_command
    global undo_flag
    global saved_flag

    # Saved ե饰򿲤
    set saved_flag 0

    # [Saved]  [Modified] ˤ
    filename_modified

    set undo_flag 1
    set csi [.text index insert]
    set go_csi_dsi ""
    set dsi $csi
    set delete_command { set dei [.text index "$dsi lineend"] }
    eval $delete_command
    set dchars [.text get $dsi $dei]
    set go_dsi_pisi ""
    set pisi $csi
    set pichars ""
    set piei $csi
    set go_piei_isi ""
    set isi $csi
    set insert_command ""
    set ichars ""
    set iei $csi
    set go_iei_cei ""

    # ХåեˤǼ
    .buffer.yanked_text delete 1.0 end 
    .buffer.yanked_text insert 1.0 $dchars 
    research_buffer

    # ǣʸä
    .text delete $dsi $dei
 
    # ǡԤʤä飱ʸ
    if {[string compare [.text index "insert linestart"] \
                        [.text index "insert lineend"]] != 0 } {
        .text mark set insert "insert -1 c"
        set go_iei_cei { .text mark set insert "insert -1 c" }
    }
 
    set cei [.text index insert]

    .navi.edit configure -state normal
    .navi.edit delete 0 end
    .navi.edit insert end "D"
    .navi.edit configure -state disabled

    cursor_put
}


# "dd" ˤԾõ
proc delete_by_dd { } { 
    global csi dsi dei dchars pisi pichars piei isi ichars iei cei
    global go_csi_dsi go_dsi_pisi go_piei_isi go_iei_cei
    global delete_command insert_command
    global undo_flag
    global num_chars
    global saved_flag

    .navi.edit  insert insert "d"

    # Saved ե饰򿲤
    set saved_flag 0

    # [Saved]  [Modified] ˤ
    filename_modified

    set undo_flag 1
    set csi [.text index insert]
    set go_csi_dsi { .text mark set insert "insert linestart" }
    eval $go_csi_dsi
    set dsi [.text index insert]
                
    # Хåե򥯥ꥢ
    .buffer.yanked_text delete 1.0 end
    .buffer.linenumber delete 1.0 end 

    # Կ
    set n [.navi.edit  get ] 
    set n [string trim $n \n ] 
    set n [string trim $n d ] 
    set num_chars $n

    set delete_command { set dei [compute_dei_for_dd $num_chars] }
    eval $delete_command
    set dchars [.text get insert $dei]
    set go_dsi_pisi ""
    set pisi $dsi
    set pichars ""
    set piei $dsi
    set go_piei_isi ""
    set isi $dsi
    set ichars ""
    set insert_command ""
    set iei $dsi

    # ޤХåե
    .buffer.yanked_text insert end [.text get insert $dei ]
    # ƺ
    .text delete insert $dei

    # ХåեԤ˵
    research_buffer 

    # ⤷Ԥõϣʸ
    # ԤǤʤΤ
    set go_iei_cei { \
             if {([.text index insert]==[.text index "end -1c"]) && \
                 ([.text index "insert linestart"]!=\
                  [.text index "insert lineend"])} { \
                          .text mark set insert "insert -1c" } }
    eval $go_iei_cei
    set cei [.text index insert]
}

# dd κݤ dei 
# (եˤʤäƤޤ硤n ŬʹԿ(n_alt)ѹ)
proc compute_dei_for_dd { n } {
    set n_alt [expr [.text index "end linestart"] \
                           - [.text index insert] ] 
    set n_alt [expr int( $n_alt ) ]
    if { $n_alt < $n } { set n $n_alt }

    set index_now [expr int([.text index insert])]
    set dei [expr $index_now + $n].0
    return $dei
}


# "yy" ˤԥ
proc yank_by_yy { } { 
    global yank_type 
    set yank_type "yy"

   .navi.edit  insert insert "y"

    # Կn
    set n [.navi.edit  get ] 
    set n [string trim $n \n ] 
    set n [string trim $n y ] 

    # ߤιԤ
    set linenumber_now [.text index "insert linestart"]

   .buffer.yanked_text delete 1.0 end 
   .buffer.yanked_text insert end \
     [.text get $linenumber_now [expr int($linenumber_now + $n) ].0 ]
            
    research_buffer 
}


# "p" ˤץå
proc put_by_p { } {
    global csi dsi dei dchars pisi pichars piei isi ichars iei cei
    global go_csi_dsi go_dsi_pisi go_piei_isi go_iei_cei
    global delete_command insert_command
    global undo_flag
    global saved_flag
    global colored

    global lines_in_yank

    # ξ硤٥Ĥ餹
    if {[string length [.buffer.yanked_text get 1.0 end]] == 1 } {
        belll
        return
    } else {

    # Saved ե饰򿲤
    set saved_flag 0

    # [Saved]  [Modified] ˤ
    filename_modified

    set undo_flag 1
    set csi [.text index insert]
    set go_csi_dsi ""
    set dsi $csi
    set delete_command  { set dei $dsi }
    eval $delete_command
    set dchars ""

    # Ԥξ
    if {[string compare \
         [.buffer.yanked_text index "end -1 c linestart"] \
         [.buffer.yanked_text index "end -1 c lineend"]] == 0} { 

        set go_dsi_pisi { .text mark set insert "insert lineend" }
        eval $go_dsi_pisi
        set pisi [.text index insert]
        set pichars "\n"
        .text insert insert "\n"
        set piei [.text index insert]
        set go_piei_isi ""
        set isi $piei
        set insert_command \
            { set ichars [.buffer.yanked_text get 1.0 "end -2c"] }
        eval $insert_command
        .text insert insert $ichars
        set iei [.text index insert]
        set go_iei_cei { .text mark set insert "$csi lineend +1c" }
        eval $go_iei_cei
        set cei [.text index insert]

    # (Ԥ)ʸξ(˲ԥ̵)
    } else {

        set go_dsi_pisi ""
        set pisi $csi
        set pichars ""
        set piei $csi
        set go_piei_isi ""

        # ԤǤʤ硤ʸ
        if {[string compare [.text index "insert linestart"] \
                            [.text index "insert lineend"]] != 0 } {
            set go_piei_isi { .text mark set insert "insert + 1 c" }
            eval $go_piei_isi
        }
        set isi [.text index insert]
        set insert_command \
             { set ichars [.buffer.yanked_text get 1.0 "end -1c"] }
        eval $insert_command
        .text insert insert $ichars
        set iei [.text index insert]
        set go_iei_cei { .text mark set insert "insert -1c" }
        eval $go_iei_cei
        set cei [.text index insert]
    }
    clear_mem_y
    cursor_put
    .navi.edit configure -state normal
    .navi.edit delete 0 end
    .navi.edit insert 0 "put "
    .navi.edit insert end [.navi.buffer get ]
    .navi.edit configure -state disabled
    }

    # դ
    if {$colored=="1"} {
        colorize $isi $iei
    }
}


# "P" ˤץå
proc put_by_large_p { } {
    global csi dsi dei dchars pisi pichars piei isi ichars iei cei
    global go_csi_dsi go_dsi_pisi go_piei_isi go_iei_cei
    global delete_command insert_command
    global undo_flag
    global saved_flag
    global colored

    global lines_in_yank

    # ξ硤٥Ĥ餹
    if {[string length [.buffer.yanked_text get 1.0 end]] == 1 } {
        belll
        return
    } else {

    # Saved ե饰򿲤
    set saved_flag 0

    # [Saved]  [Modified] ˤ
    filename_modified

    set undo_flag 1
    set csi [.text index insert]
    set go_csi_dsi ""
    set dsi $csi
    set delete_command  { set dei $dsi }
    eval $delete_command
    set dchars ""

    # Ԥξ
    if {[string compare \
               [.buffer.yanked_text index "end -1 c linestart"] \
               [.buffer.yanked_text index "end -1 c lineend"]] == 0} { 

        set go_dsi_pisi { .text mark set insert "insert linestart" }
        eval $go_dsi_pisi
        set pisi [.text index insert]
        set pichars "\n"
        .text insert insert "\n"
        set piei [.text index insert]
        set go_piei_isi {.text mark set insert "insert -1c"}
        eval $go_piei_isi
        set isi [.text index insert]
        set insert_command \
            { set ichars [.buffer.yanked_text get 1.0 "end -2c"] }
        eval $insert_command
        .text insert insert $ichars
        set iei [.text index insert]
        set go_iei_cei { .text mark set insert "$csi linestart" }
        eval $go_iei_cei
        set cei [.text index insert]

    # (Ԥ)ʸξ(˲ԥ̵)
    } else {

        set go_dsi_pisi ""
        set pisi $csi
        set pichars ""
        set piei $csi
        set go_piei_isi ""
        set isi $csi
        set insert_command \
             { set ichars [.buffer.yanked_text get 1.0 "end -1c"] }
        eval $insert_command
        .text insert insert $ichars
        set iei [.text index insert]
        set go_iei_cei ""
        set cei $iei
    }
    clear_mem_y
    cursor_put
    .navi.edit configure -state normal
    .navi.edit delete 0 end
    .navi.edit insert 0 "Put "
    .navi.edit insert end [.navi.buffer get ]
    .navi.edit configure -state disabled
    }

    # դ
    if {$colored=="1"} {
        colorize $isi $iei
    }
}

# J ˤϢ
proc connect_by_large_j { } {
    global csi dsi dei dchars pisi pichars piei isi ichars iei cei
    global go_csi_dsi go_dsi_pisi go_piei_isi go_iei_cei
    global delete_command insert_command
    global undo_flag
    global saved_flag

    # ⤷եԤä٥Ĥ餹Ǥʤˤ⤷ʤ
    if {[string compare [.text index "insert lineend"] \
                        [.text index "end - 1 c lineend"] ] == 0 } {
        belll 

    # եԤǤʤ
    } else { 

        # Saved ե饰򿲤
        set saved_flag 0

        # [Saved]  [Modified] ˤ
        filename_modified

        set undo_flag 1
        set csi [.text index insert]
        set go_csi_dsi { .text mark set insert "insert lineend" }
        .text mark set insert "insert lineend"
        set dsi [.text index insert]
        .text mark set mark_dsi insert ; # ϰ֤ mark
        .text mark set mark_dei "insert +1c" ; # λ֤ mark

        # äλ֤ʸĿʤƤ롼
        while {[string compare \
               [ .text get mark_dei "mark_dei + 1c"] " " ] == 0 } {
                   .text mark set mark_dei "mark_dei +1c" }

        set dei [.text index mark_dei]
        set delete_command { set dei [compute_dei_for_J]}
        set dchars [.text get mark_dsi mark_dei]
        set go_dsi_pisi ""
        set pisi $dsi
        set pichars ""
        set piei $dsi
        set go_piei_isi ""
        set isi $dsi
        set insert_command  { set ichars [compute_ichars_for_J] }
        eval $insert_command


        # Ǻ
        .text delete mark_dsi mark_dei

        # 
        .text insert insert $ichars

        set iei [.text index insert]

        set go_iei_cei { if {$ichars == " "} \
              { .text mark set insert "insert -1 c" } else { } }
        eval $go_iei_cei
        set cei [.text index insert] 

        .navi.edit configure -state normal
        .navi.edit delete 0 end
        .navi.edit insert 0 "J"
        .navi.edit configure -state disabled

        clear_mem_y
        cursor_put
   }
}

# J ˤϢκݤ dei 
proc compute_dei_for_J { } {
    .text mark set mark_dei "insert +1c" ; # λ֤ mark
    # äλ֤ʸĿʤƤ롼
    while {[string compare \
           [ .text get mark_dei "mark_dei + 1c"] " " ] == 0 } {
               .text mark set mark_dei "mark_dei +1c" }
    set dei [.text index mark_dei]
    return $dei
}

# J ˤϢκݤ ichars (ʸζ뤫ݤ)
proc compute_ichars_for_J { } {
    if {[.text index "insert linestart"]== \
               [.text index "insert lineend"]} {
        set ichars "" 
    } elseif { [joint_asciis]=="1"} {
        set ichars " "
    } else { 
        set ichars ""
    }
    return $ichars
}

# J ˤϢκݤ˶ʳ ascii ʸ³褦ȤƤ뤫
# ɤȽǤ
proc joint_asciis { } {
    global isi
    set ascii_char {abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-^\\@\[\];:,./!"#$%&'()~=|`\{\}*+<>?_}

    set char1 [.text get "$isi -1c" $isi]
    set char2 [.text get "$isi +1c" "$isi +2c"]
    set flag [expr [regexp "\\$char1" $ascii_char] \
                 * [regexp "\\$char2" $ascii_char] ]
    return $flag
}

proc toplevel_yanked_text { } {
    set x_pointer [winfo pointerx .]
    set y_pointer [winfo pointery .]
    wm geometry .buffer +[expr $x_pointer -350]+[expr $y_pointer -350]
    wm deiconify .buffer 
}

# ХåեΥݥåץå
proc buffer_popup { } {
    .navi.buffer_label.menu post  \
                    [expr [winfo pointerx . ] - 40 ] \
                    [expr [winfo pointery . ] - 10 ]
    .navi.buffer_label.menu activate 0
      
}

# ХåեΥݥåץå
proc history_buffer_popup { } {
    set x [expr [winfo x .navi.buffer_label.menu ] +20 ]
    set y [expr [winfo y .navi.buffer_label.menu ] -390 ]
   .his_buffer post $x $y
   .his_buffer activate 21
}

proc buffer_ok { } {
    research_buffer
    wm withdraw .buffer
}


# ޥˤԥ
proc trace_for_line_yank { } {
    global line_yank
    global backup_edit_entry 
    global yank_line_start 
    global yank_end 

    if { $line_yank > 0.5 } {
       .text mark set insert current
        set yank_line_start [ .text index "insert linestart" ]
        cursor_put
    }
    while { $line_yank > 0.5 } {
       # 뤬褦˥
      .text mark set insert current
      .text mark set insert "insert lineend + 1 c "
      .text see insert 

       # 뤬褦˥
      .text mark set insert current
      .text mark set insert "insert linestart - 1 c "
      .text see insert 

      .text mark set insert current

       # դ
      .text tag remove cut_and_paste 1.0 end
      .text tag add cut_and_paste $yank_line_start "insert lineend + 1 c "
       set yank_end [ .text index "insert lineend + 1 c " ]
 
       # Կ.navi.edit ɽ
      .navi.edit configure -state normal
      .navi.edit delete 0 end 
       set number [ expr int($yank_end) - int($yank_line_start) ] 

       if {$number > 0 } {
             .navi.edit insert insert  $number 
       } else { 
             .navi.edit delete 0 end 
       } 

       update 
     }
    .text mark set insert $yank_line_start
     focus .navi.edit
}
##########################################################
# ޡˤ󥯴ط
##########################################################

# 󥯤γ
proc start_line_yank { } {
    global yank_line_start 
    global yank_char_start 
    global panel_color

    set yank_char_start [ .text index insert ]

    set yank_line_start [ .text index "insert linestart" ]

   .text tag remove cut_and_paste 1.0 end
   .text tag add cut_and_paste $yank_char_start 

   .cursor configure -bg $panel_color

   .navi.edit configure -state normal
   .navi.edit delete 0 end
   .navi.edit insert insert "1"
   .navi.edit configure -state disabled
}

# ɽ
proc trace_for_yank { } {
    global \
        yank_line_start \
        yank_char_start \
        yank_end \
        yank_char_or_line

    .navi.edit configure -state normal
    .navi.edit delete 0 end 

   .text tag remove cut_and_paste 1.0 end

  # ʸԤǾʬ
  if {$yank_char_or_line == 0 } {

  # (1) ʸξ
   if {[string compare $yank_char_start "none"] == 0 } { } else {
      set yank_end [.text index insert ]

      # 羮Ǿʬ
      set trimmed_s [string trimleft \
            [string trimleft $yank_char_start 0123456789 ] "." ] 
      set trimmed_e [string trimleft \
            [string trimleft $yank_end 0123456789 ] "." ] 

      # (a) 
      if {[string compare $yank_char_start $yank_end] == 0 } {
      .text tag add cut_and_paste $yank_char_start "insert + 1 c "

          # .navi.edit ʸ򥫥
          set number  1 

      # (b) end  start 礭()
      } elseif { $trimmed_s < $trimmed_e } { 
      .text tag add cut_and_paste $yank_char_start "insert + 1 c "

          # .navi.edit ʸ򥫥
          set number  [expr $trimmed_e - $trimmed_s + 1 ] 

      # (c) start  end 礭()
      } else { \
      .text tag add cut_and_paste insert "$yank_char_start + 1 c " 

          # .navi.edit ʸ򥫥
          set number  [expr $trimmed_s - $trimmed_e + 1 ] 
      }
      .navi.edit insert insert  $number 
      .navi.edit configure -state disabled
   }

  } else {
  # (2) Ԥξ
   if {[string compare $yank_line_start "none"] == 0 } { } else {
      set yank_end [.text index "insert linestart"]

      # 羮Ǿʬ
      # (a) 
      if {[string compare $yank_line_start $yank_end] == 0 } {
       .text tag add cut_and_paste $yank_line_start "insert lineend + 1 c "
       set number  1 

      # (b) end  start 礭()
      } elseif { $yank_line_start < $yank_end } {
       .text tag add cut_and_paste $yank_line_start "insert lineend + 1 c "
       set number [ expr int($yank_end) - int($yank_line_start) + 1 ] 

      # (c) end  start 꾮(̤ȵ)
      } else { 
       .text tag add cut_and_paste \
             "insert linestart" "$yank_line_start lineend + 1 c"
       set number [ expr int($yank_line_start) - int($yank_end) + 1 ] 
      } 
      .navi.edit insert insert  $number 
      .navi.edit configure -state disabled
    }
  }
}

# 󥯻 x ˤõ
proc delete_by_x_in_line_yank { } {
    global yank_char_or_line
    global yank_line_start 
    global yank_char_start 
    global fore_color
    global back_color

    global csi dsi dei dchars pisi pichars piei isi ichars iei cei
    global go_csi_dsi go_dsi_pisi go_piei_isi go_iei_cei
    global delete_command insert_command
    global num_chars ; # ɥΤȤѤ
    global undo_flag
    global saved_flag

    # ԤꤷƤ٥Ĥ餷Ƥȴ
    if {$yank_char_or_line == 1 } { belll ; return }

    # ޡƬ insert ư
    .text mark set insert cut_and_paste.first

    # Saved ե饰򿲤
    set saved_flag 0

    # [Saved]  [Modified] ˤ
    filename_modified

    set undo_flag 1
    set csi [.text index insert]
    set go_csi_dsi ""
    set dsi $csi
    set go_dsi_pisi ""
    set pisi $csi
    set pichars ""
    set piei $csi
    set go_piei_isi ""
    set isi $csi
    set insert_command ""
    set ichars ""
    set iei $csi
    set go_iei_cei ""

    # ХåեˤǼ
    .buffer.yanked_text delete 1.0 end
    .buffer.yanked_text insert insert \
                 [.text get cut_and_paste.first cut_and_paste.last]
    research_buffer

    # ʸ
    set s [string trimleft [.text index cut_and_paste.first] 0123456789]
    set s [string trimleft $s . ]
    set e [string trimleft [.text index cut_and_paste.last] 0123456789]
    set e [string trimleft $e . ]
    set n [expr $e - $s ]

    # ɥɥ
    set dei [.text index "insert + $n c"]
    set num_chars $n
    set delete_command \
         { set dei [compute_dei_for_nx_redo $num_chars] }
    set dchars [.text get insert "insert + $n c"]

    # Ǻ
    .text delete insert "insert + $n c" 

    #.text delete cut_and_paste.first cut_and_paste.last

    set go_iei_cei { compute_go_iei_cei_for_nx }
    compute_go_iei_cei_for_nx
    set cei [.text index insert]

    .navi.edit configure -state normal
    .navi.edit insert end "x" 
    .navi.edit configure -state disabled
    focus .virtual
    .text tag configure cur -background $fore_color \
                            -foreground $back_color
    .cursor configure -bg fore_color
    cursor_put 
    set yank_line_start "none"
    set yank_char_start "none"
    set yank_char_or_line 0
}


#######################################################
#                      ط
#######################################################

# ֤᤹ץ
#        ̵0 1  2
proc navi_search_cond_back { } {
    global navi_search_cond
    global panel_color
    if {$navi_search_cond == 0} {
        .replace.direction configure -text "  "  -relief flat 
        .replace.search configure -bg $panel_color
    } elseif {$navi_search_cond == 1} {
        .replace.direction configure -text ""  -relief raised 
    } elseif {$navi_search_cond == 2} {
        .replace.direction configure -text ""  -relief raised 
    } 
    catch { kanjiInput end .replace.search }
}

proc search_forward { } {
    global backup_navi_search
    global navi_search
    global search_forward_flag
    global back_color

    catch { lower .pattern_not_found }
    set backup_navi_search $navi_search
    set navi_search ""
    set search_forward_flag 1
    cursor_clear
    .replace.direction configure -text ""  -relief raised 
    .replace.search configure -bg $back_color -state normal
    focus .replace.search
}

proc search_backward { } {
    global backup_navi_search
    global navi_search
    global search_forward_flag
    global back_color

    catch { lower .pattern_not_found }
    set backup_navi_search $navi_search
    set navi_search ""
    set search_forward_flag 0
    cursor_clear
    .replace.direction configure -text ""  -relief raised 
    .replace.search configure -bg $back_color -state normal
    focus .replace.search
}

proc search_return { } {
    global search_forward_flag
    global navi_search_cond
    if {$search_forward_flag == 1} {
        searching 1
        set navi_search_cond 1
    } else {
        searching 0
        set navi_search_cond 2
    }
    catch { kanjiInput end .replace.search }
    .replace.search configure -state disabled
}

proc searching actual_forward_flag {
    global navi_search
    global backup_navi_search
    global navi_search_cond
    global search_text

    if {($navi_search=="") && ($backup_navi_search!="")} {
        set navi_search $backup_navi_search
    }

    # ξ
    if {$actual_forward_flag == 1 } {
        set another_part 0

        # ޤ insert + 1 c ΥƥȤ򸡺
        set results \
          [kstring first $navi_search [.text get "insert + 1 c" end] ]

        # ̵硤ƥȤκǽ餫 insert (ܦ) ޤǤ򸡺
        if { $results == -1 } {
            set results \
           [kstring first $navi_search [.text get 1.0 "insert + 50 c"] ]
            set another_part 1
        }

        # ̵̤ξ硤Pattern not Found Ф
        if { $results == -1 } {
            place .pattern_not_found \
                    -x [expr [winfo x .replace.search] \
                           + [winfo x .replace] + 1] \
                    -y [expr [winfo y .replace.search] \
                           + [winfo y .replace] + 1] 
            update
            raise .pattern_not_found
            belll
            cursor_put
            after 1500 { lower .pattern_not_found }

        # Ⱦ˷̤ξ
        } elseif { $another_part == 0 } {
            # ޤǤΥƥȤö .search.text 
            # áǤƤκǽ֤ΥǥåФ
            .search_text delete 1.0 end 
            .search_text insert 1.0 [.text get 1.0 "insert + 1 c"]
            .search_text insert end \
             [kstring range [.text get "insert + 1 c" end] 0 $results]
            set search_index [.search_text index "end - 2 c"]
      
            .text mark set insert $search_index
            cursor_put

        # Ⱦ˷̤ξ
        } else {
            # ޤǤΥƥȤö .search.text 
            # áǤƤκǽ֤ΥǥåФ
            .search_text delete 1.0 end 
            .search_text insert end \
             [kstring range [.text get 1.0 "insert + 50 c"] 0 $results]
            set search_index [.search_text index "end - 2 c"]
      
            .text mark set insert $search_index
            cursor_put
        }

    # ξ
    } else {
        set another_part 0

        # ξˤΤߡʸĹ(ǥå)
        #   Τɬפ
        set length [.replace.search index end]

        # ޤ "insert Ĺ" ΥƥȤ򸡺
        set results [kstring last $navi_search \
                    [.text get 1.0 "insert +$length c -1 c" ] ]

        # ̵硤ƥȤκǸ夫 insert (ܦ) ޤǤ򸡺
        if { $results == -1 } {
            set results \
            [kstring last $navi_search [.text get "insert - 50 c" end] ]
            set another_part 1
        }

        # ̵̤ξ硤Pattern not Found Ф
        if { $results == -1 } {
            place .pattern_not_found \
               -x [expr [winfo x .replace.search] \
                      + [winfo x .replace] + 1] \
               -y [expr [winfo y .replace.search] \
                      + [winfo y .replace] + 1] 
            update
            raise .pattern_not_found
            belll
            cursor_put
            after 1500 { lower .pattern_not_found }

        # Ⱦ˷̤ξ
        } elseif { $another_part == 0 } {
            # ޤǤΥƥȤö .search.text 
            # áǤƤκǽ֤ΥǥåФ
            .search_text delete 1.0 end 
            .search_text insert end \
             [kstring range \
             [.text get 1.0 "insert + $length c -1 c" ] 0 $results]
            set search_index [.search_text index "end - 2 c"]
      
            .text mark set insert $search_index
            cursor_put

        # Ⱦ˷̤ξ
        } else {
            # ޤǤΥƥȤö .search.text 
            # áǤƤκǽ֤ΥǥåФ
            .search_text delete 1.0 end 
            .search_text insert end [.text get 1.0 "insert - 50 c" ] 
            .search_text insert end \
             [kstring range [.text get "insert - 50 c" end] 0 $results]
            set search_index [.search_text index "end - 2 c"]
      
            .text mark set insert $search_index
            cursor_put
        }
    }
    focus .virtual
}

proc search_by_small_n { } {
    global search_forward_flag
    if {$search_forward_flag == 1} {
        searching 1
    } else {
        searching 0
    }
}

proc search_by_large_n { } {
    global search_forward_flag
    if {$search_forward_flag == 1} {
        searching 0
    } else {
        searching 1
    }
}

# sed ˤִ
proc do_replace { } {
    global replace_from replace_to
    global sed_command
    global colored

    global csi go_csi_dsi dsi dei delete_command dchars go_dsi_pisi
    global pisi pichars piei go_piei_isi isi insert_command ichars
    global iei go_iei_cei cei
    global saved_flag undo_flag command_name

    # Saved ե饰򿲤
    set saved_flag 0

    # [Saved]  [Modified] ˤ
    filename_modified

    set undo_flag 1

    # ɥɥΤʬ
    set csi [.text index insert]
    .text mark set insert $replace_from.0
    set command_name "replace"
    set go_csi_dsi { .text mark set insert $replace_from.0 } 
    eval $go_csi_dsi
    set dsi [.text index insert]
    set delete_command { 
            # ʬΥƥȤڤäƥե¸
            set f [ open tvi_tmp_replace_org_text.txt w ]
            puts $f [.text get $replace_from.0 "$replace_to.0 lineend"]
            close $f

            # sed ޥɤե˽񤭽Ф
            set f [ open tvi_tmp_sed_command.txt w ]
            puts -nonewline $f [.replace_window.text get 1.0 end]
            close $f

            # sed ¹
            exec $sed_command -f tvi_tmp_sed_command.txt tvi_tmp_replace_org_text.txt > tvi_tmp_replaced_text.txt

            set dei [.text index "$replace_to.0 lineend +1c"] 
            .buffer.yanked_text delete 1.0 end 
            .buffer.yanked_text insert 1.0 \
               [.text get $replace_from.0 "$replace_to.0 lineend +1c"]
            research_buffer }
    eval $delete_command
    set dchars [.text get $dsi $dei]

    # ʬΥƥȤڤ
    .text delete $replace_from.0 "$replace_to.0 lineend +1c"

    set go_dsi_pisi ""
    set pisi $dsi
    set pichars ""
    set piei $dsi
    set go_piei_isi ""
    set isi $dsi
    # ̤ɤ߹
            #.text insert $replace_from.0 [read $f 10000000]
    set insert_command \
          { \
            set f [ open tvi_tmp_replaced_text.txt r ]
            set ichars [read $f 10000000]
            close $f 
            #set ichars [string trimright $ichars "\n"] 
           
            exec rm -f tvi_tmp_replace_org_text.txt
            exec rm -f tvi_tmp_replaced_text.txt
            exec rm -f tvi_tmp_sed_command.txt
           }

    set f [ open tvi_tmp_replaced_text.txt r ]
    set ichars [read $f 10000000]
    close $f 
    #set ichars [string trimright $ichars "\n"]

    .text insert insert $ichars
    set iei [.text index insert]
    set go_iei_cei back_one_char_when_escape
    back_one_char_when_escape
    set cei [.text index insert]
    cursor_put

    # .navi.edit ˤʤäޥɤɽ
    .navi.edit configure -state normal
    .navi.edit insert end $command_name
    .navi.edit insert end " "
    .navi.edit insert end [.navi.buffer get] 
    .navi.edit configure -state disabled

    # 
    exec rm -f tvi_tmp_replace_org_text.txt
    exec rm -f tvi_tmp_replaced_text.txt
    exec rm -f tvi_tmp_sed_command.txt

    # ⤷դƤʤ鿧դľ
    if {$colored=="1"} {
        colorize $replace_from.0 [.text index insert]
    }
}

# ɥΥݥåץå
proc replace_popup { } {
    global back_color

    set x [expr [winfo rootx .] + [winfo width .]/2 \
                                 - [winfo reqwidth .replace_window]/2]
    set y [expr [winfo rooty .] + [winfo height .]/2 \
                                 - [winfo reqheight .replace_window]/2]
    wm geometry .replace_window +$x+$y
    wm deiconify .replace_window
    focus .replace_window.text
    # ⤷ sed ޥɤκǽ餬 "s//" ä "s/" ľ˥
    # äƹԤäƤ
    if {[.replace_window.text get 1.0 1.3]=="s//"} {
        .replace_window.text mark set insert 1.2
    }
}

######################################################
#      ̤Υåǽ
######################################################

proc checkbrace { open close } {
    .text mark set open_index_start insert
    .text mark set close_index_start insert
    set stop 0
    while {$stop == 0} {
        set tmp [.text search -backwards $open open_index_start 1.0 ]
        if {$tmp == ""} { belll ; return }
        .text mark set open_index $tmp
        set results [.text search -backwards \
                              $close close_index_start open_index ]
        if {$results == ""} { 
            set stop 1 ;# ȴƥդ
        } else {
            .text mark set open_index_start  open_index
            .text mark set close_index_start $results
        }
    }
    .text tag add brace [.text index open_index]
    after 700 { .text tag remove brace 1.0 end }
}

##################################################################
#               ɥΤΥץ㷲
##################################################################

# ɥᥤץ
#       ɥ""ɥȽǤ
proc undo_main { } {
    global undo_flag
    global saved_flag
    if { $saved_flag == 1 } { belll ; return }
    if { $undo_flag == 1 } {
        undoing
    } elseif { $undo_flag == 0 } {
        unundoing
    }
}

# ɥ
proc undoing { } {
    global undo_flag
    global csi dsi dei dchars pisi piei isi iei cei
    global colored

   .text delete $isi $iei
   .text delete $pisi $piei
   .text insert $dsi $dchars

   .text mark set insert $csi

    # lineend ä飱ʸ
    if {[.text index insert] == [.text index "insert lineend"]} {
        if {[.text index "insert linestart"] \
                          != [.text index "insert lineend"]} {
            .text mark set insert "insert -1 c"
        }
    }
    cursor_put
    set undo_flag 0

    # դ
    if {$colored=="1"} {
        colorize $dsi $dei
    }
}

# ""ɥ
proc unundoing { } {
    global undo_flag
    global csi dsi dei dchars pisi pichars isi ichars iei cei
    global colored

   .text delete $dsi $dei
   .text insert $pisi $pichars
   .text insert $isi $ichars

   .text mark set insert $csi

    # lineend ä飱ʸ
    if {[.text index insert] == [.text index "insert lineend"]} {
        if {[.text index "insert linestart"] \
                          != [.text index "insert lineend"]} {
            .text mark set insert "insert -1 c"
        }
    }

    cursor_put
    set undo_flag 1

    # դ
    if {$colored=="1"} {
        colorize $isi $iei
    }
}

# ɥ
proc redoing { } {
    global csi dsi dei dchars pisi pichars piei isi ichars iei cei 
    global go_csi_dsi go_dsi_pisi go_piei_isi go_iei_cei 
    global delete_command insert_command
    global undo_flag
    global num_chars ; # "R"ΤȤʤɤ˻Ȥ
    global colored
    global replace_from replace_to sed_command ;# sed ˤִΤ

    # ⤷ csi ʤ٥Ĥ餷ȴ
    if {$csi==""} { belll ; return }

    set csi [.text index insert]     ; # ޤ index  csi ˵Ͽ
    eval $go_csi_dsi                 ; # csi  dsi ˰ư
    set dsi [.text index insert]     ; # dsi Ͽ
    eval $delete_command             ; # delete_command  dei 
    set dchars [.text get $dsi $dei] ; # dchars 
   .text delete $dsi $dei            ; # dsi  dei 
    eval $go_dsi_pisi                ; # dsi  pisi ˰ư
    set pisi [.text index insert]    ; # pisi Ͽ
   .text insert insert $pichars      ; # pichars 
    set piei [.text index insert]    ; # piei Ͽ
    eval $go_piei_isi                ; # piei  isi ˰ư
    set isi [.text index insert]     ; # isi Ͽ
    eval $insert_command             ; # insert_commandichars
   .text insert insert $ichars       ; # ichars 
    set iei [.text index insert]     ; # iei Ͽ
    eval $go_iei_cei                 ; # iei  cei ˰ư
    set cei [.text index insert]     ; # cei Ͽ
    cursor_put
    set undo_flag 1

    # դ
    if {$colored=="1"} {
        colorize $isi $iei
    }
}

###############################################################
#       եɤ߹ߡ¸˴ؤץ㷲
###############################################################
# եɤ߹ߥץ  
proc loadfile filename {
     global tvi_directory
     global new_filename
     global short_filename
     global operated_text
     global maximum_lines
     global color_lines
     global colored
     global dvifilename
     global replace_from
     global replace_to
   
     catch { set f [open "$filename"] 
           .text insert end [read $f 10000000] 
            close $f }
     # ˤĤ;פʲԥɤõ
     .text delete "end - 1 c " end

     # ֤
     .text mark set insert 1.0
     update
     cursor_put
     # .text tag add cur insert "insert + 1 c "
     focus .virtual

     # Կɽ
     .text_linenumber configure -state normal

     set number_file [open "$tvi_directory/number" ]

     # Կɤ߹
     .text_linenumber insert end \
     [read $number_file [expr 7*$maximum_lines] ]

     # ˤĤ;פʲԥɤõ
     .text_linenumber delete "end - 1 c " end

     .text_linenumber configure -state normal

     # navi.main ˹Կɽ
     .navi.main configure -state normal
     .navi.main delete 0 end 

     # ǥ쥯ȥʤɤ򥫥åȤե̾ɽ
     set directory [string last / $filename ]
     set short_filename \
        [string range $filename [expr $directory + 1] end ]

     set linenumber 0
     if { $new_filename == 1 } {
         .navi.main insert insert "`$short_filename'" 
         .navi.main insert insert { [New file]}
     } else {
         .navi.main insert insert "`$short_filename'" 
         .navi.main insert insert { [}
         set linenumber [.text index "end -1 c linestart"]
         set linenumber [expr int($linenumber)]
         .navi.main insert insert  $linenumber

         if { $linenumber == 1 } { 
            .navi.main insert insert { line]} 
         } else {
            .navi.main insert insert { lines]} 
         }
     }
    .navi.main configure -state disabled 
    #.navi.main configure -state normal

    # ɥȤ˥ե̾ɽ
    wm title . "Tvi: $filename"
    # .navi.edit ⥯ꥢ
    #.navi.edit configure -state normal
    #.navi.edit delete 0 end
    #.navi.edit configure -state disabled

    # operated_text ⥯ꥢundo Ǥʤ褦ˤ
    set operated_text "none"

    # Xdvi ѤΥե̾Ĥ
    set dvifilename [string trimright $filename "tex"]
    set dvifilename [string trimright $dvifilename "."]

    # ִΤᡤǽȺǸιԿꤹ
    set replace_from 1
    set replace_to $linenumber

    # Կ color_lines ʲʤ鿧դ
    set colored 0
    if {$linenumber <= $color_lines} {
         set colored 1
         colorize 1.0 end
    } else {
         colorize_formula 1.0 end
    }
    
    # Υꥢ
    del_bookmark
}

# GUIˤեɤ߹
proc openfile { } {
    global filename
    global saved_flag
    global new_filename
    global file_dir
    global new_or_insert
    global insert_line
    global kanji_code
    global tvi_directory

    # ⤷⡼ɤä escaping 
    if {[focus] == ".text" } {  
       for_redo_end
      .text tag remove inserted_text_tag 1.0 end
       escaping
       clear_mem_y
       catch {kanjiInput end .text}
       for_unundo i
    }

    # ξΤ֤򸽺ߤΥΰ֤ˤ
    set insert_line [expr int([.text index "insert linestart"])] 

    #set new_or_insert 0 ; # ɤ߹ߥפֿפˤ

    # tk_getOpenFile ƤӽФ
    set types {
	{"TeX files"		{.tex .sty}}
	{"Text files"		.txt}
	{"All files"		*}
    }
    set tmp [tk_getOpenFile -filetypes $types -initialdir $file_dir ]

    # Cancel ä褿硤⤷ʤ    
    if {$tmp == ""} {
       return

    # ξ
    } elseif {$new_or_insert == 1 } {

        # ޤ insert ư
        #.text mark set insert [expr $insert_line + 1 ].0
        .text mark set insert $insert_line.0

        global csi go_csi_dsi dsi dei delete_command dchars go_dsi_pisi
        global pisi pichars piei go_piei_isi isi insert_command ichars
        global iei go_iei_cei cei
        global saved_flag undo_flag command_name
        global colored

        # Saved ե饰򿲤
        set saved_flag 0

        # [Saved]  [Modified] ˤ
        filename_modified

        set undo_flag 1

        set command_name "o"
        set csi [.text index insert]
        set go_csi_dsi ""
        set dsi $csi
        set dei $csi
        set delete_command ""
        set dchars ""
        set go_dsi_pisi { .text mark set insert "insert lineend" }
        eval $go_dsi_pisi
        set pisi [.text index insert ]
        set pichars "\n"
        .text insert insert $pichars
        set piei [.text index insert]
        set go_piei_isi ""
        set isi $piei

        # ɤ߹
        set f [open "$tmp"]
        set f1 [read -nonewline $f ] 
        .text insert insert $f1
        close $f 

        set iei [.text index insert] 
        set ichars [.text get $isi $iei ]
        set insert_command "" ; # insert_command ϶ˤƤ
        set go_iei_cei "back_one_char_when_escape" 
        eval $go_iei_cei
        set cei [.text index insert] 

        # .navi.edit ˤʤäޥɤɽ
        .navi.edit configure -state normal
        .tmp delete 0 end   
        .tmp insert 0 $ichars  
        set number [.tmp index end]
        set chars "chars" 
        if { $number == "0" } { set chars "char" } ; # 0 ʸξ
        if { $number == "1" } { set chars "char" } ; # 1 ʸξ
        .navi.edit delete 0 end
        .navi.edit insert 0 "$command_name $number $chars" 
        .navi.edit configure -state disabled

#        clear_mem_y 
 
        # ɤ߹߻Ϥΰ֡ܣԤΰ֤ػäƹԤ
       .text mark set insert [expr $insert_line + 1 ].0
        cursor_put

        # դ
        if {$colored=="1"} {
            colorize $isi $iei
        } else {
            colorize_formula $isi $iei
        }

    # ξ
    } else {
       # ֺѤߤξ
       if {$saved_flag == 1} {
          .text delete 1.0 end
          .text_linenumber delete 1.0 end
           set new_filename 0
           set filename $tmp
           loadfile $filename ; # ɤ߹

           # file_dir ι
           set fullpathlist [split $filename / ]
           set file_dir [lrange $fullpathlist 0 [expr [llength $fullpathlist ] - 2 ]]
           set file_dir [join $file_dir / ]

           cd $file_dir

       # ֤Ƥʤ
       } else {
           set verify [tk_dialog .d "verify" \
             "ե뤬¸Ƥޤ" \
              warning 0 "¸Ƥɤ߹" \
                        "¸ɤ߹" \
                        "󥻥" ]

          # ¸Ƥɤ߹
          if {$verify == 0} {
             # ¸
             set f [ open $filename w ]
             puts -nonewline $f [.text get 1.0 end ]
             close $f

             # õ
            .text delete 1.0 end
            .text_linenumber delete 1.0 end

             # ɤ߹
             set filename $tmp
             set new_filename 0
             loadfile $filename
             set saved_flag 1

             # file_dir ι
             set fullpathlist [split $filename / ]
             set file_dir [lrange $fullpathlist 0 [expr [llength $fullpathlist ] - 2 ]]
             set file_dir [join $file_dir / ]

             cd $file_dir

          # ¸ʤɤ߹
          } elseif {$verify == 1} {
             # õ
            .text delete 1.0 end
            .text_linenumber delete 1.0 end

             # ɤ߹
             set filename $tmp
             set new_filename 0
             loadfile $filename
             set saved_flag 1

             # file_dir ι
             set fullpathlist [split $filename / ]
             set file_dir [lrange $fullpathlist 0 \
                             [expr [llength $fullpathlist ] - 2 ]]
             set file_dir [join $file_dir / ]
             cd $file_dir

          # ʳ
          } else { return } 
       }
    }
}

# GUI ˤեΥ
proc savefile { } { 
    global file_dir filename short_filename 
    global kanji_code tmp_kanji_code
    global dvifilename

    set tmp_kanji_code $kanji_code

    # ⤷⡼ɤä escaping 
    if {[focus] == ".text" } {  
       for_redo_end
      .text tag remove inserted_text_tag 1.0 end
       escaping
       clear_mem_y
       catch {kanjiInput end .text}
       for_unundo i
    }

    # tk_getSaveFile θƤӽФ
    set types {
	{"TeX files"		{.tex .sty}}
	{"Text files"		.txt}
	{"All files"		*}
    }
    set tmp [tk_getSaveFile -filetypes $types \
                   -initialdir $file_dir -initialfile $short_filename ]

    # 󥻥ä褿ϲ⤷ʤ
    if {$tmp == ""} {
       return

    # ԽƱ̾¸
    # (֤ .navi.main 񤭴)
    } elseif {$tmp == $filename } {
       save_file $filename


    # ԽȤϰ㤦̾¸ߤʤ̾ξ
    # (֤ .navi.main ѹǥ쥯ȥư)
    } elseif {[file exists $tmp] == 0} {

       # ޤ֤
       set filename $tmp
       save_file $filename

       # Xdvi ѤΥե̾Ĥ
       set dvifilename [string trimright $filename "tex"]
       set dvifilename [string trimright $dvifilename "."]

       # file_dir 򹹿
       set fullpathlist [split $filename / ]
       set file_dir [lrange $fullpathlist 0 \
                         [expr [llength $fullpathlist ] - 2 ]]
       set file_dir [join $file_dir / ]
       cd $file_dir ; # ǥ쥯ȥư

    # ԽȤϰ㤦̾ǡ¸ߤ
    # (ǧƤ饻֤ǥ쥯ȥư)
    } else {
       set verify [tk_dialog .d "verify" \
             "$tmp ϤǤ¸ߤեǤ" \
                 warning 1 "񤭤¸" "󥻥" ]
       if {$verify == 0} { 
           # ޤ֤
           set filename $tmp
           save_file $filename

           # Xdvi ѤΥե̾Ĥ
           set dvifilename [string trimright $filename "tex"]
           set dvifilename [string trimright $dvifilename "."]

           # file_dir 򹹿
           set fullpathlist [split $filename / ]
           set file_dir [lrange $fullpathlist 0 \
                         [expr [llength $fullpathlist ] - 2 ]]
           set file_dir [join $file_dir / ]
           cd $file_dir ; # ǥ쥯ȥư
       }
    }
}

# եξ񤭥
proc save_file { filename } { 
    global saved_flag
    global short_filename
    global tmp_kanji_code
 
    kanji defaultOutputCode $tmp_kanji_code
    set f [ open $filename w ]
    puts -nonewline $f [.text get 1.0 end ]
    close $f
    set saved_flag 1
 
    # .navi.main ɽ short_filename 
    set directory [string last / $filename ]
    set short_filename \
       [string range $filename [expr $directory + 1] end ]
 
    # navi.main ˹Կɽ
    .navi.main configure -state normal
    .navi.main delete 0 end 
    .navi.main insert insert "`$short_filename'" 
    .navi.main insert insert { [}
    set linenumber [.text index "end -1c"]
    set linenumber [expr int($linenumber)]
    .navi.main insert insert $linenumber
    if { $linenumber == 1 } { 
       .navi.main insert insert { line]} 
    } else {
       .navi.main insert insert { lines]} 
    }
    .navi.main configure -state disabled 

    # ɥȤ˥ե̾ɽ
    wm title . "Tvi: $filename"

}

# .navi.main  space 줿Ȥư
proc space_navi_main { } {
    global navi_main_backup
    global new_or_insert
    set navi_char [.navi.main get] 
    if {$navi_char==":e"} {
        .navi.main delete 0 end 
        .navi.main insert 0 $navi_main_backup
        .navi.main configure -state disabled
        focus .virtual
        cursor_put
        set new_or_insert 0 ; openfile
    } elseif {$navi_char==":r"} {
        .navi.main delete 0 end 
        .navi.main insert 0 $navi_main_backup
        .navi.main configure -state disabled
        focus .virtual
        cursor_put
        set new_or_insert 1 ; openfile
    } elseif {$navi_char==":w"} {
        .navi.main delete 0 end 
        .navi.main insert 0 $navi_main_backup
        .navi.main configure -state disabled
        focus .virtual
        cursor_put
        savefile
    }
}

# .navi.main  Return 줿Ȥư
proc do_navi_main { } {
    global navi_main
    global saved_flag
    global filename 
    global short_filename 

    # ¸Τ (:w)
    if { [string compare $navi_main ":w" ] == 0 } {
          set f [ open $filename w ]
          puts -nonewline $f [.text get 1.0 end ]
          close $f
          set saved_flag 1

    # navi.main ˹Կɽ
    .navi.main delete 0 end 
    .navi.main insert insert "`$short_filename'" 
    .navi.main insert insert { [}
    set linenumber [.text index "end -1c"]
    set linenumber [expr int($linenumber)]
    .navi.main insert insert $linenumber

    if { $linenumber == 1 } { 
        .navi.main insert insert { line]} 
    } else {
        .navi.main insert insert { lines]} 
    }
    .navi.main configure -state disabled 

    focus .virtual
    cursor_put

    # ¸ƽλ (:wq)
    } elseif { [string compare $navi_main ":wq" ] == 0 } {
          set f [ open $filename w ]
          puts -nonewline $f [.text get 1.0 end ]
          close $f
          catch { eval exec rm -f [glob tvi_*.ppm]  }
          exit

    # ǧ彪λ (:q)
    } elseif { [string compare $navi_main ":q" ] == 0 } {
         if { $saved_flag == 1 } {
            catch { eval exec rm -f [glob tvi_*.ppm]  }
            exit
         } else { 
           .navi.main delete 0 end 
           .navi.main insert insert "`$short_filename'" 
           .navi.main insert insert { [Modified]} 
           .navi.main configure -state disabled 
            belll 
            focus .virtual
            cursor_put
         }

    # λ (:q!)
    } elseif { [string compare $navi_main ":q!" ] == 0 } {
         catch { eval exec rm -f [glob tvi_*.ppm]  }
         exit

    # Return Τ
    } elseif { [string compare $navi_main ":" ] == 0 } {
         .navi.main delete 0 end 
          focus .virtual
          cursor_put
    # ʳϥ٥Ĥ餷
    } else { 
          belll 
         .navi.main delete 0 end 
          focus .virtual
          cursor_put
    }
} 

# :w[Enter] ¸
proc save_colon_w { } {
    global navi_main
    global saved_flag
    global filename 
    global short_filename 

    set f [ open $filename w ]
    puts -nonewline $f [.text get 1.0 end ]
    close $f
    set saved_flag 1

    # navi.main ˹Կɽ
    .navi.main configure -state normal
    .navi.main delete 0 end 
    .navi.main insert insert "`$short_filename'" 
    .navi.main insert insert { [}
    set linenumber [.text index "end -1c"]
    set linenumber [expr int($linenumber)]
    .navi.main insert insert $linenumber

    if { $linenumber == 1 } { 
        .navi.main insert insert { line]} 
    } else {
        .navi.main insert insert { lines]} 
    }
    .navi.main configure -state disabled 

    focus .virtual
    cursor_put
}

proc filename_modified { } {
      global short_filename
         .navi.main configure -state normal
         .navi.main delete 0 end 
         .navi.main insert insert "`$short_filename'" 
         .navi.main insert insert { [Modified]} 
         .navi.main configure -state disabled 
}


########################################################
#      ϤࡿȤ ˴ؤץ   #
########################################################

set bookmark_number 1

menu .bookmark -tearoff False
.bookmark add command -label "Ϥ" -command add_bookmark

.bookmark add separator
.bookmark add command -label "󥻥"
.bookmark add separator
.bookmark add separator

proc bookmark_popup { } {
        global bookmark_number
       .bookmark post \
            [expr [winfo rootx .menubuttons_bookmark] + 0] \
            [expr [winfo rooty .menubuttons_bookmark] + 25]

       if {$bookmark_number != 1} {
           for {set i 1} { $i < $bookmark_number } {incr i} {
               set insert [.text index bookmark$i ]
               set line   [string trimright $insert 0123456789 ]
               set line   [string trimright $line   . ]
               set column [ expr 1 + \
                       [string length [.text get \
                        "bookmark$i linestart" bookmark$i ]]]
              .bookmark entryconfigure [expr $i +4 ] \
                         -label "$line  $column ʸ" 
           }
       }
}

proc add_bookmark { } {
    global bookmark_number

    .text mark set bookmark$bookmark_number insert
    .bookmark add command -command "go_bookmark $bookmark_number"

    set bookmark_number [expr $bookmark_number + 1 ]
}

proc go_bookmark { bookmark_number } {
    .text mark set insert [.text index bookmark$bookmark_number]
    .text see insert
    clear_mem_y
    cursor_put
}

proc del_bookmark { } {
    global bookmark_number
    .bookmark delete 4 end
    set bookmark_number 1
}

############################
#  ڥå
############################
proc spellcheck { } {
    global tvi_directory filename short_filename ispell_dic
    global saved_flag ispell_id
    global sed_command

    # ޤΥ򤹤٤ƾõ
    for {set i 1} {$i<=$ispell_id} {incr i} { 
        .text tag remove bad_spell.$i 1.0 end
    }
    set ispell_id 0
   
    .text configure -cursor watch
    update

    # ޤ¸
    set f [ open $filename w ]
    puts -nonewline $f [.text get 1.0 end ]
    close $f
    set saved_flag 1

    # navi.main ˹Կɽ
    .navi.main configure -state normal
    .navi.main delete 0 end 
    .navi.main insert insert "`$short_filename'" 
    .navi.main insert insert { [}
    set linenumber [.text index "end -1 c linestart"]
    set linenumber [expr int($linenumber)]
    .navi.main insert insert  $linenumber

    if { $linenumber == 1 } {
       .navi.main insert insert { line]}
    } else {
       .navi.main insert insert { lines]}
    }
    .navi.main configure -state disabled

    update

    exec $sed_command -f $tvi_directory/sed_commands $filename | ispell  -a -n | grep -v \* | grep -v @ > tvi_tmp_spell_check.txt 

    # ispell Ѥμեκ
    set current_dir [ pwd ] ;# ޤ current directory ¸
    cd                      ;# cd ǥۡǥ쥯ȥ(^^;)
    exec touch $ispell_dic  ;# ǥեȸĿͼ touch
    exec cp $ispell_dic $current_dir/tvi_tmp_ispell_dic.txt
    cd $current_dir         ;# ޤ current directory 
    exec cat $tvi_directory/latex_commands     >> tvi_tmp_ispell_dic.txt
    exec cat $tvi_directory/latex_environments >> tvi_tmp_ispell_dic.txt
    exec cat $tvi_directory/latex_misc         >> tvi_tmp_ispell_dic.txt

    # ispell ˤ륹ڥå
    # ޤ̤褦ˤ礤ȥե륿򤫤ޤ
    exec $sed_command -f $tvi_directory/sed_commands $filename | ispell  -a -n -p tvi_tmp_ispell_dic.txt | grep -v \* | grep -v @ > tvi_tmp_spell_check.txt.org 
    # Τ˥åùƤ( :  , )
    exec $sed_command s/:/,/g tvi_tmp_spell_check.txt.org > tvi_tmp_spell_check.txt
    set file [open tvi_tmp_spell_check.txt]
    .spell_text delete 1.0 end
    .spell_text insert end [read $file 10000000 ]
    exec rm -f tvi_tmp_spell_check.txt
    exec rm -f tvi_tmp_spell_check.txt.org
    exec rm -f tvi_tmp_ispell_dic.txt

    for { set i 1 } { $i <= 10000000 } { incr i } {
        set top [.text get $i.0 "$i.0  + 1 c"]
        if { $top == "" } {
           break
        }
           set i_spell [ expr $i ]
           set flag [.spell_text get "${i_spell}.0 linestart" \
                                     "${i_spell}.0 lineend"     ]
           if {$flag == ""} {
           } elseif {[lindex $flag 0] == "#" } {
               spell_tag $i $flag
              .spell_text delete "${i_spell}.0 linestart" \
                                 "${i_spell}.0 lineend + 1 c" 
               set i [ expr $i -1 ]
           } elseif {[lindex $flag 0] == "&" } {
               spell_tag $i $flag
               .spell_text delete "${i_spell}.0 linestart" \
                                "${i_spell}.0 lineend + 1 c" 
               set i [ expr $i -1 ]
           } elseif {[lindex $flag 0] == "?" } {
               spell_tag $i $flag
               .spell_text delete "${i_spell}.0 linestart" \
                                "${i_spell}.0 lineend + 1 c" 
               set i [ expr $i -1 ]
           } elseif {[lindex $flag 0] == "+" } {
               .spell_text delete "${i_spell}.0 linestart" \
                                "${i_spell}.0 lineend + 1 c" 
               set i [ expr $i -1 ]
           } elseif {[lindex $flag 0] == "-" } {
               .spell_text delete "${i_spell}.0 linestart" \
                                "${i_spell}.0 lineend + 1 c" 
               set i [ expr $i -1 ]
           } else {
           }
    }
    .text configure -cursor xterm
}

# ispell ǰääս˥դƿŤ
proc spell_tag { i flag } {
    global ispell_id
    global ispell_errors
    global fore_color

    set line [.text get "$i.0 linestart" "$i.0 lineend"]
    set flag_top [lindex $flag 0]
    if {$flag_top == "#"} {
        set line [ string range $line 0 [lindex $flag 2] ]
    } elseif {$flag_top == "&"} {
        set offset [lindex $flag 3]
        set offset [string trimright $offset , ]
        set line [ string range $line 0 $offset ]
    } elseif {$flag_top == "?"} {
        set offset [lindex $flag 3]
        set offset [string trimright $offset , ]
        set line [ string range $line 0 $offset ]
    } else { }
   .spell_tmp delete 0 end 
   .spell_tmp insert end $line 
    set index [expr [ .spell_tmp index end ] - 1 ]
    set length [ string length [lindex $flag 1] ]

    incr ispell_id
    # դ
    .text tag add bad_spell.$ispell_id  $i.$index \
                                        $i.[expr $index + $length]
    # 
    .text tag configure bad_spell.$ispell_id \
                          -background Red -foreground $fore_color
    .text tag bind bad_spell.$ispell_id <Enter> \
                            { .text configure -cursor top_left_arrow }
    .text tag bind bad_spell.$ispell_id <Leave> \
                            { .text configure -cursor xterm } 
    .text tag bind bad_spell.$ispell_id <ButtonPress> \
                            { popup_ispell }
    .text tag lower bad_spell.$ispell_id cur

    # 顼å global ʥꥹȤ˳Ǽ
    set ispell_errors($ispell_id) $flag
}


# ڥåΥݥåץå
proc popup_ispell { } {
    global ispell_errors
    global ispell_current_tag

    # ޤޥݥ󥿤ΰ֤ index 
    set pointerx [expr [winfo pointerx .text]-[winfo rootx .text]]
    set pointery [expr [winfo pointery .text]-[winfo rooty .text]]
    set current_index [.text index @$pointerx,$pointery] 
    # ̾
    set ltags [.text tag names $current_index]
    set ispell_current_tag \
            [lindex $ltags [lsearch -glob $ltags bad_spell* ] ]
    set ispell_id [string trimleft $ispell_current_tag bad_spell]
    set ispell_id [string trimleft $ispell_id .]
    # , ǥꥹȤˤľ
    set error_msg [split $ispell_errors($ispell_id) , ]
    #  index 
    set tag_first [.text index $ispell_current_tag.first]
    set tag_last  [.text index $ispell_current_tag.last]

    # ˥塼κ
    .ispell delete 11 end
    .ispell add separator

    set flag_top [lindex [lindex $error_msg 0] 0]

    if { $flag_top=="&" | $flag_top=="?" } {
        set start 1
        set end [llength $error_msg]
        for {set i $start} {$i<$end} {incr i} { 
            .ispell add command -label "[lindex $error_msg $i] ˤβ֤" \
            -command "ispell_replace [subst $tag_first] [subst $tag_last] { [subst [lindex $error_msg $i] ] }"
            .ispell add command -label "[lindex $error_msg $i] ˤ٤ƤƱñ֤" \
            -command "ispell_replace_all [subst $tag_first] [subst $tag_last] { [subst [lindex $error_msg $i] ] }"
            .ispell add separator
        }
    }
    update
    .ispell post [expr [winfo pointerx .text] +30] \
                 [expr [winfo pointery .text] +10] 
}

# ispell 󼨤θؤִ(β)
proc ispell_replace { tag_first tag_last replace_word } {
   
    global csi go_csi_dsi dsi dei delete_command dchars go_dsi_pisi
    global pisi pichars piei go_piei_isi isi insert_command ichars
    global iei go_iei_cei cei
    global saved_flag undo_flag command_name

    # Saved ե饰򿲤
    set saved_flag 0

    # [Saved]  [Modified] ˤ
    filename_modified

    set undo_flag 1

    .text mark set insert $tag_first
    .text see insert ;# ǰΤ
    set command_name "cw"
    set csi $tag_first
    set go_csi_dsi ""
    set dsi $csi
    set dei $tag_last
    set delete_command { set dei [.text index "insert wordend"] 
        .buffer.yanked_text delete 1.0 end 
        .buffer.yanked_text insert 1.0 \
                [.text get insert [.text index "insert wordend"] ]
        research_buffer }
    set dchars [.text get $tag_first $tag_last]
    .buffer.yanked_text delete 1.0 end 
    .buffer.yanked_text insert 1.0 [.text get $tag_first $tag_last]
    research_buffer 
    .text delete $tag_first $tag_last ;# Ǻ
    set go_dsi_pisi ""
    set pisi $csi
    set pichars ""
    set piei $csi
    set go_piei_isi ""
    set isi $csi
    set insert_command ""
    set ichars [string trim $replace_word]
    .text insert $tag_first $ichars ;# 
    set iei [.text index insert]
    set go_iei_cei back_one_char_when_escape
    back_one_char_when_escape
    set cei [.text index insert]
    cursor_put

    # .navi.edit ˤʤäޥɤɽ
    .navi.edit configure -state normal
    .tmp delete 0 end   
    .tmp insert 0 $ichars  
    set number [.tmp index end]
    set chars "chars" 
    if { $number == "0" } { set chars "char" } ; # 0 ʸξ
    if { $number == "1" } { set chars "char" } ; # 1 ʸξ
    .navi.edit delete 0 end
    .navi.edit insert 0 "$command_name $number $chars" 
    .navi.edit configure -state disabled
}

# ispell 󼨤θؤִ(٤ƤƱñ)
proc ispell_replace_all { tag_first tag_last replace_word } {
    global ispell_current_tag
    global ispell_id
    set current_index [.text index insert]
    set tag_word \
      [.text get $ispell_current_tag.first $ispell_current_tag.last ]

    for {set num 1} { $num <= $ispell_id } {incr num} {
        catch { set tag_word_num \
            [.text get bad_spell.$num.first bad_spell.$num.last] }
        if {$tag_word_num==$tag_word} {
            ispell_replace [.text index bad_spell.$num.first] \
                           [.text index bad_spell.$num.last] \
                           $replace_word
        }
    }
    .text mark set insert $current_index
    cursor_put
}

# ispell ǡ֤βOK
proc ispell_current_ok { } {
    global ispell_current_tag
    .text tag remove $ispell_current_tag 1.0 end
}

# ispell ǡƱñϤ٤OK
proc ispell_same_word_ok { } {
    global ispell_current_tag
    global ispell_id
    set tag_word \
      [.text get $ispell_current_tag.first $ispell_current_tag.last ]

    for {set num 1} { $num <= $ispell_id } {incr num} {
        catch { set tag_word_num \
            [.text get bad_spell.$num.first bad_spell.$num.last] }
        if {$tag_word_num==$tag_word} {
            .text tag remove bad_spell.$num 1.0 end 
        }
    }
}

# ispell ǡ֤٤Ƥñ줬OK
proc ispell_all_ok { } {
    global ispell_id

    for {set num 1} { $num <= $ispell_id } {incr num} {
        .text tag remove bad_spell.$num 1.0 end 
    }
}

# ispell ǡָĿͼϿƱñΥå⳰
proc ispell_regist_dic_following_ok { } {
    global ispell_current_tag
    global ispell_id
    global ispell_dic
    set current_dir [ pwd ] ;# ޤ current directory ¸
    cd                      ;# cd ǥۡǥ쥯ȥ
    exec touch tvi_ispell_tmp.txt
    set f [open tvi_ispell_tmp.txt w ]
    puts $f [.text get $ispell_current_tag.first \
                       $ispell_current_tag.last ]
    close $f
    exec cp $ispell_dic $ispell_dic.old ;# Хåå
    exec cat tvi_ispell_tmp.txt >> $ispell_dic
    exec rm tvi_ispell_tmp.txt
    cd $current_dir         ;# ޤ current directory 

    set tag_word \
      [.text get $ispell_current_tag.first $ispell_current_tag.last ]

    for {set num 1} { $num <= $ispell_id } {incr num} {
        catch { set tag_word_num \
            [.text get bad_spell.$num.first bad_spell.$num.last] }
        if {$tag_word_num==$tag_word} {
            .text tag remove bad_spell.$num 1.0 end 
        }
    }
}

# ispell ǡָĿͼϿ뤬ƱñΥåϳʤ
proc ispell_regist_dic { } {
    global ispell_current_tag
    global ispell_dic
    set current_dir [ pwd ] ;# ޤ current directory ¸
    cd                      ;# cd ǥۡǥ쥯ȥ
    exec touch tvi_ispell_tmp.txt
    set f [open tvi_ispell_tmp.txt w ]
    puts $f [.text get $ispell_current_tag.first \
                       $ispell_current_tag.last ]
    close $f
    exec cat tvi_ispell_tmp.txt >> $ispell_dic
    exec rm tvi_ispell_tmp.txt
    cd $current_dir         ;# ޤ current directory 

    .text tag remove $ispell_current_tag 1.0 end
}

###################################
#        ¾           #
###################################
proc terminal_popup {  } {
    global terminal_command
    eval exec $terminal_command &
}

proc help_popup {  } {
    global help_command
    global tvi_directory 
    after 1 { eval exec $help_command \
                      ${tvi_directory}/Tvi_help_index.html & }
}

# ֹưŪ˥ƥȤ˹碌
proc auto_scroll_linenumber { } {
      .text_linenumber yview [expr floor([.text index @3,3 ])]
}

proc auto_show_column_and_line { } {
    global cursor_now_x
    global cursor_now_y
    set cursor_now_x [ expr 1 + \
         [string length [.text get "insert linestart" insert]]]
    set cursor_now_y [ expr int(floor([.text index insert])) ]
}
