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