branch: master
commit fb486d87424d3161aa059eed957e2fefef356d4d
Author: Oleh Krehel <[email protected]>
Commit: Oleh Krehel <[email protected]>
ivy.el (ivy-immediate-done): Add copy-sequence to fix read-directory-name
`read-directory-name' returns "" when the completion function passes
it back the DEF argument. This is a highly questionable behavior that
some old functions depend on.
Looks like it's better to break those old functions, rather than break
the more important functions that have no idea why
`read-directory-name' returns "".
* ivy-test.el (ivy-read-file-name-in-buffer-visiting-file): Now fails.
(ivy-read-directory-name): Add test.
Fixes #2165
Fixes #2149
Re #1170
---
ivy-test.el | 9 ++++++++-
ivy.el | 2 +-
2 files changed, 9 insertions(+), 2 deletions(-)
diff --git a/ivy-test.el b/ivy-test.el
index 1d5d9d6..4dd854b 100644
--- a/ivy-test.el
+++ b/ivy-test.el
@@ -929,7 +929,13 @@ will bring the behavior in line with the newer Emacsen."
(equal "/tmp/"
(ivy-with
'(read-directory-name "cd: " "/tmp")
- "RET"))))
+ "RET")))
+ (should
+ (equal "/tmp/"
+ (ivy-with
+ '(read-directory-name "cd: ")
+ "C-M-j"
+ :dir "/tmp"))))
(ert-deftest ivy-partial-files ()
(when (file-exists-p "/tmp/ivy-partial-test")
@@ -975,6 +981,7 @@ will bring the behavior in line with the newer Emacsen."
(ert-deftest ivy-read-file-name-in-buffer-visiting-file ()
"Test `ivy-immediate-done' command in `read-file-name' without any editing in
a buffer visiting a file."
+ :expected-result :failed
(let ((ivy-mode-reset-arg (if ivy-mode 1 0)))
(ivy-mode 1)
;; `ivy-read' returns "~/dummy-dir/dummy-file" (same object, not a copy).
diff --git a/ivy.el b/ivy.el
index b25c0b4..c24bcd7 100644
--- a/ivy.el
+++ b/ivy.el
@@ -1125,7 +1125,7 @@ If the text hasn't changed as a result, forward to
`ivy-alt-done'."
((and (string= ivy-text "")
(eq (ivy-state-collection ivy-last)
#'read-file-name-internal))
- (or (ivy-state-def ivy-last)
+ (or (copy-sequence (ivy-state-def ivy-last))
ivy--directory))
(t
(expand-file-name ivy-text ivy--directory))))