[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
bug#47132: 28.0.50; [PATCH] Uniquify: trailing-separator-p + strip-commo
From: |
Gabriel |
Subject: |
bug#47132: 28.0.50; [PATCH] Uniquify: trailing-separator-p + strip-common-suffix |
Date: |
Sun, 14 Mar 2021 02:50:06 -0300 |
A possible bug exists on uniquify.el when 'uniquify-strip-common-suffix'
and 'uniquify-trailing-separator-p' are both set to true.
Case 1: when 'uniquify-strip-common-suffix' is t and
'uniquify-trailing-separator-p' is nil
1. emacs -Q
2. Configure uniquify:
(setq-default uniquify-buffer-name-style 'forward
uniquify-strip-common-suffix t
uniquify-trailing-separator-p nil)
3. Open two similar dired buffers, e.g.:
C-x C-f "~/A/gnu/emacs/lisp" RET
C-x C-f "~/B/gnu/emacs/lisp" RET
4. The buffers will be renamed to 'A/lisp' and 'B/lisp' as expected,
because 'uniquify-strip-common-suffix' is true and
'uniquify-trailing-separator-p' is nil
Case 2: when 'uniquify-strip-common-suffix' is nil and
'uniquify-trailing-separator-p' is t
1. emacs -Q
2. Configure uniquify:
(setq-default uniquify-buffer-name-style 'forward
uniquify-strip-common-suffix nil
uniquify-trailing-separator-p t)
3. Open two similar dired buffers, e.g.:
C-x C-f "~/A/gnu/emacs/lisp" RET
C-x C-f "~/B/gnu/emacs/lisp" RET
4. The buffers will be renamed to 'A/gnu/emacs/lisp/' and
'B/gnu/emacs/lisp/' as expected, because 'uniquify-strip-common-suffix' is nil
and
'uniquify-trailing-separator-p' is true
Case 3: when 'uniquify-strip-common-suffix' is t and
'uniquify-trailing-separator-p' is t
1. emacs -Q
2. Configure uniquify:
(setq-default uniquify-buffer-name-style 'forward
uniquify-strip-common-suffix t
uniquify-trailing-separator-p t)
3. Open two similar dired buffers, e.g.:
C-x C-f "~/A/gnu/emacs/lisp" RET
C-x C-f "~/B/gnu/emacs/lisp" RET
4. The buffers will be renamed to 'A/lisp' and 'B/lisp'. The common
suffix was removed as expected, but the trailing separator is missing
Cause: It seems that the following verification on 'uniquify-get-proposed-name'
fails because dirname is not the true dirname, but the one with the
common suffix stripped. Thus, 'file-directory-p' fails to find the
directory:
;; Distinguish directories by adding extra separator.
(if (and uniquify-trailing-separator-p
(file-directory-p (expand-file-name base dirname)) ;; <-- HERE
(not (string-equal base "")))
(cond ((eq uniquify-buffer-name-style 'forward)
(setq base (file-name-as-directory base)))
;; (setq base (concat base "/")))
((eq uniquify-buffer-name-style 'reverse)
(setq base (concat (or uniquify-separator "\\") base)))))
The dirname on the line above is '~/A' and '~/B' for each invocation
(common suffix was stripped), so 'expand-file-name' expands to
'~/A/lisp' and '~/B/lisp' and 'file-directory-p' fails to find it. The
function that removes the common suffix is 'uniquify-rationalize'.
I managed to create a patch where the original dirname is preserved in
the 'uniquify-item' struct and passed along as an optional argument, so
'uniquify-get-proposed-name' can properly verify if the directory
exists.
0001-Make-uniquify-trailing-separator-p-work-with-uniquif.patch
Description: Text Data
- bug#47132: 28.0.50; [PATCH] Uniquify: trailing-separator-p + strip-common-suffix,
Gabriel <=