lib/ver/methods/insert.rb in ver-2009.11.29 vs lib/ver/methods/insert.rb in ver-2009.12.14

- old
+ new

@@ -15,44 +15,47 @@ def insert_tab insert :insert, "\t" end def insert_indented_newline_below - if VER.options.autoindent - line = get('insert linestart', 'insert lineend') + undo_record do |record| + if options.autoindent + line = get('insert linestart', 'insert lineend') - indent = line.empty? ? "" : (line[/^\s+/] || '') - mark_set :insert, 'insert lineend' - insert :insert, "\n#{indent}" - else - mark_set :insert, 'insert lineend' - insert :insert, "\n" - end + indent = line.empty? ? "" : (line[/^\s+/] || '') + mark_set :insert, 'insert lineend' + record.insert :insert, "\n#{indent}" + else + mark_set :insert, 'insert lineend' + record.insert :insert, "\n" + end - clean_line('insert - 1 line') - start_insert_mode + clean_line('insert - 1 line', record) + start_insert_mode + end end def insert_indented_newline_above - if index(:insert).y > 1 - previous_line - insert_indented_newline_below - else - insert('insert linestart', "\n") - mark_set(:insert, 'insert - 1 line') + undo_record do |record| + if index(:insert).y > 1 + previous_line + insert_indented_newline_below + else + record.insert('insert linestart', "\n") + mark_set(:insert, 'insert - 1 line') + clean_line('insert - 1 line', record) + start_insert_mode + end end - - clean_line('insert + 1 line') - start_insert_mode end def insert_newline insert :insert, "\n" end def insert_indented_newline - if VER.options.autoindent + if options.autoindent fallback_insert_indented_newline else insert_newline end end @@ -134,30 +137,32 @@ return indent end def fallback_insert_indented_newline - line1 = get('insert linestart', 'insert lineend') - indentation1 = line1[/^\s+/] || '' - insert :insert, "\n" + undo_record do |record| + line1 = get('insert linestart', 'insert lineend') + indentation1 = line1[/^\s+/] || '' + record.insert :insert, "\n" - line2 = get('insert linestart', 'insert lineend') - indentation2 = line2[/^\s+/] || '' + line2 = get('insert linestart', 'insert lineend') + indentation2 = line2[/^\s+/] || '' - replace( - 'insert linestart', - "insert linestart + #{indentation2.size} chars", - indentation1 - ) + record.replace( + 'insert linestart', + "insert linestart + #{indentation2.size} chars", + indentation1 + ) - clean_line('insert - 1 line') + clean_line('insert - 1 line', record) + end end # Most of the input will be in US-ASCII, but an encoding can be set per view for the input. # For just about all purposes, UTF-8 should be what you want to input, and it's what Tk # can handle best. - def insert_string(string) + def insert_string(string, record = self) return if string.empty? if !string.frozen? && string.encoding == Encoding::ASCII_8BIT begin string.encode!(@encoding) @@ -165,13 +170,26 @@ string.force_encoding(@encoding) end end # puts "Insert %p in mode %p" % [string, keymap.mode] - insert :insert, string + record.insert(:insert, string) end + def start_replace_mode + self.mode = :replace + end + + def replace_string(string) + return if string.empty? + + undo_record do |record| + record.delete(:insert, 'insert + 1 chars') + insert_string(string, record) + end + end + def auto_indent_line if @syntax syntax_indent_line end end @@ -210,27 +228,30 @@ return unless settings.any? increase, decrease, indent_next, unindented = settings empty_line = /^\s*$/ indent = 0 + indent_token = ' ' * options.shiftwidth - index('1.0').upto(index('end')) do |pos| - pos_lineend = pos.lineend - line = get(pos, pos_lineend).strip + undo_record do |record| + index('1.0').upto(index('end')) do |pos| + pos_lineend = pos.lineend + line = get(pos, pos_lineend).strip - if increase && decrease && line =~ increase && line =~ decrease - indent -= 1 - replace(pos, pos_lineend, (' ' * indent) << line) - indent += 1 - elsif decrease && line =~ decrease - indent -= 1 - replace(pos, pos_lineend, (' ' * indent) << line) - elsif increase && line =~ increase - replace(pos, pos_lineend, (' ' * indent) << line) - indent += 1 - elsif line =~ empty_line - else - replace(pos, pos_lineend, (' ' * indent) << line) + if increase && decrease && line =~ increase && line =~ decrease + indent -= 1 + record.replace(pos, pos_lineend, (indent_token * indent) << line) + indent += 1 + elsif decrease && line =~ decrease + indent -= 1 + record.replace(pos, pos_lineend, (indent_token * indent) << line) + elsif increase && line =~ increase + record.replace(pos, pos_lineend, (indent_token * indent) << line) + indent += 1 + elsif line =~ empty_line + else + record.replace(pos, pos_lineend, (indent_token * indent) << line) + end end end end end end