* Shell ** Add faces instead of reusing font-lock-{comment,string} ** Improve directory tracking Ensure ~default-directory~ remains consistent with the shell's current working directory. Some things ~shell-mode~ does not handle: - ~autocd~ (there's ~shell-has-auto-cd~, but it does not track whether ~autocd~ is *actually* set) - ~cd !$~ - ~ssh~ - Docker containers Some solutions: - Emacs 28's ~comint-osc-process-output~ - requires configuring the prompt - does not handle SSH (yet) - relies on OSC 7, which is [[https://gitlab.freedesktop.org/terminal-wg/specifications/-/issues/20][not standard yet]] - running this clumsy thing after every command: #+begin_src sh (file-truename (format "/proc/%d/cwd" (process-id (get-buffer-process (current-buffer))))) #+end_src ** Use Bash completions Emacs filename completions in =*shell*= are subtly different to Bash's; e.g. typing ~ls TAB~ in a folder with a single file expands to ~ls that-file~. Also, in general, =*shell*= has no clue about - changes to =$PATH=, which affect what programs are available, - Bash aliases, - changes to the current working directory not triggered by an explicit ~cd~, and not announced by OSC 7, - etc. See [[https://debbugs.gnu.org/26661][bug#26661]], and [[https://github.com/szermatt/emacs-bash-completion/issues/45][szermatt/emacs-bash-completion!45]]. ** Handle DECSC, DECRC, CUU, ED, HVP and DECSTBM console codes Used for APT's "Dpkg::Progress-Fancy" option, enabled by default with the high-level apt(8) command. Silly script emulating what APT does: #+begin_src bash #!/bin/bash set -eu if ! test "${LINES:-}" -a "${COLUMNS:-}" then echo Please export LINES and COLUMNS. exit 1 fi # Adapted from apt/apt-pkg/install-progress.cc. backup=$'\e7' # DECSC: backup cursor position. restore=$'\e8' # DECRC: restore cursor position. setup () { echo -n ${backup} # DECSTBM: restrict scrolling below command, and above progress # bar. Side-effect: move the cursor to position 1:1, # hence the backup/restore. echo -n $'\e[0;'$((LINES-1))'r' echo -n ${restore} } teardown () { # ED: clear everything from current position to end of screen. # Dixit Michael Vogt: "sledgehammer". echo -n $'\e[J' } # APT surrounds this setup phase with \n and \e[1A (CUU). I don't # know why; the comments say that this is to "avoid visual glitch when # the screen area shrinks by one row". No further explanation is # given in commit messages. setup for ((i=1;i