;;; -*- lexical-binding: t -*- (setq frame-title-format '((:eval (funcall #'my/generate-frame-title)))) (setq icon-title-format frame-title-format) (add-to-list 'post-command-hook #'my/terminal-update-title) (defun my/generate-frame-title () "Returns a string like 'filename (dirname) - Emacs'" (if (buffer-file-name) (concat (file-name-nondirectory (buffer-file-name)) (if (buffer-modified-p) " +") " (" (abbreviate-file-name (substring (file-name-directory (buffer-file-name)) 0 -1)) ") - Emacs" ) (concat (buffer-name) (if (buffer-modified-p) " +") " - Emacs"))) (defun my/terminal-update-title () "If using a terminal frame then sends the escape codes to update the title." (if (terminal-parameter (frame-terminal) 'terminal-initted) (send-string-to-terminal (concat "\033]0;" (my/generate-frame-title) "\007"))))