RCS is the simplest thing that does the job. It provides VersionControl to files on a per-file basis. You don’t have to do anything special in order to use it in Emacs. Just issue the keyboard sequence of ‘C-x v v’ to get started.

  1. To put a file under VersionControl with RCS type ‘C-x v v’ (‘vc-next-action’).
  2. After making edits,
    1. view the changes with `C-x v =’ (‘vc-diff’).
    2. or check in the revision by typing another ‘C-x v v’.
      1. After entering a log message, complete the check-in with ‘C-c C-c’ (‘vc-finish-logentry’).
    3. Instead of checking in, undo your changes with ‘C-x v u’ (‘vc-revert-buffer’).
  3. At any moment,
    1. view a file’s revision log with ‘C-x v l’ (‘vc-print-log’).
    2. be prompted for another version number to view the file in another window with `C-x v ~’ (‘vc-version-other-window’).

Automatically check in/out

To automatically check in/out a file when saving it if the file is under RCS, put this in your .emacs:

;; automatically check-in/check-out when under rcs
(defun rcs-ci-co nil
  "check in check out the file if it is under vc with rcs
        with a prefix other than 1 only check-in"
  (when (eq (vc-backend (buffer-file-name)) 'RCS)
    (if (= args 1)
	      (call-interactively 'log-edit-done)

(add-hook 'after-save-hook 'rcs-ci-co)

(defun my-vc-diff (historic &optional not-urgent)
  "my vc diff, same as vc-diff but in case of rcs, display the 
diffs between current version and previous one (with a prefix 
calls vc-diff)"
  (interactive (list current-prefix-arg t))
  (let ((file (buffer-file-name)))
  (if historic
      (call-interactively 'vc-version-diff)
    (if (eq (vc-backend file) 'RCS)
	(vc-version-diff file  (vc-previous-version (vc-workfile-version file)) (vc-workfile-version file))
      (call-interactively 'vc-diff)))))

(global-set-key  (kbd "C-x v=") 'my-vc-diff)

Note that if a prefix is used when saving the file, the file is only checked in allowing you to put a meaningful message to the Changelog.

it didn’t work for me (the first defun threw errors), but this other did the trick

  (defun rcs-ci-co nil
    "check in check out the file if it is under vc with rcs"
    (when (eq (vc-backend (buffer-file-name)) 'RCS)
        (vc-checkin (list (buffer-file-name)) 'RCS nil "saved" nil)
        (vc-checkout (buffer-file-name) t) )))

  (add-hook 'after-save-hook 'rcs-ci-co)

but it has problems anyway, for example: vc-checkin first tries to save, which is a problem when you want to create another major version. There is also a nice discussion here: VersionControlAlwaysAlvaroMartinez

Starting with Emacs 22 (in earlier versions the vc-rcs-*-switches were present, but ignored by the functions) you can also just use

  (setq vc-rcs-checkin-switches "-l")

This means use “ci -l file” to check out a locked (writable) version right after the check-in. This should always be fine when using RCS.

Modifiable Log View

Like WDired, it would be handy if you could hand-edit the contents of log view (revision logs, dates, author, state, file description) and commit the changes to the RCS file. Yet another WishList item.

Related Information