Table of Contents

NAME

xdiff - X11/Motif based file comparator and merge tool.
Version 3.3

OVERVIEW



xdiff is a graphical utility for viewing the differences of a file and up to four revisions of that file. The text of the files is presented side by side with their differences aligned and highlighted in colour for easy identification. xdiff can be used to produce a merged version combining any or all of the differences. Simple editing features are also provided.

SYNOPSIS

xdiff [options] path1 [path2 [path3 [path4 [ path5 ]]]]
xdiff options are:
-[Dwbi]
-N <name>
-P <define>
-C <diffCommand>
-tabs <number>
-line <number>
-pattern <regexp>

COMMAND LINE OPTIONS FOR XDIFF

Options and paths may be specified in any order except for the -N and -P options which must precede their respective path specification.
-D
If there are no differences then exit quietly with exit code of 0.

-w
Passed on to diff(1) . Ignore whitespace when comparing files.

-b
Passed on to diff(1) . Ignore trailing blanks when comparing files.

-i
Passed on to diff(1) . Ignore case when comparing files.

-
Not really an option. Use stdin as one of the files. See DESCRIPTION below.

-N <name>
Specifies the string to use in place of the file name in the title area. This option only applies to the next path in the argument list. This is useful if the file is a temporary one and a more meaningful description is wanted. If not specified then the file name is used. If input is being read from stdin and no -N is specified then the string "<stream>" is used.

-P <define>
This option specifies a string to be used in a #if defined #endif placed around text for files for which no selection has been made. If a value is not specified then the a symbol FILE<number> is used where <number> represents the position in the argument list. As with the -N option, this option only applies to the next path in the argument list. See the description of the File menu for more information.

-tabs <number>
Set the tabWidth resource to the specified value. When displaying the text, tabs will be expanded to 'number' of spaces. This overrides the value specified in the resources. This is for display purposes only and will not affect the resulting output of a merge.

-C <diffCommand>
Specify an alternate command to use instead of diff(1) . Of course it must produce compatible output.

-line <lineNumber>
This specifies the starting cursor line position. The base file is used as the source for the line number. This is useful when invoking xdiff repetatively with different revisions looking for a specific change.

-pattern <regexp>
This specifies a starting search pattern. On startup all lines matching this pattern will be indicated as such. See Searching below.

DESCRIPTION

The paths supplied on the command line identify the files to be compared. Each path may be one of, a regular file, a directory or a '-' and are subject to the following requirements. If a directory is specified then there must also be at least one regular file. For directory paths the last component of the first regular file will be appended to the directory to form the file name. There may be only one path specified as '-' in which case the input for that path will be read from standard input. The order of the paths on the command line specifies which area of the display the file will appear. They will be displayed left to right in the order they appear on the command line. By convention the first file is the base file and the others are revisions of that file.

The xdiff screen is divided into 3 main areas. These are, the menu bar at the top of the window, a message line just below it and a text area occupying the remainder. The text area is further divided into one text window for each file. A vertical slider separates the base revision from the other revisions. The text windows have a window containing the text, a title bar at the top and a horizontal slider at the bottom. Each text window may be augmented with an area containing line numbers and all revision text windows may also have a difference overview display area.

xdiff uses diff(1) or other program to determine the differences between the files. The diff program is called once for each revision with the base file. Differences are highlighted using different colours for the foreground and background. These may be specified by the user as described below in the section on user preferences. The vertical slider that separates the base revision from the others controls the vertical positioning of all text areas simultaneously. The size of the thumb of the slider is scaled to represent the amount of text visible in the windows.

When line numbers are displayed they will appear in a window to the left of each of the text regions. For regions of a file where text is absent there will be no line number displayed.

When the difference overviews are displayed they will appear in a window to the right of each of the revision text window. It's purpose is to show graphically, the number, location and size of the differences between that revision and the base file. The overview display consists of two columns representing the files and their differences. The area in between contains lines joining the two columns to indicate where the differences occur with respect to the other file. A small arrow is shown in each column and represents the position of the cursor line in that file. The lengths of the two columns are proportional to the lengths of the files they represent.

MENU BAR



xdiff has a menu bar consisting of seven buttons. These are listed below and described in more detail in the sections that follow.
File
Contains commands to save merged files reload files and to exit xdiff.

Edit
Contains undo, redo, editing, block operation, searching and highlighting commands.

Options
Contains flag settings for calling diff(1) , setting tab widths and controls for toggling parts of the display.

Global
Contains functions that apply to the entire file.

Region
Contains functions that apply to a single difference region.

Line
Contains functions that apply to a single difference line.

Help
Interface to the online help.

FILE MENU



This menu is used to save merged text to a file, reloading files and also to exit xdiff. Where there are menu choices that refer to the Base file, First Revision and Second Revision in this pulldown menu and others it is meant to be illustrative of what will appear. Which buttons appear will depending on how many files are specified on the command line.

Save as Base File
Short cut to save the merged text to the source file of the base file.

Save as First Revision
Short cut to save the merged text to the source file of the first revision.

Save as Second Revision
Short cut to save the merged text to the source file of the second revision.

These buttons are displayed as toggle buttons where their state depends on whether or not you have write permission for these files. If you have write permission then the toggle button is selected. The default resources will make it a nice reassuring green colour.

Before a save can be performed all differences must have a selection or you must have specified one or more -P options as described above in the options section. If you have not specified any -P options and there are unselected differences an error message is displayed in the message line and the cursor line is moved to the first line which does not have a selection. If you have specified one more -P options then each unselected region or partial region will be enclosed in #if defined( <symbol> ) #endif preprocessor statements. If the resource confirmWrite is set to True then a confirmation dialogue is presented before a save allowing the user to confirm the write or cancel the operation. The default for the confirmWrite resource is True. If you save to a file when that file has been read from the standard input xdiff will write the output to standard output. This allows xdiff to be used in a filter chain like all well behaved Unix utilities. After a save to a file, a message will be displayed in the message line to indicate the status of the save.

Save As ...
Save As will present the user with the Motif file selection box. If the user presses the OK button then the merged text will be written to the specified file, subject to the conditions described above.

When writing the regions of common text using 'Save As ...' the text from the current file is used. The current file is indicated by the inset tile bar. This may yield surprises if the -w -b -i flags are used. Although the text is indicated as being the same it may not be. When using Save Base, First, Second, Third or Fourth the common text is taken from the same file so as to minimize the problems with inappropriate white space and case.
Reload
This function can be used to update the display for changed files or changed options without the need to restart the application. Any needed files will be reread and any necessary diffs performed. xdiff will attempt to remain on the same line in the base file after the reload. If there is a starting search pattern defined then this will be redone after the reload as well.

Exit
This is the normal place to exit xdiff. If you have attempted to save a merged file and that save has failed then a message will appear in the message line stating that your changes have not been saved. This is to give you a chance to save your changes by correcting the save problem or save them to another file. Once the message has appeared then selecting Exit again will leave xdiff without the warning message.

EDIT MENU



This menu contains functions for undo, redo, block operations, searching and shuffling lines within a difference region.

Undo
Undo the last undoable operation. The undoable operations are selection, split, mark as changed and edit. The commands Cut Region and Paste Region are not undoable and will remove the undo history. Cut and Paste are complementary operations and can be used to undo each other. Previous operations may be undone by repeating the undo operation.

Redo
After an undo, the undone operation may be restored by using the redo command. Successive operations may be restored by repeating the redo command.

Set Mark
The cursor line is set as the mark line. When the cursor line is moved the marked region is extended to the new position of the cursor line. This region is used by the commands Cut Region, Copy Region, Mark as Changed, line selection and line splitting. The extent of the marked region is indicated with special Marked colours. See the section on user preferences on how to change this colour from the default of white text on blue background. The marked region is toggled off after any command that uses the mark. It may also be toggled off by selecting Set Mark again.

Copy Region
Copy the marked region to xdiff's cut buffer. The Marked region is cleared after the copy.

Cut Region
Delete the marked region. Save it in xdiff's cut buffer.

Paste Region
Insert the contents of xdiff's cut buffer after the cursor line. The cut buffer is cleared after the paste operation.

Search ...
Search will present a dialogue box containing searching parameters. See the section "Search Dialogue" for a complete explanation.

Search Next
After search parameters have been entered through the Search Dialogue the Search Next command will move the cursor from its current position to the next match. If there are no more matches below the cursor line then the cursor will remain where it is and a message will be displayed in the message line "No match to bottom".

Search Previous
As above but the cursor will move from its current position to the previous match. If there are no matches above the cursor line then the cursor will remain where it is and a message will be displayed in the message line "No match to top".

Highlight Differences
Sometimes it is difficult to see the differences between the revisions. The Highlight Differences command changes the display for the cursor line to indicate the differences. It uses the same colour scheme as is used for the line display. The display for this line will revert to the normal display if you choose highlight again with the cursor line on that line or when you select another line for highlight display.

Mark as Changed
Because of the way diff(1) works some regions of change will be broken into two or more regions. You may wish to treat it as one in your selection and editing. They may be merged into a single region by first marking the region you wish to change by using Set Mark and some cursor movement. The command Mark as Changed will change the marked range into one region of type Changed.

Shuffle Up
Shuffle up is used to move lines up with respect to the other files. You may only shuffle lines from regions of changed text. This can aid in making the desired selections. You must first change the current file to the file you wish to modify. This may be done by clicking on the title area at the top of the text region or by making a selection in the desired file or by adding a translation using the file action function. Place the cursor line on the bottom line that you want to move up. Use Shuffle Up to move the current line and all adjacent lines up one line. The cursor line and the adjacent lines are moved up in relation to the other files. If there is no more room in the region then space is created at the top of the region.

Shuffle Down
Like Shuffle Up but the text goes down instead.

OPTIONS MENU



This menu allows the user to change the options used in the difference algorithm. The visibility of portions of the display may also be toggled using commands in this menu.

Ignore Trailing Blanks
Toggles the state of the ignore trailing blanks flag. The reload command can then be used to update the differences with the changed options.

Ignore Whitespace
Toggles the state of the ignore whitespace flag. The reload command can then be used to update the differences with the changed options.

Ignore Case
Toggles the state of the ignore case flag. The reload command can then be used to update the differences with the changed options.

Tabs 4
Specifies that tabs should be expanded to 4 spaces.

Tabs 8
Specifies that tabs should be expanded to 8 spaces.

Set Tabs...
Presents the user with a dialogue to specify the width of tabs.

Toggle Numbers
This will toggle the display of line numbers. When line numbers are displayed each text area will be augmented by another window to the left of the text area. This new window area will contain the line numbers.

Toggle Overview
This will toggle the display of the overview windows. When the overview windows are displayed each text area except the base file will be augmented by another window to the right of the text area. This new window area will contain the overview of the differences between that revision and the base file..

Scroll Lock
When set, this toggle causes the horizontal scroll bars to synchronize and move together.

Center Differences
When set, xdiff will attempt to center the cursor line after going to the next or previous difference. When not set, xdiff will try to maintain the current cursor position.

Backup Files
When set, xdiff will attempt to create a backup file before overwriting an existing file.

File Exclusive
When viewing the differences of more than two files it is sometimes desirable to go to a difference that is due to a specific revision. When the state of fileExclusive it True, the next/previous functions ignore the differences due to other files. This does not apply when moving between differences on the highlighted line.

GLOBAL MENU



This menu contains operations that affect the entire file. For the selection command below they will only be applied to the differences that do not yet have a selection. This allows a few choices to be made and then the rest of the selections can be done globally. To select all the differences from a file after some selection have been made first use Global->Remove Selection and then the appropriate global selection.

Select Base File
Selects all the difference regions from the base revision.

Select First Revision
Selects all the difference regions from the second revision.

Select Second Revision
Selects all the difference regions from the third revision.

Select Nothing
All difference regions are not selected. Only common text will be included in any merged output.

Remove Selection
Removes all selections that have been made.

Merge
When there are two or more revisions the Merge function can be used to select all non overlapping differences. Overlapping differences will remain unselected. You can use the Next Unselected function in the popup to find these differences and choose an appropriate course of action. As with the other global selection functions it will not change the selection of any difference that already has a selection.

REGION MENU



The functions of the Region Menu use the location of the cursor line to specify the region for which the function is to be performed. These functions will only work when the cursor line is on a difference region. Similar to the global operations, selections made to a region will not alter selections of individual lines. In this way you can make a few line based selections and then select the remainder of the region with the region selection. To select the entire region of a file after line selections have been made from other files simply remove the selection of the region and then make the desired selection. If a region has been entirely selected from one file then it is not necessary to remove the selection to select another file.

Select Base File
The entire difference region from the base file is selected.

Select First Revision
The entire difference region from the first revision is selected.

Select Second Revision
The entire difference region from the second revision is selected.

Select Nothing
No file region is selected. No text from any file in this region will be included in the merged output.

Remove Selection
Any previous selection made to this region will be removed.

Split Base
In the case when the text has changed between the files and it is desired to have more than one difference appear in the merged output split can be used to create two difference regions so that each may be selected individually. Split Base will extract all the non empty text from the base file in the difference region and place it a new region above the existing one. Any line selections that had been previously made to the region will remain in both regions after the split. The new region will then be selected automatically. This region selection will not override the any line selection as described above. If the existing region now only contains the text from one file then it too is automatically selected. The selections and the split are entered into the undo list separately so that they may be undone separately. Because of this it may require three undos to completely undo the split operation.

Split First
Same as Split Base except that the text from the first revision is listed first.

Split Second
Same as Split Base except that the text from the second revision is listed first.

LINE MENU



This menu's functions use the location of the cursor line to specify the line for which the operation is to be performed. These functions will only work when the cursor line is on a difference line.

Select Base
The line from the base file is selected.

Select First
The line from the first revision is selected.

Select Second
The line from the second revision is selected.

Select Nothing
The cursor line for all files is not selected and so no line will be included in the merged output.

Remove Selection
Any previous selection made to this line will be removed.

Split Base
Same as Split Base in the Region Menu above except that it only operates on the current line. If a group of lines are marked using the Set Mark from the Edit Menu then all of the marked lines are treated as a block and split as a unit. Shuffle Up and Shuffle Down from the Edit Menu may be used to align the lines prior to the split.

Split First
Same as Split Base except that the text from the first revision is listed first.

Split Second
Same as Split Base except that the text from the second revision is listed first.

HELP MENU



On Context
This menu can be used obtain help for any widget in the main window. Selecting the help on context button will cause the cursor to change to a question mark. Move this cursor to any of the widgets and click. A netscape window will be created and the appropriate section of the man page will be displayed.

HTML man page
Help for xdiff is displayed using netscape. The menu entry will display the man page in your current netscape session or a new one started if it is not running.

What's New
This describes new features in this release of xdiff.

About xdiff
Provides a brief synopsis of xdiff.

INTERACTION

xdiff can be used to merge the differences from the given files into another or to overwrite one or all of the original files. To select the desired differences the user interacts as follows. Note that this description assumes the default translations described below.

With the pointer in one of the text windows and pressing the left button the cursor line moves to the line under the pointer. If this line is in a difference region then the region from that file is selected.

Pressing the middle button with the pointer in any of the text windows will move the cursor line to the line under the pointer. If this is within a difference region then a selection of only the cursor line is made. This allows a finer level of selection of which text will appear in the merged output.

Holding the Shift key while pressing a button will cause the region or line, with left or middle button respectfully, to have it's selection removed.

Holding the Alt key while pressing the button will cause the region or line, as described above, to have no selection. No text from any file will appear in the merged output.

If some lines have been selected, selecting the region will not override any of the line selections. With this you may make a few line selections and then easily select the rest from another file. To select the entire region after having made some line selections you will need to unselect the region to first clear the line selections and then select the desired region. This is also the case for global selection. Global selection will not override any of the selections already made. To select the entire file after having made some selections you will need to unselect everything to first clear all selections and then select the desired file.

These selections may also be performed by making the selection in the line number areas if they are displayed.

These interactions are defined by translations in the application defaults file. See the section below describing the translations and how they may be customized.

Pressing the right button while in any of the text windows will post a popup menu. This popup's methods are to move to other difference regions. Accelerators may be attached to provide quick navigation using the keyboard. Be careful not to define an accelerator for these buttons and also a translation for the the same function or you will skip over every other difference since they will both be performed.

The selections in this popup are as follows.



Next Difference
Go to the first line of the next difference region.

Previous Difference
Go to the last line of the previous difference region.

Next Unselected
Go to the next difference line that is still unselected.

Previous Unselected
Go to the previous difference line that is still unselected.

Next Selected
Go to the next difference line that is selected.

Previous Selected
Go to the previous difference line that is selected.

When the File Exclusive flags is set through the Option Menu or the resources then next or previous will mean that it applies only to the current file. When the cursor line is on the highlighted line then the display will scroll horizontally to put the difference within the line at the left edge of the window. This can be useful then finding differences within long lines.

Pressing any button while the pointer is in an overview area will move the cursor line to the relative position in the file indicated by the pointer position. If the pointer is in the left half of the overview window the line will be determined from the base file and from the revision corresponding to the overview if the pointer is in the right half. The cursor line will then be displayed in the center of the text windows. If the pointer is dragged while the button is down the cursor line will follow the pointer.

EDITING DIALOGUE



A simple editing dialogue is included in xdiff to allow minor changes to text. It is also a back door to X cut and paste. The edit dialogue consists of a Motif text field for each file. The text of the current line is placed in these text fields. They may be edited in the normal fashion. However, you may not add a new line. Once you are satisfied with your changes the Apply button will cause the changes to be reflected in the text windows. The Reset button will revert to the state when the edit dialogue was entered or the last time the Apply button was pressed. The Close button will dismiss the edit dialogue.

While the edit dialogue is up it does a pointer grab so interaction in the main xdiff window is not possible. Any edits may be undone after the edit window is closed.

Since you cannot specify the spacing of tabs in the Motif text field they are always expanded to 8 spaces.

SEARCHING DIALOGUE



A searching dialogue is available in xdiff to allow the user to locate specific lines in the files being compared. The main elements of the searching dialogue are a menu bar to allow the user to specify the type and scope of the search, handy buttons to search next and previous matches and an important search pattern entry field.

The searching dialogue menu bar has two pull downs, one to set the search type and one to set the search scope.

The Type pulldown has buttons to specify the type of search to be performed.



Regular Expression
The specified search pattern will be interpreted as full regular expressions.

Literal Case Sensitive
The specified search pattern will be interpreted as literal text where case is respected.

Literal Case Insensitive
The specified search pattern will be interpreted as literal text where case is ignored.

Line Numbers
The specified search pattern will be interpreted as a line number.

The Scope pulldown sets the scope of the search. The search will only be performed for the files indicated by active toggle buttons in this menu.



Search All
A handy button to turn the search on for all files.

Search None
A handy button to turn the search off for all files.

Search Base File
Toggle the search state for the Base file.

Search First Revision
Toggle the search state for the first revision.

Search Second Revision
Toggle the search state for the second revision.

The user enters the search pattern into the text field of the search dialogue and presses the Search button or hits the return key.

The search dialogue also contains two buttons to search for the next or previous match. They do what you would expect them to. The search will not wrap using these buttons as it will when using the search button or return key.

At the bottom of the searching dialogue are three buttons. The Search button will initiate the search of the specified type in the specified file scope. A small diamond will appear in the overview area for each line that matches the search pattern. To move to a match you may click on one of the diamonds in the overview area or use the Search Next or Search Previous buttons. There are Search Next and Search Previous buttons in the Edit menu for use when the search dialogue is not displayed. The Clear button will clear the search pattern and reset all the flags on all lines matching the previous pattern. The Close button will dismiss the search dialogue leaving the search pattern and match flags intact.

TRANSLATIONS and ACTIONS

Some of the behaviour of xdiff is specified by X event translations. These translations invoke one of four actions functions to perform their function. To perform selections using the mouse we can write a translation using the action selection(). Only button down events may to used in translations using the selection action. The location in the button event is used to determine the cursor location.

The selection action takes two parameters. First is the operation. There are three operations that may be specified.

select
This specifies that the entity under pointer should be selected.

unselect
This will remove any selection for the item under the pointer.

delete
This selects no file side. The item will not appear in the merged output.

The second parameter specifies the zone of influence for the selection. This parameter may be either region or line.

region
We make selection for the entire region under the pointer.

line
The selection is applied only to the line under the cursor.

The next action function we can talk about is the cursor action. This one moves the cursor line around a bit. This action takes only one argument and can be one of five things.

up
The cursor line is moved up one line.

down
The cursor line is moved down one line.

top
The very top is where you will find the cursor line after this.

bottom
You have sunk to the end of the file with this.

high
Moves the cursor line to the top of the display if it can. Mimics the H function of vi.

middle
Moves the cursor line to the middle of the display if it can. Mimics the M function of vi.

low
Moves the cursor line to the bottom of the display if it can. Mimics the L function of vi.

search
This action will search all files for a regular expression in a specified direction. So i lied. This action takes two additional arguments. The second argument of this action is either 'forward' or 'backward'. The last argument is the regular expression to match. The following is a translation that can be used to search up for the top of a C function. ~Shift<Key>-: cursor(search backward "^{")\n\
return
This action will return the cursor to the location where the previous command was invoked. For example if you have just performed the next difference command and then you go to the top of the file you can then use cursor( return ) to return to your previous position.

The next action is called scroll(). The first argument specifies the direction to scroll and an optional second argument specifies the amount to scroll. With the vertical scrolling the cursor line will remain in the same location if possible.

up
The text is scrolled up by the specified amount.

down
The text is scrolled down by the specified amount.

left
The text is scrolled left by the specified amount.

right
The text is scrolled right by the specified amount.

The amount to scroll can be one of three values.

page
The text is scrolled height in lines minus one vertically or the width in characters minus one horizontally of the text window. The is the default scrolling amount.

half
The text is scrolled half the height in lines vertically or half the width in characters horizontally of the text window.

1
The text will scroll one line vertically or one character horizontally.

end
This will scroll as far as possible in the desired direction.

The last action is the file action and is used to set the current file. This action takes only one argument.

next
This set the current file to the next file to the right and will loop back to the first file.

prev
This set the current file to the previous file to the left and will loop back to the last file.

The default translations for xdiff are listed below. The arguments to the actions can be upper or lower case. In fact only the first letter of each argument is significant.

*mainForm*XmDrawingArea.translations:#override\n\
~Alt ~Shift<Btn1Down>: selection(select region)\n\
Shift<Btn1Down>: selection(unselect region)\n\
Alt<Btn1Down>: selection(delete region)\n\
~Alt ~Shift<Btn2Down>: selection(select line)\n\
Shift<Btn2Down>: selection(unselect line)\n\
Alt<Btn2Down>: selection(delete line)\n\
<Key>osfBeginLine: cursor(top)\n\
<Key>osfEndLine: cursor(bottom)\n\
<Key>osfUp: cursor(up)\n\
<Key>osfDown: cursor(down)\n\
~Ctrl<Key>osfPageDown: scroll(down)\n\
~Ctrl<Key>osfPageUp: scroll(up)\n\

For those of us who don't think the arrow keys are convenient enough to be useful, after all you have to move your hands from the home row, we can add the motion keys from our favorite editor to the translations. These work well for us vi users.

~Shift<Key>j: cursor(down)\n\
~Shift<Key>k: cursor(up)\n\
Ctrl<Key>e: cursor(down)\n\
Ctrl<Key>y: cursor(up)\n\
~Shift<Key>g: cursor(top)\n\
Shift<Key>g: cursor(bottom)\n\
Ctrl<Key>b: scroll(up)\n\
Ctrl<Key>f: scroll(down)\n\

To move between differences we can use the popup in the text areas. When using the keyboard we can add accelerators for the buttons in that popup. This requires that the pointer be placed in the text area for the accelerators to be invoked. It can be annoying when the xdiff window comes up and the pointer is on the scroll bars or the line number areas and the accelerators are unavailable. To solve this we can add translations to the XmDrawingArea translations above and augment the translations for the scroll bars with the following.

~Alt Shift<Key>n: cursor(prev)\n\
~Alt ~Shift<Key>n: cursor(next)\n\
Alt Shift<Key>n: cursor(prev unselected)\n\
Alt ~Shift<Key>n: cursor(next unselected)\n\

Do not add accelerators to the drawing area popups and have these additional translations at the same time as the cursor will skip 2 differences instead of just one.

These are the translations that i have in my application defaults file. This is so that i can use xdiff entirely from the keyboard.

*mainForm*XmDrawingArea.translations:#override\n\
Alt<Btn1Down>: selection(delete region)\n\
Alt<Btn2Down>: selection(delete line)\n\
Shift<Btn1Down>: selection(unselect region)\n\
Shift<Btn2Down>: selection(unselect line)\n\
~Alt ~Shift<Btn1Down>: selection(select region)\n\
~Alt ~Shift<Btn2Down>: selection(select line)\n\
<Key>osfBeginLine: cursor(top)\n\
<Key>osfEndLine: cursor(bottom)\n\
~Ctrl<Key>osfPageDown: scroll(down)\n\
~Ctrl<Key>osfPageUp: scroll(up)\n\
<Key>osfUp: cursor(up)\n\
<Key>osfDown: cursor(down)\n\
Ctrl<Key>y: cursor(up)\n\
Ctrl<Key>e: cursor(down)\n\
~Shift<Key>k: cursor(up)\n\
~Shift<Key>j: cursor(down)\n\
Shift<Key>g: cursor(bottom)\n\
~Shift<Key>g: cursor(top)\n\
Ctrl<Key>d: scroll(down)\n\
Ctrl<Key>u: scroll(up)\n\
~Alt Shift<Key>n: cursor(prev)\n\
~Alt ~Shift<Key>n: cursor(next)\n\
Alt Shift<Key>n: cursor(prev unselected)\n\
Alt ~Shift<Key>n: cursor(next unselected)\n\
~Shift<Key>-: cursor(search backward "^{")\n\
~Shift<Key>=: cursor(search forward "^{")\n\
Shift<Key>space: file(next)\n\
~Shift<Key>space: file(previous)\n\

*mainForm*XmScrollBar:#override\n\
<Key>osfBeginLine: cursor(top)\n\
<Key>osfEndLine: cursor(bottom)\n\
~Ctrl<Key>osfPageDown: scroll(Down)\n\
~Ctrl<Key>osfPageUp: scroll(Up)\n\
<Key>osfUp: cursor(up)\n\
<Key>osfDown: cursor(down)\n\
Ctrl<Key>y: cursor(up)\n\
Ctrl<Key>e: cursor(down)\n\
~Shift<Key>k: cursor(up)\n\
~Shift<Key>j: cursor(down)\n\
Shift<Key>g: cursor(bottom)\n\
~Shift<Key>g: cursor(top)\n\
Ctrl<Key>d: scroll(down)\n\
Ctrl<Key>u: scroll(up)\n\
~Alt Shift<Key>n: cursor(prev)\n\
~Alt ~Shift<Key>n: cursor(next)\n\
Alt Shift<Key>n: cursor(prev unselected)\n\
Alt ~Shift<Key>n: cursor(next unselected)\n\
~Shift<Key>-: cursor(search backward "^{")\n\
~Shift<Key>=: cursor(search forward "^{")\n\
Shift<Key>space: file(next)\n\
~Shift<Key>space: file(previous)\n\

PREFERENCES

In addition to customizing the translations we can specify resources to change the colours and fonts used by xdiff. We need to define some terminology first. The differences obtained from diff(1) can be classified into 4 types.
Common
Common text which is present in all files.

Only
Only text is text that appears only in one file.

Absent
When text is missing from a file the void in the other files is called Absent. This always accompanies Only text.

Changed
Text which has been changed between the files is called Changed Text.

Same
A special case of Changed text is Same. This is used for text in a changed region that is the same as the base file. The base file will also use this colour when all other files are the same or are absent. This allows an additional colour clue as to the extent of the changes.

Unselected text will use the types above. Once a selection has been made the following types will apply.

Selected
When the user has selected one of the differences then that will be selected the others will become deleted.

Deleted
This text is not desired in the merged output. If the user selects one file the others will be marked as deleted. This will also be used to mark all files when the selection type is select nothing.

Marked
This is to indicate the region between the mark line and the cursor line. This indicated the text to be used for the Cut or Copy operation. This overrides any of the colours above. These names are used to form X11 resources names to determine the users preferences.

Each of these categories may have different colours for foreground and background. They may also have a different font. i have found that using a bold font for selected text makes it stand out quite well. Any unspecified fonts will default to the font for fontCommon. To specify the foreground resources name prefix the name with 'foreground' the background is specified by prefixing the name with 'background'. To specify the font, prefix with 'font'. From the app-defaults file the Common Text is specified with.

*fontCommon: *-clean-medium-r-normal-*-14-*
*foregroundCommon: black
*backgroundCommon: grey

The cursor colour may be specified using the resource 'cursorColour' This colour is used to outline the cursor line in the text windows and the outline of the triangular indicator in the overview area.

Lines that match the pattern specified in the search window may be outlined in a different colour to indicate the match. The resource used to specify this is 'matchColour' if not specified the cursorColour is used.

ADDITIONAL RESOURCES

The user interaction of xdiff may be customized by setting additional resources through an app-defaults file or by using the standard -xrm option on the command line. The following resources may be set by the user. The defaults are listed with each option.

confirmWrite
If True, a confirmation dialogue is presented before a save allowing the user to confirm the write or cancel the operation. The default is True.

confirmQuit
If True, a confirmation dialogue is presented before xdiff exits allowing the user to cancel the operation. The default is True.

overview
If True xdiff will display a difference overview window to the right of each of the revision text windows. The default is True. The value may be toggled through the Options menu.

lineNumbers
If True xdiff will display line numbers on startup. The default is True. The value may be toggled through the Options menu.

ignoreWhitespace
If True xdiff will ignore whitespace when comparing files. The default is False. The value may be toggled through the Options menu.

ignoreTrailing
If True xdiff will ignore trailing blanks when comparing files. The default is False. The value may be toggled through the Options menu.

ignoreCase
If True xdiff will ignore case when comparing files. The default is False. The value may be toggled through the Options menu.

centerDiffs
If True, xdiff will attempt to center the cursor line after going to the next or previous differences. If False, xdiff will try to maintain the current cursor position. The default False. The value may be toggled through the Options menu.

backupFiles
When True, xdiff will attempt to backup files before overwriting them. The default False. The value may be toggled through the Options menu.

backupSuffix
This resource specifies a suffix which will be added to the file name to form the backup file name. If no value for backupSuffix is found in the resources then the value ".bak" will be used.

tabWidth
When displaying the text, tabs will be expanded to the number of spaces as specified by this resource. The default is 8. The value may be set through the Options menu or on the command line thought the -tabs option.

diffCommand
Specify an alternate command to use instead of diff(1) . The default is "diff". The value may be set on the command line thought the -C option.

startLine
This specifies the initial cursor line. Useful for iterative comparisons through a number of revisions. The default is line 1. The value is normally set thought the command line argument with the -line option.

startSearch
Specifies an initial search pattern. Also useful for iterative comparisons. The default is "". The value is normally set thought the command line argument with the -pattern option.

scrollLock
When True, moving a horizontal scroll bar will affect all text window simultaneously. The default is True. The value may be toggled through the Options menu.

slideDiffs
When invoking diff on multiple files the same difference may not be aligned with respect to the base file. When set this resource will slide the difference region down while the top line of the region matches the line directly following the region. This produces fewer difference regions and makes selection much easier. The default is True.

fileExclusive
When viewing the differences of more than two files it is sometimes desirable to go to a difference that is due to a specific revision. When the state of fileExclusive it True then using the next/previous functions the differences due to other files are ignored. This does not apply when moving between differences on the highlighted line. The default is False. The value may be toggled through the Options menu.

overviewWidth
This specifies the width of the overview windows. The default is 30.

FILES

xdiff uses temporary files when reading from stdin or performing line highlighting. These files will be located in $TMPDIR if it is defined otherwise it will be located in /usr/tmp. The file name will be of the form xdiffXXXXXX.

Application defaults for xdiff can be found in /usr/lib/X11/app-defaults/XDiff.

BUGS

If you edit a copied line then all copies of that line are are affected by the edit.

The colour of a region in the overview is determined by the first line of the region. As a result line based selections will not show up.

SEE ALSO

gdiff(1) , diff(1) .
Discussions about xdiff may be directed to comp.windows.x.apps

AUTHOR

Rudy Wortel <rudy@aw.sgi.com>.


Table of Contents