+;;; -*- 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"))))