2016-12-02 2 views
2

Я использую Dired для просмотра каталога и его подкаталогов с i (dired-maybe-insert-subdir)Как создать файл в подкаталоге в Emacs Dired?

Когда курсор находится в подкаталоге, и я C-x C-f, каталог по умолчанию является корнем моего буфера, есть способ изменить это?

Так что, если я нахожусь в/foo/bar, а затем вставляю в буфер бара содержимое/foo/bar/baz и курсор туда, получаю мини-буфер с /foo/bar/baz/, когда я прошу посетить файл (с по умолчанию ключевое слово или другое, что не имеет значения для меня).

ответ

1

No, default-directory является локальным для буфера, а не только для части буфера. Это по дизайну, и нет способа изменить его.

Но вы могли бы, конечно, определить команду, которая подбирает каталог поддиректа, а затем связывает default-directory с тем, что читает имя файла для посещения и т. Д.).

Например, эта команда прочитает имя файла с каталогом по умолчанию является то, что вы хотите, а затем посетить этот файл:

(defun foo (file) 
    "..." 
    (interactive 
    (let ((default-directory (dired-current-directory))) 
    (list (read-file-name "File: ")))) 
    (find-file file)) 

И, из коробки, вы можете, конечно, посетить подкаталог в другой Dired buffer, где default-directory - это то, что вы хотите. Такие команды, как dired-do-find-marked-files (F) и dired-display-file (C-o) сделайте это.

Зачем вам default-directory, если вы хотите отредактировать субтитры, в которых вы сейчас находитесь: Каков ваш прецедент?

+0

'Dired-ток directory' был точно что мне нужно, спасибо! Но почему ваша функция в основном отбрасывает результат 'read-file-name'? –

+1

А? Он не отбрасывает его. Этот результат становится значением аргумента 'FILE', который передается' find-file'. Ваша версия (ниже) ничего не делает, и она делает что-то меньшее: Ваша версия также не может использоваться * не * -интервативно. Я думаю, вам нужно прочитать ['interactive'] (http://www.gnu.org/software/emacs/manual/html_node/elisp/Using-Interactive.html). – Drew

+0

Ха, да, я не понял, как 'let' был аргументом' interactive'. Я редко видел этот способ его использования. –

0

Я рафинированное Drew's answer в функцию, которая делает именно то, что я хотел:

(defun dired-find-file() 
    "Find a file in the current dired directory" 
    (interactive) 
    (let ((default-directory (dired-current-directory))) 
    (find-file (read-file-name "Find file:")))) 

Я затем привязываюсь этой функция для комбинации удобного ключа:

(add-hook 'dired-mode-hook 
    (lambda() 
    (local-set-key (kbd "C-x M-f") 'dired-find-file))) 
+0

Я должен пропустить свой собственный ответ. :-) –

Смежные вопросы