The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

Text::Editor::Vip::Buffer - Editing engine

SYNOPSIS

  use Text::Editor::Vip::Buffer ;
  my $buffer = new Text::Editor::Vip::Buffer() ;
  

DESCRIPTION

This module implements the core functionality for an editing engine. It knows about selection, undo and plugins.

MEMBER FUNCTIONS

new

Create a Text::Editor::Vip::Buffer .

  my $buffer = new Text::Editor::Vip::Buffer() ;

Setup

Helper sub called by new. This is considerer private.

Reset

Empties the buffer from it's contents as if it was newly created. Plugins are still plugged into the buffer. This is very practical when writting tests.

  $buffer->Reset() ;

ExpandedWithOrLoad

See PLUGINS.

If the name passed as first argument doesn't match a sub within the object, the module, passed as second argument, is loaded.

  # newly created buffer that is missing a functionality
  $buffer->SomeSub(); # perl dies
  
  # load plugin first
  $buffer->LoadAndExpandWith('Text::Editor::Vip::Buffer::Plugins::SomePlugin') ;
  $buffer->SomeSub(); # ok
  
  # load the plugin only if the sub is available. This doesn't guarantee that 'SomeSub' has been
  # loaded from the passed Plugin.
  
  $buffer->ExpandedWithOrLoad('SomeSub', 'Text::Editor::Vip::Buffer::Plugins::SomePlugin') ;
  $buffer->SomeSub(); #ok

Returns 1 if the sub existed and 0 if it didn't and the module was loaded or the error type LoadAndExpandWith generated.

LoadAndExpandWith

See PLUGINS.

Loads a perl module (plugin) and adds all it functionality to the buffer

  $buffer->LoadAndExpandWith('Text::Editor::Vip::Plugins::Buffer::File') ;
  
  # we can now read files
  $buffer->InsertFile(__FILE__) ;

ExpandWith

See PLUGINS.

Adds a sub to a buffer instance.

  $buffer->ExpandWith
                (
                  'GotoBufferStart' # member function name
                , \&some_sub    # implementaton for GotoBufferStart
                ) ;
  
  # we can now go  to the buffers start
  $buffer->GotoBufferStart() ;

The second argument is optional, if it is not given, Text::Editor::Vip::Buffer will take the sub from the caller namespace

  sub GotoBufferStart
  {
  my $buffer = shift ; # remember we are a plugin to an object oriented module
  $buffer->SetModificationPosition,(0, 0) ;
  }
  
  $buffer->ExpandWith( 'GotoBufferStart') ;
  $buffer->GotoBufferStart() ;

DEV. WARNING! This is going to give us troubles when using it for macros that are saved to disk! we must find a way to replug when loading the macro back

PrintExpansionHistory

Displays the expansion done to the buffer

Do

Let you run any perl code on the buffer. The variable $buffer is made available in your perl code.

  ($result, $message) = $buffer->Do("# comment\n\$buffer->Insert('bar') ;") ;
  is($buffer->GetText(), "bar", 'buffer contains \'bar\'' ) ;

Returns (1) on success and (0, "error message") on failure.

PrintError

This sub is called when an error occures. It should be overriden by the buffer user. We use this sub to abstract error handling and allow different handling dependind on the buffer user.

If the user is a plain perl script, the error might just be logged while a dialogue might be displayed if the user is a full UI.

GetText

Returns the buffer contents joined with "\n".

See GetTextAsArrayRef.

GetTextAsArrayRef

Returns a copy of the buffers content as an array reference.

See GetText.

SetLineAttribute

Attaches a named attribute to a line.

  $buffer->SetLineAttribute(0, 'TEST', $some_data) ;
  $retrieved_data = $buffer->GetLineAttribute(0'TEST', $some_data) ;

SetLineAttribute

Retrieves a named attribute from a line.

  $buffer->SetLineAttribute(0, 'TEST', $some_data) ;
  $retrieved_data = $buffer->GetLineAttribute(0, 'TEST') ;

MarkedBufferAsEdited

Used to mak the buffer as edited after a modification. You should not need to use this function if you access the buffer through it's interface. Which you should always do.

MarkedBufferAsUndited

Used to mak the buffer as unedited You should not need to use this function.

IsBufferMarkedAsEdited

Used to query the buffer about its state. Returns (1) if the buffer was edit. (0) otherwise.

GetLastEditionTImestamp

Returns the time of the last edition.

GetNumberOfLines

Returns the number of lines in the buffer.

GetLastfLineIndex

Returns theindex of the last line. the buffer always contains at least one line thus the last line index is always 0 or more.

GetModificationPosition

Returns the position, line and character, where the next modification will occure.

SetModificationPosition

Sets the position, line and character, where the next modification will occure.

   $buffer->SetModificationPosition(0, 15) ;

OffsetModificationPosition

Offset the position, line and character, where the next modification will occure. an exception is thrown if position is not valid

   $buffer->OffsetModificationPosition(0, 15) ;

OffsetModificationPositionGuarded

Offsets the position, line and character, where the next modification will occure. Nothing happends if the new position is invalid

   $buffer->OffsetModificationPositionGuarded(0, 15) ;

GetModificationLine

Returns the line where the next modification will occure.

SetModificationLine

Set the line where the next modification will occure.

GetModificationLine

Returns the character where the next modification will occure.

GetModificationLine

Sets the character where the next modification will occure.

GetLine

Returns the Line object used by the buffer. This is a private sub and should not be used directly.

See GetLineText.

GetLineText

Returns the text of the line passes as argument or the current modification line if no argument is passed.

  my $line_12_text = $buffer->GetLineText(12) ;
  my $current_line_text = $buffer->GetLineText() ;

GetLineTextWithNewline

Returns the text of the line passes as argument or the current modification line if no argument is passed. A "\n" is appended if the line is not the last line in the buffer.

  my $line_12_text = $buffer->GetLineTextWithNewline(12) ;
  my $current_line_text = $buffer->GetLineTextWithNewline() ;

GetLineLength

Returns the length of the text of the line passes as argument or the current modification line if no argument is passed.

  my $line_12_text = $buffer->GetLineText(12) ;
  my $current_line_text = $buffer->GetLineText() ;

Backspace

Deletes characters backwards. The number of characters to delete is passed as an argument. Doing a Backspace while at the begining of a line warps to the previous line.

ClearLine

Removes all text from the passed line index or the current modification line if no argument is given. The line itself is not deleted and the modification position is not modified.

  $buffer->ClearLine(0) ;

Delete

Deleted, from the modification position, the number of characters passed as argument.

Deletes the selection if it exists; the deleted selection decrements the number of character to delete argument

DeleteLine

Deleted, the line passed as argument. if no argument is passed, the current line is deleted. The selection and modification position are not modified.

InsertNewLine

Inserts a new line at the modification position. If the modification position is after the end of the current line, spaces are used to pad the current line.

InsertNewLine takes one parameter that can be set to SMART_INDENTATION or NO_SMART_INDENTATION. If SMART_INDENTATION is used (default) , IndentNewLine is called. IndentNewLine does nothing by default. This lets you define your own indentation strategy. See IndentNewLine.

  $buffer->Insert("hi\nThere\nWhats\nYour\nName\n") ;

Stringify

Quotes a string or an array of string so it can be serialized in perl code

Insert

Inserts a string or a list of strings, passed as an array reference, into the buffer.

  $buffer->Insert("bar") ;
  
  my @text = ("Someone\n", "wants me\nNow") ;
  $buffer->Insert(\@text);
  
  $buffer->Insert("\t something \n new") ;

Only "\n" is considered special and forces the addition of a new line in the buffer.

Insert takes a second argument . When set to SMART_INDENTATION (the default), IndentNewLine is called to indent the newly inserted line. The default IndentNewLine does nothing but you can override it to implement any indentation you please. If you want to insert raw text, pass NO_SMART_INDENTATION as a second argument.

NO_SMART_INDENTATION is defined in Text::Editor::Vip::Buffer::Constants.

PLUGINS

Vip::Buffer has a very simple plugin system. You can add a function to the buffer with ExpandWith, LoadAndExpandWith and ExpandedWithOrLoad. The functions added through plugins are made available to the instance, calling the plugin sub, only.

Think of it as a late inheritence that does the job it needs to do.

Perl is full of wonders.

BUGS

AUTHOR

        Khemir Nadim ibn Hamouda
        CPAN ID: NKH
        mailto:nadim@khemir.net
        http:// no web site

COPYRIGHT

This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

The full text of the license can be found in the LICENSE file included with this module.