Suppose I create a file in dir1/file1.txt. As soon as I write the file for the first time, I want to create another file in dir2/file1_friend.txt. But when I create a file dir1/file2.txt, I want the new file created be dir2/file2_friend.txt.


You can use a before-save-hook for this. Note this runs on every buffer save, so we have some checks to make sure we have a buffer file name, that it ends with the right string, and that your new file doesn't already exist. then, if all that is ok, we make the file.

(require 'f)
(require 's)

(defun custom-save ()
  (let ((bf (buffer-file-name))
        (bff "my_file_abc_friend.txt"))
    (when (and bf
           (s-ends-with? "dir1/my_file_abc.txt" bf)
           (not (file-exists-p bff)))
      ;; I think this means you are in dir1 so we can just make the desired file      
      (with-temp-file bff
    ;; add contents here if you want

(add-hook 'before-save-hook 'custom-save)
  • The point of "abc" was that if the file that is originally saved is "gfh", then the other file should be gfh_friend etc. Feb 15 '20 at 20:34
  • 1
    you probably have to be a lot more specific about your regex, or you will get _friend.txt files for every kind of text file. What is the real pattern you are looking for? Is it just dir1/*.txt? Feb 15 '20 at 20:39

Here the "need a friend" suffix is _blah.txt.You'd probably want to make it a defvar and maybe include some directory path. But .... it works.

  (defun friend-file-root-name(f)
    (string-match  "\\(.*\\)\\(_blah.txt\\)" f)
    (match-string 1 f)

  (defun custom-save-create-friend-file ()
    (message "in custom save")
    (when (friend-file-root-name (buffer-file-name))
      (let ((friend-file (concat (friend-file-root-name (buffer-file-name)) "_friend.txt")))
        (message "potential friend file is: %s" friend-file)
        (unless (file-exists-p friend-file)
          (with-temp-file friend-file
            (message "need to create %s" friend-file)

  (add-hook 'after-save-hook 'custom-save-create-friend-file)
  • Would you please explain how to use this code? Feb 16 '20 at 20:55
  • The custom save hook looks to match a "spec" for your - file see the (string-match ..) call. Then if there is a match it replaces the "_blah.txt" with "friend.txt" and creates that file if it doesnt already exist. You should be able to work from that and change accordingly.
    – RichieHH
    Feb 16 '20 at 21:39

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.