How can I make Emacs give me a warning if I am about to open a file that does not contain text?

Example: When I edit a c++ source code in file test.cpp and compile it as an executable test in the same directory, i often accidentally open the binary file test.


Emacs cannot warn you that a file does not contain text unless it either does open it (so that it can see what the contents are), or otherwise asks some other program to find out (perhaps using something like the Unix file command).

The problem with the latter approach is that Emacs can handle many kinds of binary file, so you would then need that external program to also know which kinds of binary file Emacs recognises, including support added by add-on libraries, which can vary dynamically and per-user.

I don't think there are any good options there.

What is it specifically that you are trying to avoid?


As the required test for the given example is based only upon filenames, the following would be a viable approach.

(defvar my-find-file-check-source-extensions
  '(".cpp" ".cc"))

(defadvice find-file-read-args (after my-find-file-read-args-check-source)
  (let* ((filename (car ad-return-value))
          (catch 'source-file-exists
            (mapc (lambda (ext)
                    (let ((source-filename (concat filename ext)))
                      (when (file-exists-p source-filename)
                        (throw 'source-file-exists source-filename))))

    (and source-filename
         (not (y-or-n-p (format "Source file %s detected. Are you sure you \
want to open %s? " source-filename filename)))
         (error "find-file aborted by user"))))

(ad-activate 'find-file-read-args)
  • I edited by question by adding an example. – ggg Jan 2 '12 at 1:43

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.