O Emacs não pode avisá-lo que um arquivo não contém texto a menos que faça abri-lo (para que possa ver qual é o conteúdo), ou pergunte a outro programa para descobrir (talvez usando algo como o comando Unix file
).
O problema com a última abordagem é que o Emacs pode manipular muitos tipos de arquivos binários, então você precisaria desse programa externo para também saber quais tipos de arquivo binário o Emacs reconhece, incluindo suporte adicionado por bibliotecas complementares, que podem variar dinamicamente e por usuário.
Eu não acho que há boas opções lá.
O que especificamente você está tentando evitar?
Editar:
Como o teste requerido para o exemplo dado é baseado apenas em nomes de arquivos, o seguinte seria uma abordagem viável.
(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))
(source-filename
(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))))
my-find-file-check-source-extensions)
nil)))
(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)