Mercurial > emacs
comparison lisp/ediff-util.el @ 20206:f44ff2c52fac
new version
author | Michael Kifer <kifer@cs.stonybrook.edu> |
---|---|
date | Sat, 01 Nov 1997 01:46:51 +0000 |
parents | 9bc6a4017c8c |
children | f7e788ea680b |
comparison
equal
deleted
inserted
replaced
20205:cdaddfc03fe8 | 20206:f44ff2c52fac |
---|---|
176 (define-key ediff-mode-map ">" 'ediff-scroll-horizontally) | 176 (define-key ediff-mode-map ">" 'ediff-scroll-horizontally) |
177 (define-key ediff-mode-map "i" 'ediff-status-info) | 177 (define-key ediff-mode-map "i" 'ediff-status-info) |
178 (define-key ediff-mode-map "E" 'ediff-documentation) | 178 (define-key ediff-mode-map "E" 'ediff-documentation) |
179 (define-key ediff-mode-map "?" 'ediff-toggle-help) | 179 (define-key ediff-mode-map "?" 'ediff-toggle-help) |
180 (define-key ediff-mode-map "!" 'ediff-update-diffs) | 180 (define-key ediff-mode-map "!" 'ediff-update-diffs) |
181 (define-key ediff-mode-map "M" 'ediff-show-meta-buffer) | 181 (define-key ediff-mode-map "M" 'ediff-show-current-session-meta-buffer) |
182 (define-key ediff-mode-map "R" 'ediff-show-registry) | 182 (define-key ediff-mode-map "R" 'ediff-show-registry) |
183 (or ediff-word-mode | 183 (or ediff-word-mode |
184 (define-key ediff-mode-map "*" 'ediff-make-or-kill-fine-diffs)) | 184 (define-key ediff-mode-map "*" 'ediff-make-or-kill-fine-diffs)) |
185 (define-key ediff-mode-map "a" nil) | 185 (define-key ediff-mode-map "a" nil) |
186 (define-key ediff-mode-map "b" nil) | 186 (define-key ediff-mode-map "b" nil) |
249 ;; so other functions can do post-processing SETUP-PARAMETERS is a list of the | 249 ;; so other functions can do post-processing SETUP-PARAMETERS is a list of the |
250 ;; form ((param .val) (param . val)...) This serves a similar purpose to | 250 ;; form ((param .val) (param . val)...) This serves a similar purpose to |
251 ;; STARTUP-HOOKS, but these parameters are set in the new control buffer right | 251 ;; STARTUP-HOOKS, but these parameters are set in the new control buffer right |
252 ;; after this buf is created and before any windows are set and such. | 252 ;; after this buf is created and before any windows are set and such. |
253 (defun ediff-setup (buffer-A file-A buffer-B file-B buffer-C file-C | 253 (defun ediff-setup (buffer-A file-A buffer-B file-B buffer-C file-C |
254 startup-hooks setup-parameters) | 254 startup-hooks setup-parameters |
255 &optional merge-buffer-file) | |
255 ;; ediff-convert-standard-filename puts file names in the form appropriate | 256 ;; ediff-convert-standard-filename puts file names in the form appropriate |
256 ;; for the OS at hand. | 257 ;; for the OS at hand. |
257 (setq file-A (ediff-convert-standard-filename (expand-file-name file-A))) | 258 (setq file-A (ediff-convert-standard-filename (expand-file-name file-A))) |
258 (setq file-B (ediff-convert-standard-filename (expand-file-name file-B))) | 259 (setq file-B (ediff-convert-standard-filename (expand-file-name file-B))) |
259 (if (stringp file-C) | 260 (if (stringp file-C) |
260 (setq file-C | 261 (setq file-C |
261 (ediff-convert-standard-filename (expand-file-name file-C)))) | 262 (ediff-convert-standard-filename (expand-file-name file-C)))) |
263 (if (stringp merge-buffer-file) | |
264 (progn | |
265 (setq merge-buffer-file | |
266 (ediff-convert-standard-filename | |
267 (expand-file-name merge-buffer-file))) | |
268 ;; check the directory exists | |
269 (or (file-exists-p (file-name-directory merge-buffer-file)) | |
270 (error "Directory %s given as place to save the merge doesn't exist." | |
271 (abbreviate-file-name | |
272 (file-name-directory merge-buffer-file)))) | |
273 (if (and (file-exists-p merge-buffer-file) | |
274 (file-directory-p merge-buffer-file)) | |
275 (error "The merge buffer file %s must not be a directory" | |
276 (abbreviate-file-name merge-buffer-file))) | |
277 )) | |
262 (let* ((control-buffer-name | 278 (let* ((control-buffer-name |
263 (ediff-unique-buffer-name "*Ediff Control Panel" "*")) | 279 (ediff-unique-buffer-name "*Ediff Control Panel" "*")) |
264 (control-buffer (ediff-with-current-buffer buffer-A | 280 (control-buffer (ediff-with-current-buffer buffer-A |
265 (get-buffer-create control-buffer-name)))) | 281 (get-buffer-create control-buffer-name)))) |
266 (ediff-with-current-buffer control-buffer | 282 (ediff-with-current-buffer control-buffer |
325 (ediff-unique-buffer-name "*ediff-merge" "*"))) | 341 (ediff-unique-buffer-name "*ediff-merge" "*"))) |
326 (save-excursion | 342 (save-excursion |
327 (set-buffer buffer-C) | 343 (set-buffer buffer-C) |
328 (insert-buffer buf) | 344 (insert-buffer buf) |
329 (funcall (ediff-with-current-buffer buf major-mode)) | 345 (funcall (ediff-with-current-buffer buf major-mode)) |
330 ;; after Stig@hackvan.com | |
331 (add-hook 'local-write-file-hooks 'ediff-set-merge-mode nil t) | 346 (add-hook 'local-write-file-hooks 'ediff-set-merge-mode nil t) |
332 ))) | 347 ))) |
333 (setq buffer-read-only nil | 348 (setq buffer-read-only nil |
334 ediff-buffer-A buffer-A | 349 ediff-buffer-A buffer-A |
335 ediff-buffer-B buffer-B | 350 ediff-buffer-B buffer-B |
487 | 502 |
488 (select-window ediff-control-window) | 503 (select-window ediff-control-window) |
489 (ediff-visible-region) | 504 (ediff-visible-region) |
490 | 505 |
491 (run-hooks 'startup-hooks) | 506 (run-hooks 'startup-hooks) |
507 (ediff-arrange-autosave-in-merge-jobs merge-buffer-file) | |
508 | |
492 (ediff-refresh-mode-lines) | 509 (ediff-refresh-mode-lines) |
493 (setq buffer-read-only t) | 510 (setq buffer-read-only t) |
494 (setq ediff-session-registry | 511 (setq ediff-session-registry |
495 (cons control-buffer ediff-session-registry)) | 512 (cons control-buffer ediff-session-registry)) |
496 (ediff-update-registry) | 513 (ediff-update-registry) |
497 (if (ediff-buffer-live-p ediff-meta-buffer) | 514 (if (ediff-buffer-live-p ediff-meta-buffer) |
498 (ediff-update-meta-buffer ediff-meta-buffer)) | 515 (ediff-update-meta-buffer |
516 ediff-meta-buffer nil ediff-meta-session-number)) | |
499 (run-hooks 'ediff-startup-hook) | 517 (run-hooks 'ediff-startup-hook) |
500 ) ; eval in control-buffer | 518 ) ; eval in control-buffer |
501 control-buffer)) | 519 control-buffer)) |
502 | 520 |
503 | 521 |
534 (if (not (ediff-multiframe-setup-p)) | 552 (if (not (ediff-multiframe-setup-p)) |
535 (ediff-make-bottom-toolbar)) ; this checks if toolbar is requested | 553 (ediff-make-bottom-toolbar)) ; this checks if toolbar is requested |
536 (goto-char (point-min)) | 554 (goto-char (point-min)) |
537 (skip-chars-forward ediff-whitespace))) | 555 (skip-chars-forward ediff-whitespace))) |
538 | 556 |
539 | 557 ;; This executes in control buffer and sets auto-save, visited file name, etc, |
558 ;; in the merge buffer | |
559 (defun ediff-arrange-autosave-in-merge-jobs (merge-buffer-file) | |
560 (if (not ediff-merge-job) | |
561 () | |
562 (if (stringp merge-buffer-file) | |
563 (setq ediff-autostore-merges t | |
564 ediff-merge-store-file merge-buffer-file)) | |
565 (if (stringp ediff-merge-store-file) | |
566 (progn | |
567 ;; save before leaving ctl buffer | |
568 (setq merge-buffer-file ediff-merge-store-file) | |
569 (ediff-with-current-buffer ediff-buffer-C | |
570 (set-visited-file-name merge-buffer-file)))) | |
571 (ediff-with-current-buffer ediff-buffer-C | |
572 (setq buffer-offer-save t) ; ask before killing buffer | |
573 ;; make sure the contents is auto-saved | |
574 (auto-save-mode 1)) | |
575 )) | |
540 | 576 |
541 | 577 |
542 ;;; Commands for working with Ediff | 578 ;;; Commands for working with Ediff |
543 | 579 |
544 (defun ediff-update-diffs () | 580 (defun ediff-update-diffs () |
1328 'B ediff-visible-bounds)) | 1364 'B ediff-visible-bounds)) |
1329 (overl-C (ediff-get-value-according-to-buffer-type | 1365 (overl-C (ediff-get-value-according-to-buffer-type |
1330 'C ediff-visible-bounds)) | 1366 'C ediff-visible-bounds)) |
1331 ) | 1367 ) |
1332 (ediff-with-current-buffer ediff-buffer-A | 1368 (ediff-with-current-buffer ediff-buffer-A |
1333 (narrow-to-region | 1369 (if (ediff-overlay-buffer overl-A) |
1334 (ediff-overlay-start overl-A) (ediff-overlay-end overl-A))) | 1370 (narrow-to-region |
1371 (ediff-overlay-start overl-A) (ediff-overlay-end overl-A)))) | |
1335 (ediff-with-current-buffer ediff-buffer-B | 1372 (ediff-with-current-buffer ediff-buffer-B |
1336 (narrow-to-region | 1373 (if (ediff-overlay-buffer overl-B) |
1337 (ediff-overlay-start overl-B) (ediff-overlay-end overl-B))) | 1374 (narrow-to-region |
1375 (ediff-overlay-start overl-B) (ediff-overlay-end overl-B)))) | |
1338 | 1376 |
1339 (if ediff-3way-job | 1377 (if (and ediff-3way-job (ediff-overlay-buffer overl-C)) |
1340 (ediff-with-current-buffer ediff-buffer-C | 1378 (ediff-with-current-buffer ediff-buffer-C |
1341 (narrow-to-region | 1379 (narrow-to-region |
1342 (ediff-overlay-start overl-C) (ediff-overlay-end overl-C)))) | 1380 (ediff-overlay-start overl-C) (ediff-overlay-end overl-C)))) |
1343 ))) | 1381 ))) |
1344 | 1382 |
2289 ediff-narrow-bounds) | 2327 ediff-narrow-bounds) |
2290 | 2328 |
2291 ;; restore buffer mode line id's in buffer-A/B/C | 2329 ;; restore buffer mode line id's in buffer-A/B/C |
2292 (let ((control-buffer ediff-control-buffer) | 2330 (let ((control-buffer ediff-control-buffer) |
2293 (meta-buffer ediff-meta-buffer) | 2331 (meta-buffer ediff-meta-buffer) |
2332 (session-number ediff-meta-session-number) | |
2294 ;; suitable working frame | 2333 ;; suitable working frame |
2295 (warp-frame (if (and (ediff-window-display-p) (eq ediff-grab-mouse t)) | 2334 (warp-frame (if (and (ediff-window-display-p) (eq ediff-grab-mouse t)) |
2296 (cond ((window-live-p ediff-window-A) | 2335 (cond ((window-live-p ediff-window-A) |
2297 (window-frame ediff-window-A)) | 2336 (window-frame ediff-window-A)) |
2298 ((window-live-p ediff-window-B) | 2337 ((window-live-p ediff-window-B) |
2353 (if reverse-default-keep-variants | 2392 (if reverse-default-keep-variants |
2354 (setq ediff-keep-variants (not ediff-keep-variants))) | 2393 (setq ediff-keep-variants (not ediff-keep-variants))) |
2355 (or ediff-keep-variants (ediff-janitor 'ask))) | 2394 (or ediff-keep-variants (ediff-janitor 'ask))) |
2356 | 2395 |
2357 (run-hooks 'ediff-quit-hook) | 2396 (run-hooks 'ediff-quit-hook) |
2358 (ediff-cleanup-meta-buffer meta-buffer) | 2397 (ediff-update-meta-buffer meta-buffer nil session-number) |
2359 | 2398 |
2360 ;; warp mouse into a working window | 2399 ;; warp mouse into a working window |
2361 (setq warp-frame ; if mouse is over a reasonable frame, use it | 2400 (setq warp-frame ; if mouse is over a reasonable frame, use it |
2362 (cond ((ediff-good-frame-under-mouse)) | 2401 (cond ((ediff-good-frame-under-mouse)) |
2363 (t warp-frame))) | 2402 (t warp-frame))) |
2366 warp-frame | 2405 warp-frame |
2367 (frame-selected-window warp-frame)) | 2406 (frame-selected-window warp-frame)) |
2368 2 1)) | 2407 2 1)) |
2369 | 2408 |
2370 (if (ediff-buffer-live-p meta-buffer) | 2409 (if (ediff-buffer-live-p meta-buffer) |
2371 (ediff-show-meta-buffer meta-buffer)) | 2410 (ediff-show-meta-buffer meta-buffer session-number)) |
2372 )) | 2411 )) |
2373 | 2412 |
2374 ;; Returns frame under mouse, if this frame is not a minibuffer | 2413 ;; Returns frame under mouse, if this frame is not a minibuffer |
2375 ;; frame. Otherwise: nil | 2414 ;; frame. Otherwise: nil |
2376 (defun ediff-good-frame-under-mouse () | 2415 (defun ediff-good-frame-under-mouse () |
2389 nil | 2428 nil |
2390 frame))) | 2429 frame))) |
2391 | 2430 |
2392 | 2431 |
2393 (defun ediff-delete-temp-files () | 2432 (defun ediff-delete-temp-files () |
2394 (if (stringp ediff-temp-file-A) | 2433 (if (and (stringp ediff-temp-file-A) (file-exists-p ediff-temp-file-A)) |
2395 (delete-file ediff-temp-file-A)) | 2434 (delete-file ediff-temp-file-A)) |
2396 (if (stringp ediff-temp-file-B) | 2435 (if (and (stringp ediff-temp-file-B) (file-exists-p ediff-temp-file-B)) |
2397 (delete-file ediff-temp-file-B)) | 2436 (delete-file ediff-temp-file-B)) |
2398 (if (stringp ediff-temp-file-C) | 2437 (if (and (stringp ediff-temp-file-C) (file-exists-p ediff-temp-file-C)) |
2399 (delete-file ediff-temp-file-C))) | 2438 (delete-file ediff-temp-file-C))) |
2400 | 2439 |
2401 | 2440 |
2402 ;; Kill control buffer, other auxiliary Ediff buffers. | 2441 ;; Kill control buffer, other auxiliary Ediff buffers. |
2403 ;; Leave one of the frames split between buffers A/B/C | 2442 ;; Leave one of the frames split between buffers A/B/C |
2536 (progn | 2575 (progn |
2537 (write-region (point-min) (point-max) file) | 2576 (write-region (point-min) (point-max) file) |
2538 (if show-file | 2577 (if show-file |
2539 (progn | 2578 (progn |
2540 (message "Merge buffer saved in: %s" file) | 2579 (message "Merge buffer saved in: %s" file) |
2580 (set-buffer-modified-p nil) | |
2541 (sit-for 2))) | 2581 (sit-for 2))) |
2542 (if (and | 2582 (if (and |
2543 (not save-and-continue) | 2583 (not save-and-continue) |
2544 (y-or-n-p "Merge buffer saved in file. Now kill the buffer? ")) | 2584 (y-or-n-p "Merge buffer saved in file. Now kill the buffer? ")) |
2545 (ediff-kill-buffer-carefully buf)))))) | 2585 (ediff-kill-buffer-carefully buf)))))) |