*netbeans.txt*  For Vim version 7.2.  Last change: 2009 Jan 06


		  VIM REFERENCE MANUAL    by Gordon Prieur et al.


			*socket-interface* *netbeans* *netbeans-support*

Vim NetBeans Protocol: a socket interface for Vim integration into an IDE.

1.  Introduction				|netbeans-intro|
2.  Integration features			|netbeans-integration|
3.  Configuring Vim for NetBeans		|netbeans-configure|
4.  Error Messages				|netbeans-messages|
5.  Running Vim in NetBeans mode		|netbeans-run|
6.  NetBeans protocol				|netbeans-protocol|
7.  NetBeans key				|netbeans-key|
8.  Known problems				|netbeans-problems|
9.  Debugging NetBeans protocol			|netbeans-debugging|
10. NetBeans External Editor
    10.1. Downloading NetBeans			|netbeans-download|
    10.2. NetBeans Key Bindings			|netbeans-keybindings|
    10.3. Preparing NetBeans for Vim		|netbeans-preparation|
    10.4. Obtaining the External Editor Module	|obtaining-exted|
    10.5. Setting up NetBeans to run with Vim	|netbeans-setup|

{Vi does not have any of these features}
{only available when compiled with the |+netbeans_intg| feature}

==============================================================================
1. Introduction						*netbeans-intro*

The NetBeans interface was initially developed to integrate Vim into the
NetBeans Java IDE, using the external editor plugin.  This NetBeans plugin no
longer exists for recent versions of NetBeans but the protocol was developed
in such a way that any IDE can use it to integrate Vim.

The NetBeans protocol of Vim is a text based communication protocol, over a
classical TCP socket. There is no dependency on Java or NetBeans. Any language
or environment providing a socket interface can control Vim using this
protocol. There are existing implementations in C, C++, Python and Java. The
name NetBeans is kept today for historical reasons.

Current projects using the NetBeans protocol of Vim are:
- VimIntegration, description of various projects doing Vim Integration:
	http://www.freehackers.org/VimIntegration
- Agide, an IDE for the AAP project, written in Python:
	http://www.a-a-p.org
- Clewn, a gdb integration into Vim, written in C:
	http://clewn.sourceforge.net/
- VimPlugin, integration of Vim inside Eclipse:
	http://vimplugin.sourceforge.net/wiki/pmwiki.php
- PIDA, IDE written in Python integrating Vim:
	http://pida.co.uk/
- VimWrapper, library to easy Vim integration into IDE:
	http://www.freehackers.org/VimWrapper

Check the specific project pages to see how to use Vim with these projects.

In the rest of this help page, we will use the term "Vim Controller" to
describe the program controlling Vim through the NetBeans socket interface.


About the NetBeans IDE ~

NetBeans is an open source Integrated Development Environment developed
jointly by Sun Microsystems, Inc. and the netbeans.org developer community.
Initially just a Java IDE, NetBeans has had C, C++, and Fortran support added
in recent releases.

For more information visit the main NetBeans web site http://www.netbeans.org.
The External Editor is now, unfortunately, declared obsolete.  See
 http://externaleditor.netbeans.org.

Sun Microsystems, Inc. also ships NetBeans under the name Sun ONE Studio.
Visit http://www.sun.com for more information regarding the Sun ONE Studio
product line.

Current releases of NetBeans provide full support for Java and limited support
for C, C++, and Fortran.  Current releases of Sun ONE Studio provide full
support for Java, C, C++, and Fortran.

==============================================================================
2. Integration features					*netbeans-integration*

The NetBeans socket interface of Vim allows to get information from Vim or to
ask Vim to perform specific actions:
- get information about buffer: buffer name, cursor position, buffer content,
  etc.
- be notified when buffers are open or closed
- be notified of how the buffer content is modified
- load and save files
- modify the buffer content
- installing special key bindings
- raise the window, control the window geometry

For sending key strokes to Vim or for evaluating functions in Vim, you must
use the |clientserver| interface.


==============================================================================
3. Configuring Vim for NetBeans			*netbeans-configure*

For more help installing Vim, please read |usr_90.txt| in the Vim User Manual.


On Unix:
--------

When running configure without arguments the NetBeans interface should be
included.  That is, if the configure check to find out if your system supports
the required features succeeds.

In case you do not want the NetBeans interface you can disable it by
uncommenting a line with "--disable-netbeans" in the Makefile.

Currently, only GVim is supported in this integration as NetBeans does not
have means to supply a terminal emulator for the Vim command.  Furthermore,
there is only GUI support for GTK, GNOME, and Motif.

If Motif support is required the user must supply XPM libraries.  See
|workshop-xpm| for details on obtaining the latest version of XPM.


On MS-Windows:
--------------

The Win32 support is now in beta stage.

To use XPM signs on Win32 (e.g. when using with NetBeans) you can compile
XPM by yourself or use precompiled libraries from http://iamphet.nm.ru/misc/
(for MS Visual C++) or http://gnuwin32.sourceforge.net (for MinGW).

Enable debugging:
-----------------

To enable debugging of Vim and of the NetBeans protocol, the "NBDEBUG" macro
needs to be defined.  Search in the Makefile of the platform you are using for
"NBDEBUG" to see what line needs to be uncommented.  This effectively adds
"-DNBDEBUG" to the compile command.  Also see |netbeans-debugging|

==============================================================================
4. Error Messages					*netbeans-messages*

These error messages are specific to NetBeans socket protocol:

							*E463*
Region is guarded, cannot modify
		The Vim Controller has defined guarded areas in the text,
		which you cannot change.  Also sets the current buffer, if
		necessary.

							*E656*
Writes of unmodified buffers forbidden
		Writes of unmodified buffers that were opened from the
		Vim Controller are not possible.

							*E657*
Partial writes disallowed
		Partial writes for buffers that were opened from the
		Vim Controller are not allowed.

							*E658*
Connection lost for this buffer
		The Vim Controller has become confused about the state of
		this file.  Rather than risk data corruption, it has severed
		the connection for this file.  Vim will take over
		responsibility for saving changes to this file and the
		Vim Controller will no longer know of these changes.

							*E744*
Read-only file
		Vim normally allows changes to a read-only file and only
		enforces the read-only rule if you try to write the file.
		However, NetBeans does not let you make changes to a file
		which is read-only and becomes confused if Vim does this.
		So Vim does not allow modifications to files when run
		in NetBeans mode.

==============================================================================
5. Running Vim in NetBeans mode				*netbeans-run*

Vim must be started with the |-nb| argument.  Three forms can be used, that
differ in the way the information for the connection is specified:

	-nb={fname}				from a file
	-nb:{hostname}:{addr}:{password}	directly
	-nb					from a file or environment

							*E660* *E668*
For security reasons, the best method is to write the information in a file
readable only by the user.  The name of the file can be passed with the
"-nb={fname}" argument or, when "-nb" is used without a parameter, the
environment variable "__NETBEANS_CONINFO".  The file must contain these three
lines, in any order:

	host={hostname}
	port={addr}
	auth={password}

Other lines are ignored.  The caller of Vim is responsible for deleting the
file afterwards.

{hostname} is the name of the machine where Vim Controller is running.  When
omitted the environment variable "__NETBEANS_HOST" is used or the default
"localhost".

{addr} is the port number for the NetBeans interface.  When omitted the
environment variable "__NETBEANS_SOCKET" is used or the default 3219.

{password} is the password for connecting to NetBeans.  When omitted the
environment variable "__NETBEANS_VIM_PASSWORD" is used or "changeme".

Vim will initiate a socket connection (client side) to the specified host and
port upon startup. The password will be sent with the AUTH event when the
connection has been established.


==============================================================================
6. NetBeans protocol					*netbeans-protocol*

The communication between the Vim Controller and Vim uses plain text
messages.  This protocol was first designed to work with the external editor
module of NetBeans.  Later it was extended to work with Agide (A-A-P GUI IDE,
see http://www.a-a-p.org) and then with other IDE. The extensions are marked
with "version 2.1".

Version 2.2 of the protocol has several minor changes which should only affect
NetBeans users (ie, not Agide users).  However, a bug was fixed which could
cause confusion.  The netbeans_saved() function sent a "save" protocol
command.  In protocol version 2.1 and earlier this was incorrectly interpreted
as a notification that a write had taken place.  In reality, it told NetBeans
to save the file so multiple writes were being done.  This caused various
problems and has been fixed in 2.2.  To decrease the likelihood of this
confusion happening again, netbeans_saved() has been renamed to
netbeans_save_buffer().

We are now at version 2.4.  For the differences between 2.3 and 2.4 search for
"2.4" below.

The messages are currently sent over a socket.  Since the messages are in
plain UTF-8 text this protocol could also be used with any other communication
mechanism.

6.1 Kinds of messages		|nb-messages|
6.2 Terms			|nb-terms|
6.3 Commands			|nb-commands|
6.4 Functions and Replies	|nb-functions|
6.5 Events			|nb-events|
6.6 Special messages		|nb-special|
6.7 Protocol errors		|nb-protocol_errors|


6.1 Kinds of messages					*nb-messages*

There are four kinds of messages:

kind		direction	comment ~
Command		IDE -> editor	no reply necessary
Function	IDE -> editor	editor must send back a reply
Reply		editor -> IDE	only in response to a Function
Event		editor -> IDE	no reply necessary

The messages are sent as a single line with a terminating newline character.
Arguments are separated by a single space.  The first item of the message
depends on the kind of message:

kind		first item		example ~
Command		bufID:name!seqno	11:showBalloon!123 "text"
Function	bufID:name/seqno	11:getLength/123
Reply		seqno			123 5000
Event		bufID:name=seqno	11:keyCommand=123 "S-F2"



6.2 Terms						*nb-terms*

bufID		Buffer number.  A message may be either for a specific buffer
		or generic.  Generic messages use a bufID of zero.  NOTE: this
		buffer ID is assigned by the IDE, it is not Vim's buffer
		number.  The bufID must be a sequentially rising number,
		starting at one.

seqno		The IDE uses a sequence number for Commands and Functions.  A
		Reply must use the sequence number of the Function that it is
		associated with.  A zero sequence number can be used for
		Events (the seqno of the last received Command or Function can
		also be used).

string		Argument in double quotes.  Text is in UTF-8 encoding.  This
		means ASCII is passed as-is.  Special characters are
		represented with a backslash:
			\"	double quote
			\n	newline
			\r	carriage-return
			\t	tab (optional, also works literally)
			\\	backslash
		NUL bytes are not allowed!

boolean		Argument with two possible values:
			T	true
			F	false

number		Argument with a decimal number.

optnum		Argument with either a decimal number or "none" (without the
		quotes).

offset		A number argument that indicates a byte position in a buffer.
		The first byte has offset zero.  Line breaks are counted for
		how they appear in the file (CR/LF counts for two bytes).
		Note that a multi-byte character is counted for the number of
		bytes it takes.

lnum/col	Argument with a line number and column number position.  The
		line number starts with one, the column is the byte position,
		starting with zero.  Note that a multi-byte character counts
		for several columns.

pathname	String argument: file name with full path.


6.3 Commands						*nb-commands*

actionMenuItem	Not implemented.

actionSensitivity
		Not implemented.

addAnno serNum typeNum off len
		Place an annotation in this buffer.
		Arguments:
		   serNum	number	serial number of this placed
					annotation, used to be able to remove
					it
		   typeNum	number	sequence number of the annotation
					defined with defineAnnoType for this
					buffer
		   off		number	offset where annotation is to be placed
		   len		number	not used
		In version 2.1 "lnum/col" can be used instead of "off".

balloonResult text
		Not implemented.

close		Close the buffer.  This leaves us without current buffer, very
		dangerous to use!

create		Creates a buffer without a name.  Replaces the current buffer
		(it's hidden when it was changed).
		The Vim Controller should use this as the first command for a
		file that is being opened.  The sequence of commands could be:
			create
			setCaretListener	(ignored)
			setModified		(no effect)
			setContentType		(ignored)
			startDocumentListen
			setTitle
			setFullName

defineAnnoType typeNum typeName tooltip glyphFile fg bg
		Define a type of annotation for this buffer.
		Arguments:
		   typeNum	number	sequence number (not really used)
		   typeName	string	name that identifies this annotation
		   tooltip	string	not used
		   glyphFile	string	name of icon file
		   fg		optnum	foreground color for line highlighting
		   bg		optnum	background color for line highlighting
		Vim will define a sign for the annotation.
		When both "fg" and "bg" are "none" no line highlighting is
		used (new in version 2.1).
		When "glyphFile" is empty, no text sign is used (new in
		version 2.1).
		When "glyphFile" is one or two characters long, a text sign is
		defined (new in version 2.1).
		Note: the annotations will be defined in sequence, and the
		sequence number is later used with addAnno.

editFile pathname
		Set the name for the buffer and edit the file "pathname", a
		string argument.
		Normal way for the IDE to tell the editor to edit a file.

		You must set a bufId different of 0 with this command to
		assign a bufId to the buffer. It will trigger an event
		fileOpened with a bufId of 0 but the buffer has been assigned.

		If the IDE is going to pass the file text to the editor use
		these commands instead:
			setFullName
			insert
			initDone
		New in version 2.1.

enableBalloonEval
		Not implemented.

endAtomic	End an atomic operation.  The changes between "startAtomic"
		and "endAtomic" can be undone as one operation.  But it's not
		implemented yet.  Redraw when necessary.

guard off len
		Mark an area in the buffer as guarded.  This means it cannot
		be edited.  "off" and "len" are numbers and specify the text
		to be guarded.

initDone	Mark the buffer as ready for use.  Implicitly makes the buffer
		the current buffer.  Fires the BufReadPost autocommand event.

insertDone
		Sent by Vim Controller to tell Vim an initial file insert is
		done.  This triggers a read message being printed.  Prior to
		version 2.3, no read messages were displayed after opening a
		file.  New in version 2.3.

moveAnnoToFront serNum
		Not implemented.

netbeansBuffer isNetbeansBuffer
		If "isNetbeansBuffer" is "T" then this buffer is "owned" by
		NetBeans.
		New in version 2.2.

putBufferNumber pathname
		Associate a buffer number with the Vim buffer by the name
		"pathname", a string argument.  To be used when the editor
		reported editing another file to the IDE and the IDE needs to
		tell the editor what buffer number it will use for this file.
		Also marks the buffer as initialized.
		New in version 2.1.

raise		Bring the editor to the foreground.
		New in version 2.1.

removeAnno serNum
		Remove a previously place annotation for this buffer.
		"serNum" is the same number used in addAnno.

save		Save the buffer when it was modified.  The other side of the
		interface is expected to write the buffer and invoke
		"setModified" to reset the "changed" flag of the buffer.
		The writing is skipped when one of these conditions is true:
		- 'write' is not set
		- the buffer is read-only
		- the buffer does not have a file name
		- 'buftype' disallows writing
		New in version 2.2.

saveDone
		Sent by Vim Controller to tell Vim a save is done.  This
		triggers a save message being printed.  Prior to version 2.3,
		no save messages were displayed after a save.
		New in version 2.3.

setAsUser	Not implemented.

setBufferNumber pathname
		Associate a buffer number with Vim buffer by the name
		"pathname".  To be used when the editor reported editing
		another file to the IDE and the IDE needs to tell the editor
		what buffer number it will use for this file.
		Has the side effect of making the buffer the current buffer.
		See "putBufferNumber" for a more useful command.

setContentType
		Not implemented.

setDot off	Make the buffer the current buffer and set the cursor at the
		specified position.  If the buffer is open in another window
		than make that window the current window.
		If there are folds they are opened to make the cursor line
		visible.
		In version 2.1 "lnum/col" can be used instead of "off".

setExitDelay seconds
		Set the delay for exiting to "seconds", a number.
		This delay is used to give the IDE a chance to handle things
		before really exiting.  The default delay is two seconds.
		New in version 2.1.
		Obsolete in version 2.3.

setFullName pathname
		Set the file name to be used for a buffer to "pathname", a
		string argument.
		Used when the IDE wants to edit a file under control of the
		IDE.  This makes the buffer the current buffer, but does not
		read the file.  "insert" commands will be used next to set the
		contents.

setLocAndSize	Not implemented.

setMark		Not implemented.

setModified modified
		When the boolean argument "modified" is "T" mark the buffer as
		modified, when it is "F" mark it as unmodified.

setModtime time
		Update a buffers modification time after the file has been
		saved directly by the Vim Controller.
		New in version 2.3.

setReadOnly
		Set a file as readonly
		Implemented in version 2.3.

setStyle	Not implemented.

setTitle name
		Set the title for the buffer to "name", a string argument.
		The title is only used for the Vim Controller functions, not
		by Vim.

setVisible visible
		When the boolean argument "visible" is "T", goto the buffer.
		The "F" argument does nothing.

showBalloon text
		Show a balloon (popup window) at the mouse pointer position,
		containing "text", a string argument.  The balloon should
		disappear when the mouse is moved more than a few pixels.
		New in version 2.1.

specialKeys
		Map a set of keys (mostly function keys) to be passed back
		to the Vim Controller for processing.  This lets regular IDE
		hotkeys be used from Vim.
		Implemented in version 2.3.

startAtomic	Begin an atomic operation.  The screen will not be updated
		until "endAtomic" is given.

startCaretListen
		Not implemented.

startDocumentListen
		Mark the buffer to report changes to the IDE with the
		"insert" and "remove" events.  The default is to report
		changes.

stopCaretListen
		Not implemented.

stopDocumentListen
		Mark the buffer to stop reporting changes to the IDE.
		Opposite of startDocumentListen.
		NOTE: if "netbeansBuffer" was used to mark this buffer as a
		NetBeans buffer, then the buffer is deleted in Vim.  This is
		for compatibility with Sun Studio 10.

unguard off len
		Opposite of "guard", remove guarding for a text area.
		Also sets the current buffer, if necessary.

version		Not implemented.


6.4 Functions and Replies				*nb-functions*

getDot		Not implemented.

getCursor	Return the current buffer and cursor position.
		The reply is:
			seqno bufID lnum col off
		seqno = sequence number of the function
		bufID = buffer ID of the current buffer (if this is unknown -1
			is used)
		lnum  = line number of the cursor (first line is one)
		col   = column number of the cursor (in bytes, zero based)
		off   = offset of the cursor in the buffer (in bytes)
		New in version 2.1.

getLength	Return the length of the buffer in bytes.
		Reply example for a buffer with 5000 bytes:
			123 5000
		TODO: explain use of partial line.

getMark		Not implemented.

getAnno serNum
		Return the line number of the annotation in the buffer.
		Argument:
			serNum		serial number of this placed annotation
		The reply is:
			123 lnum	line number of the annotation
			123 0		invalid annotation serial number
		New in version 2.4.

getModified	When a buffer is specified: Return zero if the buffer does not
		have changes, one if it does have changes.
		When no buffer is specified (buffer number zero): Return the
		number of buffers with changes.  When the result is zero it's
		safe to tell Vim to exit.
		New in version 2.1.

getText		Return the contents of the buffer as a string.
		Reply example for a buffer with two lines
			123 "first line\nsecond line\n"
		NOTE: docs indicate an offset and length argument, but this is
		not implemented.

insert off text
		Insert "text" before position "off".  "text" is a string
		argument, "off" a number.
		"text" should have a "\n" (newline) at the end of each line.
		Or "\r\n" when 'fileformat' is "dos".  When using "insert" in
		an empty buffer Vim will set 'fileformat' accordingly.
		When "off" points to the start of a line the text is inserted
		above this line.  Thus when "off" is zero lines are inserted
		before the first line.
		When "off" points after the start of a line, possibly on the
		NUL at the end of a line, the first line of text is appended
		to this line.  Further lines come below it.
		Possible replies:
			123		no problem
			123 !message	failed
		Note that the message in the reply is not quoted.
		Also sets the current buffer, if necessary.
		Does not move the cursor to the changed text.
		Resets undo information.

remove off length
		Delete "length" bytes of text at position "off".  Both
		arguments are numbers.
		Possible replies:
			123		no problem
			123 !message	failed
		Note that the message in the reply is not quoted.
		Also sets the current buffer, if necessary.

saveAndExit	Perform the equivalent of closing Vim: ":confirm qall".
		If there are no changed files or the user does not cancel the
		operation Vim exits and no result is sent back.  The IDE can
		consider closing the connection as a successful result.
		If the user cancels the operation the number of modified
		buffers that remains is returned and Vim does not exit.
		New in version 2.1.


6.5 Events						*nb-events*

balloonEval off len type
		The mouse pointer rests on text for a short while.  When "len"
		is zero, there is no selection and the pointer is at position
		"off".  When "len" is non-zero the text from position "off" to
		"off" + "len" is selected.
		Only sent after "enableBalloonEval" was used for this buffer.
		"type" is not yet defined.
		Not implemented yet.

balloonText text
		Used when 'ballooneval' is set and the mouse pointer rests on
		some text for a moment.  "text" is a string, the text under
		the mouse pointer.
		New in version 2.1.

buttonRelease button lnum col
		Report which button was pressed and the location of the cursor
		at the time of the release.  Only for buffers that are owned
		by the Vim Controller.  This event is not sent if the button
		was released while the mouse was in the status line or in a
		separator line.  If col is less than 1 the button release was
		in the sign area.
		New in version 2.2.

disconnect
		Tell the Vim Controller that Vim is exiting and not to try and
		read or write more commands.
		New in version 2.3.

fileClosed	Not implemented.

fileModified	Not implemented.

fileOpened pathname open modified
		A file was opened by the user.
		Arguments:
		   pathname	string	  name of the file
		   open		boolean   always "T"
		   modified	boolean   always "F"

geometry cols rows x y
		Report the size and position of the editor window.
		Arguments:
		   cols		number	  number of text columns
		   rows		number	  number of text rows
		   x		number	  pixel position on screen
		   y		number	  pixel position on screen
		Only works for Motif.

insert off text
		Text "text" has been inserted in Vim at position "off".
		Only fired when enabled, see "startDocumentListen".

invokeAction	Not implemented.

keyCommand keyName
		Reports a special key being pressed with name "keyName", which
		is a string.
		Supported key names:
			F1		function key 1
			F2		function key 2
			...
			F12		function key 12

			' '		space (without the quotes)
			!		exclamation mark
			...		any other ASCII printable character
			~		tilde

			X		any unrecognized key

		The key may be prepended by "C", "S" and/or "M" for Control,
		Shift and Meta (Alt) modifiers.  If there is a modifier a dash
		is used to separate it from the key name.  For example:
		"C-F2".
		ASCII characters are new in version 2.1.

keyAtPos keyName lnum/col
		Like "keyCommand" and also report the line number and column
		of the cursor.
		New in version 2.1.

killed		A file was deleted or wiped out by the user and the buffer
		annotations have been removed.  The bufID number for this
		buffer has become invalid.  Only for files that have been
		assigned a bufID number by the IDE.

newDotAndMark off off
		Reports the position of the cursor being at "off" bytes into
		the buffer.  Only sent just before a "keyCommand" event.

quit		Not implemented.

remove off len
		Text was deleted in Vim at position "off" with byte length
		"len".
		Only fired when enabled, see "startDocumentListen".

revert		Not implemented.

save		The buffer has been saved and is now unmodified.
		Only fired when enabled, see "startDocumentListen".

startupDone	The editor has finished its startup work and is ready for
		editing files.
		New in version 2.1.

unmodified	The buffer is now unmodified.
		Only fired when enabled, see "startDocumentListen".

version vers	Report the version of the interface implementation.  Vim
		reports "2.4" (including the quotes).


6.6 Special messages					*nb-special*

These messages do not follow the style of the messages above.  They are
terminated by a newline character.

ACCEPT		Not used.

AUTH password	editor -> IDE: First message that the editor sends to the IDE.
		Must contain the password for the socket server, as specified
		with the |-nb| argument.  No quotes are used!

DISCONNECT	IDE -> editor: break the connection.  The editor will exit.
		The IDE must only send this message when there are no unsaved
		changes!

DETACH		IDE -> editor: break the connection without exiting the
		editor.  Used when the IDE exits without bringing down the
		editor as well.
		New in version 2.1.

REJECT		Not used.


6.7 Protocol errors					*nb-protocol_errors*

These errors occur when a message violates the protocol:
*E627* *E628* *E629* *E630* *E631* *E632* *E633* *E634* *E635* *E636*
*E637* *E638* *E639* *E640* *E641* *E642* *E643* *E644* *E645* *E646*
*E647* *E648* *E649* *E650* *E651* *E652* *E653* *E654*


==============================================================================
7. NetBeans key						*netbeans-key*

							*:nbkey*
:nbkey key		Pass the key to the Vim Controller for processing

When a hot-key has been installed with the specialKeys command, this command
can be used to generate a hotkey messages to the Vim Controller. The events
newDotAndMark, keyCommand and keyAtPos are generated (in this order).


==============================================================================
8. Known problems					*netbeans-problems*

NUL bytes are not possible.  For editor -> IDE they will appear as NL
characters.  For IDE -> editor they cannot be inserted.


==============================================================================
9. Debugging NetBeans protocol				*netbeans-debugging*

To debug the Vim protocol, you must first compile Vim with debugging support
and NetBeans debugging support.  See |netbeans-configure| for instructions
about Vim compiling and how to enable debug support.

When running Vim, set the following environment variables:

    export SPRO_GVIM_DEBUG=netbeans.log
    export SPRO_GVIM_DLEVEL=0xffffffff

Vim will then log all the incoming and outgoing messages of the NetBeans
protocol to the file netbeans.log .

The content of netbeans.log after a session looks like this:
Tue May 20 17:19:27 2008
EVT: 0:startupDone=0
CMD 1: (1) create
CMD 2: (1) setTitle "testfile1.txt"
CMD 3: (1) setFullName "testfile1.txt"
EVT(suppressed): 1:remove=3 0 -1
EVT: 1:fileOpened=0 "d:\\work\\vimWrapper\\vimWrapper2\\pyvimwrapper\\tests\\testfile1.txt" T F
CMD 4: (1) initDone
FUN 5: (0) getCursor
REP 5: 1 1 0 0
CMD 6: (2) create
CMD 7: (2) setTitle "testfile2.txt"
CMD 8: (2) setFullName "testfile2.txt"
EVT(suppressed): 2:remove=8 0 -1
EVT: 2:fileOpened=0 "d:\\work\\vimWrapper\\vimWrapper2\\pyvimwrapper\\tests\\testfile2.txt" T F
CMD 9: (2) initDone


==============================================================================
10. NetBeans External Editor

NOTE: This information is obsolete!  Only relevant if you are using an old
version of NetBeans.


10.1. Downloading NetBeans			*netbeans-download*

The NetBeans IDE is available for download from netbeans.org.  You can download
a released version, download sources, or use CVS to download the current
source tree.  If you choose to download sources, follow directions from
netbeans.org on building NetBeans.

Depending on the version of NetBeans you download, you may need to do further
work to get the required External Editor module.  This is the module which lets
NetBeans work with gvim (or xemacs :-).  See http://externaleditor.netbeans.org
for details on downloading this module if your NetBeans release does not have
it.

For C, C++, and Fortran support you will also need the cpp module.  See
http://cpp.netbeans.org for information regarding this module.

You can also download Sun ONE Studio from Sun Microsystems, Inc for a 30 day
free trial.  See http://www.sun.com for further details.


10.2. NetBeans Key Bindings			*netbeans-keybindings*

Vim understands a number of key bindings that execute NetBeans commands.
These are typically all the Function key combinations.  To execute a NetBeans
command, the user must press the Pause key followed by a NetBeans key binding.
For example, in order to compile a Java file, the NetBeans key binding is
"F9".  So, while in vim, press "Pause F9" to compile a java file.  To toggle a
breakpoint at the current line, press "Pause Shift F8".

The Pause key is Function key 21.  If you don't have a working Pause key and
want to use F8 instead, use: >

	:map <F8> <F21>

The External Editor module dynamically reads the NetBeans key bindings so vim
should always have the latest key bindings, even when NetBeans changes them.


10.3. Preparing NetBeans for Vim		*netbeans-preparation*

In order for NetBeans to work with vim, the NetBeans External Editor module
must be loaded and enabled.  If you have a Sun ONE Studio Enterprise Edition
then this module should be loaded and enabled.  If you have a NetBeans release
you may need to find another way of obtaining this open source module.

You can check if you have this module by opening the Tools->Options dialog
and drilling down to the "Modules" list (IDE Configuration->System->Modules).
If your Modules list has an entry for "External Editor" you must make sure
it is enabled (the "Enabled" property should have the value "True").  If your
Modules list has no External Editor see the next section on |obtaining-exted|.


10.4. Obtaining the External Editor Module	*obtaining-exted*

There are 2 ways of obtaining the External Editor module.  The easiest way
is to use the NetBeans Update Center to download and install the module.
Unfortunately, some versions do not have this module in their update
center.  If you cannot download via the update center you will need to
download sources and build the module.  I will try and get the module
available from the NetBeans Update Center so building will be unnecessary.
Also check http://externaleditor.netbeans.org for other availability options.

To download the External Editor sources via CVS and build your own module,
see http://externaleditor.netbeans.org and http://www.netbeans.org.
Unfortunately, this is not a trivial procedure.


10.5. Setting up NetBeans to run with Vim	*netbeans-setup*

Assuming you have loaded and enabled the NetBeans External Editor module
as described in |netbeans-preparation| all you need to do is verify that
the gvim command line is properly configured for your environment.

Open the Tools->Options dialog and open the Editing category.  Select the
External Editor.  The right hand pane should contain a Properties tab and
an Expert tab.  In the Properties tab make sure the "Editor Type" is set
to "Vim".  In the Expert tab make sure the "Vim Command" is correct.

You should be careful if you change the "Vim Command".  There are command
line options there which must be there for the connection to be properly
set up.  You can change the command name but that's about it.  If your gvim
can be found by your $PATH then the VIM Command can start with "gvim".  If
you don't want gvim searched from your $PATH then hard code in the full
Unix path name.  At this point you should get a gvim for any source file
you open in NetBeans.

If some files come up in gvim and others (with different file suffixes) come
up in the default NetBeans editor you should verify the MIME type in the
Expert tab MIME Type property.  NetBeans is MIME oriented and the External
Editor will only open MIME types specified in this property.


 vim:tw=78:ts=8:ft=help:norl:
