Mercurial > hg > xemacs-beta
diff man/emerge.txt @ 0:376386a54a3c r19-14
Import from CVS: tag r19-14
author | cvs |
---|---|
date | Mon, 13 Aug 2007 08:45:50 +0200 |
parents | |
children | ac2d302a0011 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/man/emerge.txt Mon Aug 13 08:45:50 2007 +0200 @@ -0,0 +1,786 @@ + +This is the documentation for version 5 of "emerge.el", an Emacs +package that allows you to combine two versions of a file by +selecting, for each place where they differ, which version of the +difference you prefer. It is similar to Sun's "filemerge". + +Written by Dale R. Worley <drw@math.mit.edu>. + +WARRANTY DISCLAIMER + +This software was created by Dale R. Worley and is +distributed free of charge. It is placed in the public domain and +permission is granted to anyone to use, duplicate, modify and redistribute +it provided that this notice is attached. + +Dale R. Worley provides absolutely NO WARRANTY OF ANY KIND +with respect to this software. The entire risk as to the quality and +performance of this software is with the user. IN NO EVENT WILL DALE +R. WORLEY BE LIABLE TO ANYONE FOR ANY DAMAGES ARISING OUT THE +USE OF THIS SOFTWARE, INCLUDING, WITHOUT LIMITATION, DAMAGES RESULTING FROM +LOST DATA OR LOST PROFITS, OR FOR ANY SPECIAL, INCIDENTAL OR CONSEQUENTIAL +DAMAGES. + +;; LCD Archive Entry: +;; emerge|Dale R. Worley|drw@math.mit.edu +;; |File merge documentation +;; |92-12-11|version 5 gamma|~/packages/emerge.doc.Z + +- Changes from version 4 to version 5 + +Put in improved disclaimer of copyright and warranty. + +Document autoload for emerge-execute-line. + +Changes to support use with Ange-FTP. + +Allow filenames containing shell metacharacters to be handled unscathed. + +Certain internal problems were fixed so that bugs in "x s", "x j", and +"x t" were eliminated. + +Non-existent and non-readable file names are rejected, even if Emerge +is called non-interactively. + +Add code to process the local-variables list in newly created merge +buffers. + +Add changes made by David Gudeman to allow the default directory for +arguments to the emerge-files commands to be the directory of the +argument of that type to the last emerge-files command. See "Default +directories" below. + +Add emerge-process-line command to allow semi-automatic batching of +merges. + +Add David Gudeman's facility for merging RCS revisions of a file. + +Add a few hooks to make customization easier. + +Still no Epoch support in this version, though. Talk to Dan Pierson +<pierson@xenna.encore.com> or check epoch-emerge-patch.el in the Emacs +Lisp Directory if you want Epoch support. + +And the document still isn't in TeXinfo format. + +- Changes from version 3 to version 4 + +More configuration variables are marked as user options. + +Code is included for an improved version of make-auto-save-file-name +which eliminates many problems with the default version. See the +documentation of emerge-make-auto-save-file-name to see how to +activate it. + +Emerge now works with Gnu diff3, which can produce the groups of lines +from the various files in the order 1, 2, 3 or 1, 3, 2. + +Add "x f" command to show what files or buffers are being operated on. + +The merge buffer now starts read-only, which being in fast mode it +should be. + +When merging buffers, Emerge writes their contents into temporary +files in the directory $TMPDIR (if it is defined), or /tmp by default. + +Add "x j" command to join two differences. + +Add "x s" command to split a difference into two differences. + +Add emerge-version variable and function to report the version of Emerge +being run. + +Add "x t" command to trim unchanged lines off top and bottom of +difference region. + +Add "x d", "x a", and "x b" commands to locate the differences at or +near a given location in one of the buffers. + +Emerge no longer tries to copy the minor modes from the A buffer to +the merge buffer, only the major mode. + +The programs executed to find the differences between versions of the file +are no longer controlled by emerge-diff/diff3-command, but rather by: + emerge-diff-program + Variable: *Name of the program which compares two files. + emerge-diff3-program + Variable: *Name of the program which compares an ancestor file + (first argument) and two variant files (second and third arguments). + emerge-diff-options + Variable: *Options to be passed to emerge-diff/diff3-program. + +The names of the files are expanded (see expand-file-name) before being +passed to emerge-diff/diff3-program, so diff need not invoked under a shell +that understands '~', for instance. + +If the diff/diff3 program reports errors, the user is notified and the +errors are displayed. + +The command "0j" can be used to suppress the flags from showing in the +buffers. + +A discussion of the effect of the merge flags on indentation of code +has been added to the documentation. + +If kill-fix.el is loaded, Emerge control variables now have their +'preserved' property set, so setting the major mode in the merge +buffer doesn't destroy Emerge's state. + +Add "x c", "x C", and "x x" commands to allow the A and B versions to be +combined into #ifdef - #endif forms. + +Replaced calls of "ding" to calls of "error" where appropriate. + +Add "x m" command to allow major mode of merge buffer to be changed. + +Add "x 1" command to shrink the merge window to one line. + +Add emerge-startup-hooks to allow customization. + +Fixed a bug that is activated when a remote merge request is made when +the minibuffer window is selected. + +- Changes from version 2 to version 3 + +The directory into which temporary files are written is now controlled +by a user option (emerge-temp-file-prefix). + +The A and B versions of the difference can be loaded into the kill +ring with the "c a" and "c b" commands. + +The A and B versions of the difference can be inserted into the merge +buffer with the "i a" and "i b" commands. + +The difference region of the merge buffer can be surrounded by the +point and mark with the "m" command. + +The three windows can be scrolled together with the "^", "v", "<", +">", and "|" commands. + +The "s s" and "s a" commands report the state of the option in the +echo area. Similarly, the "f" and "e" commands report what they do in +the echo area. + +The "q" command has been revamped, and its behavior is now controlled +by the manner in which Emerge is started. In particular, if you wish +to write the merge buffer into a file upon exiting, invoke +emerge-files[-with-ancestor] with a prefix argument, and it will +prompt you for the file name. Then exiting will write the merge +buffer to the file, unless "q" is given a prefix argument. + +The "i a" and "i b" commands now work in fast mode. + +The modifications that Emerge makes to save-buffer and write-file are +described. + +Emerge now handles merging narrowed buffers correctly. + +Emerge now isn't fooled when the buffer visiting a file is not the +same as the file on disk. + +- Starting + +To start Emerge, you must run one of four commands: + + emerge-files + emerge-files-with-ancestor + emerge-buffers + emerge-buffers-with-ancestor + +The "files" versions prompt you for two file names (the "A" and "B" +files), the "buffers" versions prompt you for two buffer names (the +"A" and "B" buffers). Emerge then runs a "diff" of the two entities +(emerge-buffers writes the buffers into temporary files for input to +diff) and digests the output to form a list of the differences between +the two files. Then three buffers are set up: two containing the +entities (emerge-files does a find-file (C-x C-f) on the files to get +them into buffers), and one, the "merge buffer", which contains the +working copy of the merged file that you are constructing. The three +buffers are put up in a nice three-window display, showing the A and B +buffers in the upper half and the merge buffer in the lower half. + +The versions of the command that say "with-ancestor" ask for a third +name, that of an entity which is a common ancestor from which the +versions being merged were derived. These commands use "diff3" to +compare all three versions. If one version of a difference agrees +with the ancestor, then it is presumed that the other version is the +"correct" version, and is said to be "preferred". + +(Note that if you use emerge-files, Emerge attempts to make sure that +file on disk and the file in the buffer are the same. If the file on +disk has been changed, Emerge offers to revert the buffer. If the +buffer has been modified, Emerge offers to save the buffer. If the +user declines the offer, or if the file on disk and the buffer have +both been modified, Emerge aborts with an error message. Emerge is +careful to widen the buffers containing the files if they have been +narrowed. If you use emerge-buffers, the buffers are not widened -- +only the visible portion is used.) + +During the merge, the A and B buffers are read-only, so you don't +damage them. (This is because the A and B versions of the differences +are extracted from these buffers.) When you quit the merge, the +read-only/read-write status and modified flag on the A and B buffers +are restored. In addition, auto-saving of the A and B buffers is +suppressed during the merge. This is because Emerge modifies the A +and B buffers to point out the text of the differences, and it would +be useless to save these changes. (Just before suppressing +auto-saving, Emerge forces an auto-save.) + +If you give a prefix argument to emerge-files or +emerge-files-with-ancestor, it prompts you for another file name, +which is the file into which the merged file is to be written when you +exit Emerge. The output file name defaults to the A file name. If +you successfully quit Emerge, the merge buffer will be written to the +output file, and the buffers for the A, B, and ancestor buffers will +be deleted (if they exist and are not modified). If you abort Emerge, +the merge buffer will not be written and the buffers will not be +deleted. + +You can have any number of merges going at once -- just don't use any +one buffer as input to more than one merge at once, since that will +cause the read-only/modified/auto-save status save-and-restore to +screw up. + +Beware that when Emerge starts up, it does a diff or diff3 of the +files, which can take many minutes for long files with many +differences. Emacs can't do anything else until diff finishes. + +If diff or diff3 produces error messages, Emerge will beep and display +the error messages instead of the merge buffer. There will be a +message in the echo area giving the name of the merge buffer. Note +that this is really just an informational message -- you still have +switch to the merge buffer and abort the merge to restore the +conditions before you ran Emerge. (Emerge considers any output line +that does not match the regexp emerge-diff/diff3-ok-lines to be an +error message.) + +After the merge has been set up, Emerge runs the hooks in +emerge-startup-hooks. + +The major mode of the merge buffer is set from the major mode of the A +file or buffer. You should not use the major-mode-setting commands +(like c-mode or lisp-mode) to alter the major mode of the merge +buffer, since they damage the state information of the merge. +(Emerge's information is maintained as local variables of the merge +buffer.) You can use the "x m" command to change the major mode of +the merge buffer safely. + +- Default directories + +If the variable emerge-default-last-directories is not set, the +default directory for all filename arguments to the emerge-files +commands is the default directory of the current buffer, like any +other Emacs command. This can be inconvenient if you are merging +files in two different directories, since you cannot arrange for the +default directories for all of the various arguments to be the +directories you want. + +The default directories for filename arguments can be changed by +setting the variable emerge-default-last-directories. When it is set, +the default directory for each filename argument is the directory of +the previous argument of that type. Thus, when merging files in two +directories, the full filenames need only be entered for the first +emerge-files command; the arugments to later emerge-files commands +will default to the same directories as the first one. + +In this mode of operation, when the default directory for a filename +argument is not the same as the directory of the file given as the A +file, the argument acquires a default filename which is the filename +of the A file appended to the default directory for the argument. +This simplifies the usual case when several sets of files with +corresponding names in different directories are being merged. + +- Merging + +Once you have started the merge, you manipulate the merge buffer with +special commands issued in the merge buffer. You may also edit the +buffer with ordinary Emacs commands. Emerge keeps track of each +difference between the A and B buffers and the corresponding section +of the merge buffer. Initially, all differences show the A version, +except those for which B is preferred (because A agrees with the +ancestor), which show the B version. Emerge always has its attention +focused on one particular difference, which is marked off in the three +buffers by "vvvvvvvvvvvvvvvvvvvv" above and "^^^^^^^^^^^^^^^^^^^^" +below. The number of the difference is shown in the mode line. If +you are positioned before the first difference (that's where you +start) or after the last difference, it displays as "diff 0 of nnn" or +"diff nnn+1 of nnn". + +A merge buffer can be in two modes: "fast" mode and "edit" mode. In +fast mode, emerge commands are single characters, and ordinary Emacs +commands are disabled. This makes Emerge operations fast, but +prevents you from doing more than selecing the A or the B version of +differences. In edit mode, all emerge commands must be prefixed with +C-c, and all (non-conflicting) Emacs commands are available. This +allows editing the merge buffer, but slows down Emerge operations. +Edit and fast modes are indicated by "F" and "E" in the minor modes in +the mode line. + +The Emerge commands are: + + p go to the previous difference + n go to the next difference + a select the A version of this difference + b select the B version of this difference + j go to a particular difference (prefix argument + specifies which difference) (0j suppresses display of + the flags) + q quit - finish the merge* + f go into fast mode + e go into edit mode + s a set/clear auto-advance mode* + s s set/clear skip-prefers mode* + l recenter (C-l) all three windows* + - and 0 through 9 + prefix numeric arguments + d a select the A version as the default from here down in + the merge buffer* + d b select the B version as the default from here down in + the merge buffer* + c a copy the A version of the difference into the kill + ring + c b copy the B version of the difference into the kill + ring + i a insert the A version of the difference at the point + i b insert the B version of the difference at the point + m put the point and mark around the difference region + ^ scroll-down (like M-v) the three windows* + v scroll-up (like C-v) the three windows* + < scroll-left (like C-x <) the three windows* + > scroll-right (like C-x >) the three windows* + | reset horizontal scroll on the three windows* + x 1 shrink the merge window to one line (use C-u l to restore it + to full size) + x a find the difference containing a location in the A buffer* + x b find the difference containing a location in the B buffer* + x c combine the two versions of this difference* + x C combine the two versions of this difference, using a + register's value as the template* + x d find the difference containing a location in the merge buffer* + x f show the files/buffers Emerge is operating on in Help window + (use C-u l to restore windows) + x j join this difference with the following one + (C-u x j joins this difference with the previous one) + x l show line numbers of points in A, B, and merge buffers + x m change major mode of merge buffer* + x s split this difference into two differences + (first position the point in all three buffers to the places + to split the difference) + x t trim identical lines off top and bottom of difference + (such lines occur when the A and B versions are + identical but differ from the ancestor version) + x x set the template for the x c command* + +* - more details on these commands are given below + +The variable emerge-version gives the version number of Emerge. The +emerge-version function displays emerge-version (when called +interactively) or returns it (when called from a program). + +- Differences and their states + +A difference can have one of seven states: + +A: the difference is showing the A version. + +B: the difference is showing the B version. + +default-A and default-B: the difference is showing the A or B state, +but has never been selected by the user. All differences start in the +default-A state (and thus the merge buffer is a copy of the A buffer), +except those for which one buffer or another is preferred. When the +user selects the difference, it changes to the A or B state. + +prefer-A and prefer-B: the difference is showing the A or B state. In +addition, the other buffer (that is, for prefer-A, the B buffer; for +prefer-B, the A buffer) agrees with the ancestor buffer. Thus, +presumably, the displayed version is the correct one. The "a" and "b" +commands override these states, and turn them into the A and B states. + +combined: the difference is showing a combination of the A and B +states that was constructed by the "x c" or "x C" commands. Since +this state is neither the A or B states, the "a" and "b" commands +won't alter the difference unless they are given a prefix argument. + +The state of the currently selected difference is shown in the mode +line of the merge window: + + state display + + A A + B B + prefer-A A* + prefer-B B* + combined comb + +- Select default commands (d a and d b) + +The "d a" and "d b" commands change all default-A's to default-B's (or +vice-versa) from the selected difference on down to the end of the +file to default-A or default-B, respectively. But remember, any +difference that you have ever selected isn't in the default-A or +default-B state, so it will never be affected by "d a" or "d b". This +leads to the unexpected result that "d a" or "d b" never affects the +difference selected at the moment, but prevents differences that you +have already looked at from changing unexpectedly. + +If you work your way down from the top of the file, using "d a" and +"d b" at judicious points, you can effectivly make the A version the +default for some sections of the merge buffer and the B version the +default for others. + +Giving the "d a" or "d b" command a prefix argument causes it to change +differences from the current point down that are in the B state (for d +a) or A state (for "d b") as well. (Thus, the selected difference may +be changed also.) Differences for which there is a preference will +not be affected. (Selecting a difference won't erase its preference.) + +- Exiting (q) + +The quit command finishes the merge session by restoring the state of +the A and B buffers and removing the markers around the currently +selected difference. It also disables the Emerge commands in the +merge buffer, since executing them later could damage the contents of +the various buffers. + +The action of "q" depends on how Emerge was started and whether "q" +was given a prefix argument. If there was no prefix argument, it is +considered a "successful" finish. If there was a prefix argument, it +is considered an "unsuccessful" finish. In either case, you are asked +to cofirm the exit, and the confirmation message tells which sort of +exit you are confirming. + +If Emerge was started by some other process, success/failure is +reported to the caller. + +If Emerge was started with emerge-files or emerge-files-with-ancestor, +if a prefix argument was given to that command, then you specified a +file into which the merge is to be written. A successful exit writes +the merge into the output file and then kills the A, B, and ancestor +buffers (so they aren't lying around to confuse you, since they +probably all have similar names). + +- Auto-advance mode (s a) + +If auto-advance mode is set, the "a" and "b" commands perform an "n" +(select next difference) afterward. When auto-advance mode is set, +it is indicated by "A" in the minor modes in the mode line. +"s a" with a positive argument sets auto-advance, with a non-positive +argument clears it, and with no argument toggles it. + +- Skip-prefers mode (s s) + +If skip-prefers mode is set, the "n" and "p" commands skip over +differences with states prefer-A and prefer-B. Thus you will only see +differences for which one version isn't presumed "correct". When +skip-prefers mode is set, it is indicated by "S" in the minor modes in +the mode line. "s s" with a positive argument sets auto-advance, with +a non-positive argument clears it, and with no argument toggles it. + +- Recenter (l) + +The Emerge "l" command causes the selected difference to be brought +into view in the three windows, or at least, whichever of the three +merge buffers are visible at the moment. If a prefix argument is +given, then the original three-window display is set up before the +difference texts are shown. + +- Scrolling the text (^, v, <, >, and |) + +Emerge has several commands which scroll all three windows by the same +amount, thus allowing you to easily compare the versions of the text. +The commands are "^" (scroll-up), "v" (scroll-down), "<" +(scroll-left), ">" (scroll-right), and "|" (reset horizontal +scrolling). (Remember that Emacs names scrolling commands by the +motion of the text with respect to the window, so C-v is called +"scroll-up".) + +If these commands (except "|") are given an argument, that is the +number of lines or characters by which the windows are scrolled. +Otherwise, the amount of motion is computed based on the dimensions of +the merge buffer window -- the height of the merge buffer window +(minus next-screen-context-lines), or half the width of the merge +buffer window. (The A and B version windows are assumed to be as high +as the merge window, but half as wide.) If the argument is just `C-u +-', then the scrolling is half the default amount. + +- Finding the difference at or near a location (x d, x a, and x b) + +The "x d" command selects the difference containing the current point +in the merge buffer. If there is no difference containing the point, +an error is given. An argument can be given to the command to change +this behavior: if the argument is positive (e.g., C-u), the next +following difference is selected; if the argument is negative (e.g., +C-u -), the previous difference is selected. + +The "x a" and "x b" commands select the difference containing the +current point in the A and B buffers, respectively. Otherwise, they +act like the "x d" command. Note that although the point used in the +commands is not the merge buffer point, the commands can only be +issued in the merge buffer, because it is the only buffer with the +Emerge keymap. + +- Combining the two versions (x c, x C, and x x) + +Sometimes one wants to combine the two versions of a difference. For +instance, when merging two versions of a program, one wants to make +something like this: + + #ifdef NEW + ...new version of code... + #else /* NEW */ + ...old version of code... + #endif /* NEW */ + +The "x c" command will make such a combined version. (Note that any +combined version is not the same as either the A or B versions, and so +the "a" and "b" commands will refuse to alter it unless they are given +a prefix argument.) The combination is made under control of a +template, which is a character string with the following +interpolations: + + %a the A version of the difference + %b the B version of the difference + %% the character '%' + +Thus, the template used above is + + #ifdef NEW\n%b#else /* NEW */\n%a#endif /* NEW */\n + +(using \n here to represent newlines). The template is stored in the +variable emerge-combine-versions-template, and its initial value is +the one given above. The template can be set (from the current +region) by the "x x" command. (Be careful to get the newlines in the +template in the right places!) ("x x" was chosen by analogy with "C-x +x".) ("x x" is only available in the merge buffer, of course. +Elsewhere, M-x emerge-set-combine-versions-template can be used.) If +"x x" is given a prefix argument, emerge-combine-versions-template is +localized in the merge buffer before its value is set, so the "x x" +command's effect (and the effect of any later "x x" command in the +merge buffer) is only on the merge buffer. + +The "x C" command is like "x c", but it prompts for a character +which is the register whose value is to be used as the template. +This allows one to use multiple templates conveniently. + +- Changing the major mode of the edit buffer (x m) + +The "x m" command prompts for the name of a major-mode-setting command +(such as "c-mode" or "emacs-lisp-mode") and executes it. Ordinarily, +major-mode-setting commands change the mode line and local keymap, so +the "x m" command then resets the Emerge mode line and the fast or +edit mode local keymap, as appropriate. + +If you have already changed the major mode of the merge buffer and +lost the Emerge keymap, you can use M-x emerge-set-merge-mode to +execute this command. + +Beware that "x m" accepts any command name, not just +major-mode-setting commands. + +In order to use "x m", the kill-fix.el package of improvements to the +kill-all-local-variables function must be installed. It can be +obtained from the Emacs Lisp archives by anonymous FTP from file +/pub/gnu/emacs/elisp-archive/as-is/kill-fix.el.Z on +archive.cis.ohio-state.edu. + +- Writing the merge buffer manually + +Emerge places a wrapper (emerge-query-and-call) on the key bindings of +save-buffer (usually "C-x C-s") and write-file (usually "C-x C-w"), in +order to protect the user from writing out the merge before it is +finished. Emerge-query-and-call asks the user if he is sure he wants +to write out the incomplete merge. If he answers yes, the buffer is +written out. The flags are suppressed while the write is being done. +As a result of this, the displayed portions of the buffers are +recentered (equivalent to "l"). + +- Running Emerge standalone + +If you invoke emacs with the following arguments, you can execute +Emerge as a standalone program: + + emacs -l emerge -f emerge-files-command file-a file-b file-out + + emacs -l emerge -f emerge-files-with-ancestor-command + file-a file-b file-ancestor file-out + +When the user gives the "q" (quit) command, Emerge will write out the +merge buffer in file-out and terminate Emacs. If a prefix argument is +given, Emacs will terminate with an unsuccessful return code (1), if +not, it will terminate with a successful return code (0). + +- Invoking Emerge remotely + +If you use the Emacs client/server code that supports remote +execution, then you can invoke Emerge remotely by executing one of the +Lisp calls: + + (emerge-files-remote "file A" "file B" "output file") + + (emerge-files-with-ancestor-remote "file A" "file B" + "ancestor file" "output file") + +Returning a successful/unsuccessful return code is not yet supported +by the Emacs client/server code. + +Beware that in systems of networked workstations, even though all user +directories are shared between all the workstations, the /tmp +directory on each workstation is not shared, so writing files into +/tmp and then remotely invoking Emerge is not likely to work. + +- Effect of merge flags on indenting code + +The presence of the flags confuses the indentation code of C and +Emacs-Lisp modes. Starting the flag strings +(emerge-{before,after}-flag) with '#' (for C) or ';' (for Lisp) +prevents the indentation code from noticing the flags. Remember to +change the flag strings before loading Emerge, or to execute +emerge-new-flags after changing them. But never change the flag +strings while a merge is being performed. + +- Autoloading + +The following autoloads will make all top-level Emerge files +autoloading. Make sure that "emerge" is in a directory on load-path. + +(autoload 'emerge-files "emerge" + "Run Emerge on two files." + t) +(autoload 'emerge-files-with-ancestor "emerge" + "Run Emerge on two files, giving another file as the ancestor." + t) +(autoload 'emerge-buffers "emerge" + "Run Emerge on two buffers." + t) +(autoload 'emerge-buffers-with-ancestor "emerge" + "Run Emerge on two buffers, giving another buffer as the ancestor." + t) +(autoload 'emerge-files-command "emerge") +(autoload 'emerge-files-with-ancestor-command "emerge") +(autoload 'emerge-files-remote "emerge") +(autoload 'emerge-files-with-ancestor-remote "emerge") +(autoload 'emerge-revisions "emerge" + "Emerge two RCS revisions of a file." + t) +(autoload 'emerge-revisions-with-ancestor + "Emerge two RCS revisions of a file, giving another revision as +the ancestor." + t) + +(autoload 'emerge-execute-line "emerge" + "Process the current line. Based on entries found, call emerge correctly +on the files files listed." + t) + +- Use with Ange-FTP + +The Ange-FTP package allows Emacs to access files using FTP much as if +they are local files. However, diff/diff3 cannot access non-local +files, and so Emerge needs to provide additional support if non-local +files are being used. Emerge uses the function emerge-remote-file-p +to test a file name to see whether that file name can be given +directly to diff/diff3. If not, Emerge saves the file contents into a +temporary file, and gives the temporary file name to diff/diff3. The +temporary file is deleted after diff/diff3 is done running. + +The function emerge-remote-file-p by default causes temporary files to +be generated only for files read using Ange-FTP (which are +distinguished via the variable ange-ftp-path-format). If Ange-FTP is +not loaded, it causes no temporary files to be generated. The +function emerge-remote-file-p can be modified for customization. + +- Filenames containing shell metacharacters + +Emerge handles filenames containing shell metacharacters by quoting +them with \ before passing them to the shell. This is normally not a +problem, except that Emacs auto-save files begin with #, which is +normally used to start comments. Which characters are considered +metacharacters is governed by the variable emerge-metachars, whose +default value is suitable when the shell is sh, csh, or compatible +shells. + +- Local variables lists + +Normally, Emerge ignores any local-variables list that is created in +the merge buffer. However, sometimes it may be useful to have a +local-variables list processed. This can be done manually by +executing the function "(hack-local-variables)". If the variable +emerge-process-local-variables is true, when Emerge is started it +will process any local variables list in the newly-created merge +buffer. (If the merge has an ancestor, the selecting of default +versions of differences is done before the local variables list is +processed.) + +- Semi-automatic batching of merges + +If you have a large number of merges to execute, the function +emerge-execute-line can reduce the amount of work. To use it, create +a buffer containing lines that describe the merges to be done. Each +line describes a single merge by means of fields of the form: + + A=file1 + B=file2 + ancestor=file3 + output=file4 + +The fields are seperated by whitespace, and the filenames given should +be absolute, not relative. The buffer's contents can be generated by +a program and read in as a file, or they can be generated by an Emacs +function. (See the sample function emerge-merge-directories, which +produces specifications to merge the entire contents of two +directories, possibly with an ancestor directory and an output +directory.) + +If you position the cursor on one line of the buffer and execute +emerge-execute-line, the information on that line will be read and an +appropriate merge will be started. When the merge is finished (or +aborted), the original buffer will be displayed again, with the cursor +at the beginning of the next line, ready for the next invocation of +emerge-execute-line. In this way, it is easy to start a sequence of +merges that are described by a buffer of specifications. + +To perform a two-way merge, provide an "A" and a "B" field. To +perform a merge with an ancestor file, provide "A", "B", and +"ancestor" fields. In either case, if an "output" field is provided, +the results of a successful merge will be written into the designated +file, just as if a prefix argument had been given to the Emerge +command. + +In addition, emerge-process-line attempts to handle situations where +one of the "A" or "B" fields are missing, showing that one version or +another of the file does not exist. (In all cases, files that are +specified in the "A", "B", or "ancestor" fields must exist. +Non-existent files are specified by omitting the appropriate field.) +The principles governing these cases are: (1) If no "output" file is +specified, it is an error. (2) If an "output" file is specified, then +the "A" or "B" file (whichever is present) is copied into the output +file. (3) If an "ancestor" file is given, it is assumed that the file +in question has been deleted in one or another of the versions, and so +should be deleted from the "merged" version of the files. Case (3) is +sufficiently dangerous that it is only activated if the variable +emerge-execute-line-deletions is set; otherwise case (3) will be +handled as case (2), that is, the one existing version will be copied +to the output file. + +In all cases, the goal is to simplify the usual case of "merging two +directories that contain two versions of a system of software". + +- Merging RCS versions of a file + +You can merge RCS versions of a file using the commands +emerge-revisions and emerge-revisions-with-ancestor. For both +commands, all of the input files are RCS versions of one base file, +which are checked out automatically. If you provide a prefix +argument, upon successful completion the merged file is checked in. + +- Use with Lucid Emacs + +Under Lucid Emacs, Emerge highlights the selected difference rather +that bordering it with character flags. This is probably more +natural, but it has the problem that insertions made at the very ends +of the difference may go either inside or outside of the difference, +at Emacs' discretion. The Lucid features should be disablable by +setting emerge-lucid-p to nil, but that variable is also used to +activate workarounds to bugs in Lucid Emacs, so the user shouldn't +change its value.