|
|
1.1 ! root 1: ;;; Missing: P command, sorting, setting file modes. ! 2: ;;; Dired buffer containing multiple directories gets totally confused ! 3: ;;; Implement insertion of subdirectories in situ --- tree dired ! 4: ! 5: ;; DIRED commands for Emacs ! 6: ;; Copyright (C) 1985, 1986 Free Software Foundation, Inc. ! 7: ! 8: ;; This file is part of GNU Emacs. ! 9: ! 10: ;; GNU Emacs is free software; you can redistribute it and/or modify ! 11: ;; it under the terms of the GNU General Public License as published by ! 12: ;; the Free Software Foundation; either version 1, or (at your option) ! 13: ;; any later version. ! 14: ! 15: ;; GNU Emacs is distributed in the hope that it will be useful, ! 16: ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ! 17: ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ! 18: ;; GNU General Public License for more details. ! 19: ! 20: ;; You should have received a copy of the GNU General Public License ! 21: ;; along with GNU Emacs; see the file COPYING. If not, write to ! 22: ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. ! 23: ! 24: ! 25: ;In loaddefs.el ! 26: ;(defvar dired-listing-switches "-al" ! 27: ; "Switches passed to ls for dired. MUST contain the 'l' option. ! 28: ;CANNOT contain the 'F' option.") ! 29: ! 30: (defun dired-readin (dirname buffer) ! 31: (save-excursion ! 32: (message "Reading directory %s..." dirname) ! 33: (set-buffer buffer) ! 34: (let ((buffer-read-only nil)) ! 35: (widen) ! 36: (erase-buffer) ! 37: (setq dirname (expand-file-name dirname)) ! 38: (if (file-directory-p dirname) ! 39: (call-process "ls" nil buffer nil ! 40: dired-listing-switches dirname) ! 41: (let ((default-directory (file-name-directory dirname))) ! 42: (call-process shell-file-name nil buffer nil ! 43: "-c" (concat "ls " dired-listing-switches " " ! 44: (file-name-nondirectory dirname))))) ! 45: (goto-char (point-min)) ! 46: (while (not (eobp)) ! 47: (insert " ") ! 48: (forward-line 1)) ! 49: (goto-char (point-min))) ! 50: (set-buffer-modified-p nil) ! 51: (message "Reading directory %s...done" dirname))) ! 52: ! 53: (defun dired-find-buffer (dirname) ! 54: (let ((blist (buffer-list)) ! 55: found) ! 56: (while blist ! 57: (save-excursion ! 58: (set-buffer (car blist)) ! 59: (if (and (eq major-mode 'dired-mode) ! 60: (equal dired-directory dirname)) ! 61: (setq found (car blist) ! 62: blist nil) ! 63: (setq blist (cdr blist))))) ! 64: (or found ! 65: (create-file-buffer (directory-file-name dirname))))) ! 66: ! 67: (defun dired (dirname) ! 68: "\"Edit\" directory DIRNAME--delete, rename, print, etc. some files in it. ! 69: Dired displays a list of files in DIRNAME. ! 70: You can move around in it with the usual commands. ! 71: You can flag files for deletion with C-d ! 72: and then delete them by typing `x'. ! 73: Type `h' after entering dired for more info." ! 74: (interactive (list (read-file-name "Dired (directory): " ! 75: nil default-directory nil))) ! 76: (switch-to-buffer (dired-noselect dirname))) ! 77: ! 78: (defun dired-other-window (dirname) ! 79: "\"Edit\" directory DIRNAME. Like M-x dired but selects in another window." ! 80: (interactive (list (read-file-name "Dired in other window (directory): " ! 81: nil default-directory nil))) ! 82: (switch-to-buffer-other-window (dired-noselect dirname))) ! 83: ! 84: (defun dired-noselect (dirname) ! 85: "Like M-x dired but returns the dired buffer as value, does not select it." ! 86: (or dirname (setq dirname default-directory)) ! 87: (setq dirname (expand-file-name (directory-file-name dirname))) ! 88: (if (file-directory-p dirname) ! 89: (setq dirname (file-name-as-directory dirname))) ! 90: (let ((buffer (dired-find-buffer dirname))) ! 91: (save-excursion ! 92: (set-buffer buffer) ! 93: (dired-readin dirname buffer) ! 94: (dired-move-to-filename) ! 95: (dired-mode dirname)) ! 96: buffer)) ! 97: ! 98: (defun dired-revert (&optional arg noconfirm) ! 99: (let ((opoint (point)) ! 100: (ofile (dired-get-filename t t)) ! 101: (buffer-read-only nil)) ! 102: (erase-buffer) ! 103: (dired-readin dired-directory (current-buffer)) ! 104: (or (and ofile (re-search-forward (concat " " (regexp-quote ofile) "$") ! 105: nil t)) ! 106: (goto-char opoint)) ! 107: (beginning-of-line))) ! 108: ! 109: (defvar dired-mode-map nil "Local keymap for dired-mode buffers.") ! 110: (if dired-mode-map ! 111: nil ! 112: (setq dired-mode-map (make-keymap)) ! 113: (suppress-keymap dired-mode-map) ! 114: (define-key dired-mode-map "r" 'dired-rename-file) ! 115: (define-key dired-mode-map "\C-d" 'dired-flag-file-deleted) ! 116: (define-key dired-mode-map "d" 'dired-flag-file-deleted) ! 117: (define-key dired-mode-map "v" 'dired-view-file) ! 118: (define-key dired-mode-map "e" 'dired-find-file) ! 119: (define-key dired-mode-map "f" 'dired-find-file) ! 120: (define-key dired-mode-map "o" 'dired-find-file-other-window) ! 121: (define-key dired-mode-map "u" 'dired-unflag) ! 122: (define-key dired-mode-map "x" 'dired-do-deletions) ! 123: (define-key dired-mode-map "\177" 'dired-backup-unflag) ! 124: (define-key dired-mode-map "?" 'dired-summary) ! 125: (define-key dired-mode-map "c" 'dired-copy-file) ! 126: (define-key dired-mode-map "#" 'dired-flag-auto-save-files) ! 127: (define-key dired-mode-map "~" 'dired-flag-backup-files) ! 128: (define-key dired-mode-map "." 'dired-clean-directory) ! 129: (define-key dired-mode-map "h" 'describe-mode) ! 130: (define-key dired-mode-map " " 'dired-next-line) ! 131: (define-key dired-mode-map "\C-n" 'dired-next-line) ! 132: (define-key dired-mode-map "\C-p" 'dired-previous-line) ! 133: (define-key dired-mode-map "n" 'dired-next-line) ! 134: (define-key dired-mode-map "p" 'dired-previous-line) ! 135: (define-key dired-mode-map "g" 'revert-buffer) ! 136: (define-key dired-mode-map "C" 'dired-compress) ! 137: (define-key dired-mode-map "U" 'dired-uncompress) ! 138: (define-key dired-mode-map "B" 'dired-byte-recompile) ! 139: (define-key dired-mode-map "M" 'dired-chmod) ! 140: (define-key dired-mode-map "G" 'dired-chgrp) ! 141: (define-key dired-mode-map "O" 'dired-chown)) ! 142: ! 143: ! 144: ;; Dired mode is suitable only for specially formatted data. ! 145: (put 'dired-mode 'mode-class 'special) ! 146: ! 147: (defun dired-mode (&optional dirname) ! 148: "Mode for \"editing\" directory listings. ! 149: In dired, you are \"editing\" a list of the files in a directory. ! 150: You can move using the usual cursor motion commands. ! 151: Letters no longer insert themselves. ! 152: Instead, type d to flag a file for Deletion. ! 153: Type u to Unflag a file (remove its D flag). ! 154: Type Rubout to back up one line and unflag. ! 155: Type x to eXecute the deletions requested. ! 156: Type f to Find the current line's file ! 157: (or Dired it, if it is a directory). ! 158: Type o to find file or dired directory in Other window. ! 159: Type # to flag temporary files (names beginning with #) for Deletion. ! 160: Type ~ to flag backup files (names ending with ~) for Deletion. ! 161: Type . to flag numerical backups for Deletion. ! 162: (Spares dired-kept-versions or its numeric argument.) ! 163: Type r to rename a file. ! 164: Type c to copy a file. ! 165: Type v to view a file in View mode, returning to Dired when done. ! 166: Type g to read the directory again. This discards all deletion-flags. ! 167: Space and Rubout can be used to move down and up by lines. ! 168: Also: C -- compress this file. U -- uncompress this file. ! 169: B -- byte compile this file. ! 170: M, G, O -- change file's mode, group or owner. ! 171: \\{dired-mode-map}" ! 172: (interactive) ! 173: (kill-all-local-variables) ! 174: (make-local-variable 'revert-buffer-function) ! 175: (setq revert-buffer-function 'dired-revert) ! 176: (setq major-mode 'dired-mode) ! 177: (setq mode-name "Dired") ! 178: (make-local-variable 'dired-directory) ! 179: (setq dired-directory (or dirname default-directory)) ! 180: (if dirname ! 181: (setq default-directory ! 182: (if (file-directory-p dirname) ! 183: dirname (file-name-directory dirname)))) ! 184: (setq mode-line-buffer-identification '("Dired: %17b")) ! 185: (setq case-fold-search nil) ! 186: (setq buffer-read-only t) ! 187: (use-local-map dired-mode-map) ! 188: (run-hooks 'dired-mode-hook)) ! 189: ! 190: (defun dired-repeat-over-lines (arg function) ! 191: (beginning-of-line) ! 192: (while (and (> arg 0) (not (eobp))) ! 193: (setq arg (1- arg)) ! 194: (save-excursion ! 195: (beginning-of-line) ! 196: (and (bobp) (looking-at " total") ! 197: (error "No file on this line")) ! 198: (funcall function)) ! 199: (forward-line 1) ! 200: (dired-move-to-filename)) ! 201: (while (and (< arg 0) (not (bobp))) ! 202: (setq arg (1+ arg)) ! 203: (forward-line -1) ! 204: (dired-move-to-filename) ! 205: (save-excursion ! 206: (beginning-of-line) ! 207: (funcall function)))) ! 208: ! 209: (defun dired-flag-file-deleted (arg) ! 210: "In dired, flag the current line's file for deletion. ! 211: With arg, repeat over several lines." ! 212: (interactive "p") ! 213: (dired-repeat-over-lines arg ! 214: '(lambda () ! 215: (let ((buffer-read-only nil)) ! 216: (delete-char 1) ! 217: (insert "D"))))) ! 218: ! 219: (defun dired-summary () ! 220: (interactive) ! 221: ;>> this should check the key-bindings and use substitute-command-keys if non-standard ! 222: (message ! 223: "d-elete, u-ndelete, x-ecute, f-ind, o-ther window, r-ename, c-opy, v-iew")) ! 224: ! 225: (defun dired-unflag (arg) ! 226: "In dired, remove the current line's delete flag then move to next line." ! 227: (interactive "p") ! 228: (dired-repeat-over-lines arg ! 229: '(lambda () ! 230: (let ((buffer-read-only nil)) ! 231: (delete-char 1) ! 232: (insert " ") ! 233: (forward-char -1))))) ! 234: ! 235: (defun dired-backup-unflag (arg) ! 236: "In dired, move up a line and remove deletion flag there." ! 237: (interactive "p") ! 238: (dired-unflag (- arg))) ! 239: ! 240: (defun dired-next-line (arg) ! 241: "Move down ARG lines then position at filename." ! 242: (interactive "p") ! 243: (next-line arg) ! 244: (dired-move-to-filename)) ! 245: ! 246: (defun dired-previous-line (arg) ! 247: "Move up ARG lines then position at filename." ! 248: (interactive "p") ! 249: (previous-line arg) ! 250: (dired-move-to-filename)) ! 251: ! 252: (defun dired-find-file () ! 253: "In dired, visit the file or directory named on this line." ! 254: (interactive) ! 255: (find-file (dired-get-filename))) ! 256: ! 257: (defun dired-view-file () ! 258: "In dired, examine a file in view mode, returning to dired when done." ! 259: (interactive) ! 260: (if (file-directory-p (dired-get-filename)) ! 261: (dired (dired-get-filename)) ! 262: (view-file (dired-get-filename)))) ! 263: ! 264: (defun dired-find-file-other-window () ! 265: "In dired, visit this file or directory in another window." ! 266: (interactive) ! 267: (find-file-other-window (dired-get-filename))) ! 268: ! 269: (defun dired-get-filename (&optional localp no-error-if-not-filep) ! 270: "In dired, return name of file mentioned on this line. ! 271: Value returned normally includes the directory name. ! 272: A non-nil 1st argument means do not include it. A non-nil 2nd argument ! 273: says return nil if no filename on this line, otherwise an error occurs." ! 274: (let (eol) ! 275: (save-excursion ! 276: (end-of-line) ! 277: (setq eol (point)) ! 278: (beginning-of-line) ! 279: (if (re-search-forward ! 280: "\\(Jan\\|Feb\\|Mar\\|Apr\\|May\\|Jun\\|Jul\\|Aug\\|Sep\\|Oct\\|Nov\\|Dec\\)[ ]+[0-9]+" ! 281: eol t) ! 282: (progn (skip-chars-forward " ") ! 283: (skip-chars-forward "^ " eol) ! 284: (skip-chars-forward " " eol) ! 285: (let ((beg (point))) ! 286: (skip-chars-forward "^ \n") ! 287: (if localp ! 288: (buffer-substring beg (point)) ! 289: ;; >> uses default-directory, could lose on cd, multiple. ! 290: (concat default-directory (buffer-substring beg (point)))))) ! 291: (if no-error-if-not-filep nil ! 292: (error "No file on this line")))))) ! 293: ! 294: (defun dired-move-to-filename () ! 295: "In dired, move to first char of filename on this line. ! 296: Returns position (point) or nil if no filename on this line." ! 297: (let ((eol (progn (end-of-line) (point)))) ! 298: (beginning-of-line) ! 299: (if (re-search-forward ! 300: "\\(Jan\\|Feb\\|Mar\\|Apr\\|May\\|Jun\\|Jul\\|Aug\\|Sep\\|Oct\\|Nov\\|Dec\\)[ ]+[0-9]+" ! 301: eol t) ! 302: (progn ! 303: (skip-chars-forward " ") ! 304: (skip-chars-forward "^ " eol) ! 305: (skip-chars-forward " " eol) ! 306: (point))))) ! 307: ! 308: (defun dired-map-dired-file-lines (fn) ! 309: "perform fn with point at the end of each non-directory line: ! 310: arguments are the short and long filename" ! 311: (save-excursion ! 312: (let (filename longfilename (buffer-read-only nil)) ! 313: (goto-char (point-min)) ! 314: (while (not (eobp)) ! 315: (save-excursion ! 316: (and (not (looking-at " d")) ! 317: (not (eolp)) ! 318: (setq filename (dired-get-filename t t) ! 319: longfilename (dired-get-filename nil t)) ! 320: (progn (end-of-line) ! 321: (funcall fn filename longfilename)))) ! 322: (forward-line 1))))) ! 323: ! 324: (defun dired-flag-auto-save-files () ! 325: "Flag for deletion files whose names suggest they are auto save files." ! 326: (interactive) ! 327: (save-excursion ! 328: (let ((buffer-read-only nil)) ! 329: (goto-char (point-min)) ! 330: (while (not (eobp)) ! 331: (and (not (looking-at " d")) ! 332: (not (eolp)) ! 333: (if (fboundp 'auto-save-file-name-p) ! 334: (let ((fn (dired-get-filename t t))) ! 335: (if fn (auto-save-file-name-p fn))) ! 336: (if (dired-move-to-filename) ! 337: (looking-at "#"))) ! 338: (progn (beginning-of-line) ! 339: (delete-char 1) ! 340: (insert "D"))) ! 341: (forward-line 1))))) ! 342: ! 343: (defun dired-clean-directory (keep) ! 344: "Flag numerical backups for Deletion. ! 345: Spares dired-kept-versions latest versions, and kept-old-versions oldest. ! 346: Positive numeric arg overrides dired-kept-versions; ! 347: negative numeric arg overrides kept-old-versions with minus the arg." ! 348: (interactive "P") ! 349: (setq keep (if keep (prefix-numeric-value keep) dired-kept-versions)) ! 350: (let ((early-retention (if (< keep 0) (- keep) kept-old-versions)) ! 351: (late-retention (if (<= keep 0) dired-kept-versions keep)) ! 352: (file-version-assoc-list ())) ! 353: ;; Look at each file. ! 354: ;; If the file has numeric backup versions, ! 355: ;; put on file-version-assoc-list an element of the form ! 356: ;; (FILENAME . VERSION-NUMBER-LIST) ! 357: (dired-map-dired-file-lines 'dired-collect-file-versions) ! 358: ;; Sort each VERSION-NUMBER-LIST, ! 359: ;; and remove the versions not to be deleted. ! 360: (let ((fval file-version-assoc-list)) ! 361: (while fval ! 362: (let* ((sorted-v-list (cons 'q (sort (cdr (car fval)) '<))) ! 363: (v-count (length sorted-v-list))) ! 364: (if (> v-count (+ early-retention late-retention)) ! 365: (rplacd (nthcdr early-retention sorted-v-list) ! 366: (nthcdr (- v-count late-retention) ! 367: sorted-v-list))) ! 368: (rplacd (car fval) ! 369: (cdr sorted-v-list))) ! 370: (setq fval (cdr fval)))) ! 371: ;; Look at each file. If it is a numeric backup file, ! 372: ;; find it in a VERSION-NUMBER-LIST and maybe flag it for deletion. ! 373: (dired-map-dired-file-lines 'dired-trample-file-versions))) ! 374: ! 375: (defun dired-collect-file-versions (ignore fn) ! 376: "If it looks like fn has versions, we make a list of the versions. ! 377: We may want to flag some for deletion." ! 378: (let* ((base-versions ! 379: (concat (file-name-nondirectory fn) ".~")) ! 380: (bv-length (length base-versions)) ! 381: (possibilities (file-name-all-completions ! 382: base-versions ! 383: (file-name-directory fn))) ! 384: (versions (mapcar 'backup-extract-version possibilities))) ! 385: (if versions ! 386: (setq file-version-assoc-list (cons (cons fn versions) ! 387: file-version-assoc-list))))) ! 388: ! 389: (defun dired-trample-file-versions (ignore fn) ! 390: (let* ((start-vn (string-match "\\.~[0-9]+~$" fn)) ! 391: base-version-list) ! 392: (and start-vn ! 393: (setq base-version-list ; there was a base version to which ! 394: (assoc (substring fn 0 start-vn) ; this looks like a ! 395: file-version-assoc-list)) ; subversion ! 396: (not (memq (string-to-int (substring fn (+ 2 start-vn))) ! 397: base-version-list)) ; this one doesn't make the cut ! 398: (dired-flag-this-line-for-DEATH)))) ! 399: ! 400: (defun dired-flag-this-line-for-DEATH () ! 401: (beginning-of-line) ! 402: (delete-char 1) ! 403: (insert "D")) ! 404: ! 405: (defun dired-flag-backup-files () ! 406: "Flag all backup files (names ending with ~) for deletion." ! 407: (interactive) ! 408: (save-excursion ! 409: (let ((buffer-read-only nil)) ! 410: (goto-char (point-min)) ! 411: (while (not (eobp)) ! 412: (and (not (looking-at " d")) ! 413: (not (eolp)) ! 414: (if (fboundp 'backup-file-name-p) ! 415: (let ((fn (dired-get-filename t t))) ! 416: (if fn (backup-file-name-p fn))) ! 417: (end-of-line) ! 418: (forward-char -1) ! 419: (looking-at "~")) ! 420: (progn (beginning-of-line) ! 421: (delete-char 1) ! 422: (insert "D"))) ! 423: (forward-line 1))))) ! 424: ! 425: (defun dired-flag-backup-and-auto-save-files () ! 426: "Flag all backup and temporary files for deletion. ! 427: Backup files have names ending in ~. Auto save file names usually ! 428: start with #." ! 429: (interactive) ! 430: (dired-flag-backup-files) ! 431: (dired-flag-auto-save-files)) ! 432: ! 433: (defun dired-rename-file (to-file) ! 434: "Rename this file to TO-FILE." ! 435: (interactive ! 436: (list (read-file-name (format "Rename %s to: " ! 437: (file-name-nondirectory (dired-get-filename))) ! 438: nil (dired-get-filename)))) ! 439: (setq to-file (expand-file-name to-file)) ! 440: (rename-file (dired-get-filename) to-file) ! 441: (let ((buffer-read-only nil)) ! 442: (beginning-of-line) ! 443: (delete-region (point) (progn (forward-line 1) (point))) ! 444: (setq to-file (expand-file-name to-file)) ! 445: (dired-add-entry (file-name-directory to-file) ! 446: (file-name-nondirectory to-file)))) ! 447: ! 448: (defun dired-copy-file (to-file) ! 449: "Copy this file to TO-FILE." ! 450: (interactive "FCopy to: ") ! 451: (copy-file (dired-get-filename) to-file) ! 452: (setq to-file (expand-file-name to-file)) ! 453: (dired-add-entry (file-name-directory to-file) ! 454: (file-name-nondirectory to-file))) ! 455: ! 456: (defun dired-add-entry (directory filename) ! 457: ;; If tree dired is implemented, this function will have to do ! 458: ;; something smarter with the directory. Currently, just check ! 459: ;; default directory, if same, add the new entry at point. With tree ! 460: ;; dired, should call 'dired-current-directory' or similar. Note ! 461: ;; that this adds the entry 'out of order' if files sorted by time, ! 462: ;; etc. ! 463: (if (string-equal directory default-directory) ! 464: (let ((buffer-read-only nil)) ! 465: (beginning-of-line) ! 466: (call-process "ls" nil t nil ! 467: "-d" dired-listing-switches (concat directory filename)) ! 468: (forward-line -1) ! 469: (insert " ") ! 470: (dired-move-to-filename) ! 471: (let* ((beg (point)) ! 472: (end (progn (end-of-line) (point)))) ! 473: (setq filename (buffer-substring beg end)) ! 474: (delete-region beg end) ! 475: (insert (file-name-nondirectory filename))) ! 476: (beginning-of-line)))) ! 477: ! 478: (defun dired-compress () ! 479: "Compress this file." ! 480: (interactive) ! 481: (let* ((buffer-read-only nil) ! 482: (error-buffer (get-buffer-create " *Dired compress output*")) ! 483: (from-file (dired-get-filename)) ! 484: (to-file (concat from-file ".Z"))) ! 485: (if (string-match "\\.Z$" from-file) ! 486: (error "%s is already compressed!" from-file)) ! 487: (message "Compressing %s..." from-file) ! 488: (unwind-protect ! 489: (progn ! 490: (save-excursion ! 491: (set-buffer error-buffer) ! 492: (erase-buffer)) ! 493: ;; Must have default-directory of dired buffer in call-process ! 494: (call-process "compress" nil error-buffer nil "-f" from-file) ! 495: (if (save-excursion ! 496: (set-buffer error-buffer) ! 497: (= 0 (buffer-size))) ! 498: (progn ! 499: (message "Compressing %s... done" from-file) ! 500: (kill-buffer error-buffer)) ! 501: (display-buffer error-buffer) ! 502: (setq error-buffer nil) ! 503: (error "Compress error on %s." from-file))) ! 504: (if error-buffer (kill-buffer error-buffer))) ! 505: (dired-redisplay to-file))) ! 506: ! 507: (defun dired-uncompress () ! 508: "Uncompress this file." ! 509: (interactive) ! 510: (let* ((buffer-read-only nil) ! 511: (error-buffer (get-buffer-create " *Dired compress output*")) ! 512: (from-file (dired-get-filename)) ! 513: (to-file (substring from-file 0 -2))) ! 514: (if (string-match "\\.Z$" from-file) nil ! 515: (error "%s is not compressed!" from-file)) ! 516: (message "Uncompressing %s..." from-file) ! 517: (unwind-protect ! 518: (progn ! 519: (save-excursion ! 520: (set-buffer error-buffer) ! 521: (erase-buffer)) ! 522: ;; Must have default-directory of dired buffer in call-process ! 523: (call-process "uncompress" nil error-buffer nil "-f" from-file) ! 524: (if (save-excursion ! 525: (set-buffer error-buffer) ! 526: (= 0 (buffer-size))) ! 527: (progn ! 528: (message "Uncompressing %s... done" from-file) ! 529: (kill-buffer error-buffer)) ! 530: (display-buffer error-buffer) ! 531: (setq error-buffer nil) ! 532: (error "Uncompress error on %s." from-file))) ! 533: (if error-buffer (kill-buffer error-buffer))) ! 534: (dired-redisplay to-file))) ! 535: ! 536: (defun dired-byte-recompile () ! 537: "Byte recompile this file." ! 538: (interactive) ! 539: (let* ((buffer-read-only nil) ! 540: (from-file (dired-get-filename)) ! 541: (to-file (substring from-file 0 -3))) ! 542: (if (string-match "\\.el$" from-file) nil ! 543: (error "%s is uncompilable!" from-file)) ! 544: (byte-compile-file from-file))) ! 545: ! 546: (defun dired-chmod (mode) ! 547: "Change mode of this file." ! 548: (interactive "sChange to Mode: ") ! 549: (let ((buffer-read-only nil) ! 550: (file (dired-get-filename))) ! 551: (call-process "/bin/chmod" nil nil nil mode file) ! 552: (dired-redisplay file))) ! 553: ! 554: (defun dired-chgrp (group) ! 555: "Change group of this file." ! 556: (interactive "sChange to Group: ") ! 557: (let ((buffer-read-only nil) ! 558: (file (dired-get-filename))) ! 559: (call-process "/bin/chgrp" nil nil nil group file) ! 560: (dired-redisplay file))) ! 561: ! 562: (defun dired-chown (owner) ! 563: "Change Owner of this file." ! 564: (interactive "sChange to Owner: ") ! 565: (let ((buffer-read-only nil) ! 566: (file (dired-get-filename))) ! 567: (call-process (if (memq system-type '(hpux usg-unix-v silicon-graphics-unix)) ! 568: "/bin/chown" "/etc/chown") ! 569: nil nil nil owner file) ! 570: (dired-redisplay file))) ! 571: ! 572: (defun dired-redisplay (file) "Redisplay this line." ! 573: (beginning-of-line) ! 574: (delete-region (point) (progn (forward-line 1) (point))) ! 575: (if file (dired-add-entry (file-name-directory file) ! 576: (file-name-nondirectory file))) ! 577: (dired-move-to-filename)) ! 578: ! 579: (defun dired-do-deletions () ! 580: "In dired, delete the files flagged for deletion." ! 581: (interactive) ! 582: (let (delete-list answer) ! 583: (save-excursion ! 584: (goto-char 1) ! 585: (while (re-search-forward "^D" nil t) ! 586: (setq delete-list ! 587: (cons (cons (dired-get-filename t) (1- (point))) ! 588: delete-list)))) ! 589: (if (null delete-list) ! 590: (message "(No deletions requested)") ! 591: (save-window-excursion ! 592: (switch-to-buffer " *Deletions*") ! 593: (erase-buffer) ! 594: (setq fill-column 70) ! 595: (let ((l (reverse delete-list))) ! 596: ;; Files should be in forward order for this loop. ! 597: (while l ! 598: (if (> (current-column) 59) ! 599: (insert ?\n) ! 600: (or (bobp) ! 601: (indent-to (* (/ (+ (current-column) 19) 20) 20) 1))) ! 602: (insert (car (car l))) ! 603: (setq l (cdr l)))) ! 604: (goto-char (point-min)) ! 605: (setq answer (yes-or-no-p "Delete these files? "))) ! 606: (if answer ! 607: (let ((l delete-list) ! 608: failures) ! 609: ;; Files better be in reverse order for this loop! ! 610: ;; That way as changes are made in the buffer ! 611: ;; they do not shift the lines still to be changed. ! 612: (while l ! 613: (goto-char (cdr (car l))) ! 614: (let ((buffer-read-only nil)) ! 615: (condition-case () ! 616: (let ((fn (concat default-directory (car (car l))))) ! 617: (if (file-directory-p fn) ! 618: ;; This used to call delete-file if rmdir ! 619: ;; did not delete the file, ! 620: ;; but that made it too easy for root to spaz. ! 621: (call-process "rmdir" nil nil nil fn) ! 622: (delete-file fn)) ! 623: (delete-region (point) ! 624: (progn (forward-line 1) (point)))) ! 625: (error (delete-char 1) ! 626: (insert " ") ! 627: (setq failures (cons (car (car l)) failures))))) ! 628: (setq l (cdr l))) ! 629: (if failures ! 630: (message "Deletions failed: %s" ! 631: (prin1-to-string failures)))))))) ! 632: ! 633: (provide 'dired)
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.