emacs dired-mode: как выйти и оказаться в оболочке в текущем каталоге?

В Mac OS я могу использовать терминал, написать «cd», а затем перетащить папки из Finder в терминал. Затем я получаю что-то вроде «cd / Users / ...», что позволяет мне быстро перейти в соответствующий каталог. Если я открываю оболочку emacs с оболочкой M-x и перетаскиваю в нее папку, emacs изменяется в режиме dired и отображает мне содержимое папки, которую я сбросил. Как я могу «выйти» или «выйти» из dired-режима и получить оболочку, в которой каталог был изменен на папку, которую я сбросил? Это дало бы мне что-то подобное, и это было бы весьма полезно.


person Marius Hofert    schedule 08.11.2011    source источник
comment
Если вы запустите оболочку в emacs (M-x shell), она запустится в указанном каталоге. Вы также можете запустить команду оболочки после нажатия M-!, которая запустится в каталоге.   -  person choroba    schedule 08.11.2011
comment
спасибо, но дело не в этом. У меня оболочка открыта, запустил с M-x shell. Конечно, он открывается в каталоге, из которого я вызвал оболочку M-x. Но теперь я перехожу в режим dired в другой каталог. Проблема в том, что я не хочу открывать файл оттуда, я просто хочу выйти из режима dired и вернуться к приглашению в оболочке, но теперь оболочка должна была перейти в каталог, в который я перешел. dired-режим. Таким образом, ввод pwd должен показать мне каталог, в который я перешел в режиме dired. Если я просто нажму q, я попаду в исходный каталог, а не в тот, к которому я перешел.   -  person Marius Hofert    schedule 08.11.2011


Ответы (1)


Вы можете реализовать функцию для открытия оболочки вместо dired buffer. Эта функция полезна во многих других случаях, не только в случае DnD

(require 'dired)
(define-key dired-mode-map "c" 'shell-instead-dired)

(defun shell-instead-dired ()
  (interactive)
  (let ((dired-buffer (current-buffer)))
    (shell (concat default-directory "-shell"))
    (kill-buffer dired-buffer) ;; remove this line if you don't want to kill the dired buffer
    (delete-other-windows)))

РЕДАКТИРОВАТЬ В этом случае вам нужно создать каталог в Emacs и нажать «c», чтобы вызвать оболочку в этом каталоге.

В противном случае вы можете установить smart-dnd package и настройте его для открытия оболочки. Я также предоставляю другие полезные вещи, такие как создание <img ...> тегов в режиме html, если вы отбрасываете jpg или #include<...> в режиме c, если вы отбрасываете заголовок.

person Oleg Pavliv    schedule 08.11.2011
comment
ладно, понятно, задача не из легких. Пока я просто использую 1) M-x dired 2) перейдите с помощью a в папку, которая вам нравится 3) C-u M-x shell = ›эта оболочка открывается в папке, в которую вы перешли в разделе 2) - person Marius Hofert; 08.11.2011
comment
Ну, все дело в скорости, верно. Вы загружаете каталог в Emacs, который показывает его в управляемом режиме. Используя мое решение, вы вводите один ключ 'c', который открывает оболочку с уникальным именем и закрывает буфер dired. - person Oleg Pavliv; 08.11.2011
comment
Я получаю: Значение символа как переменной недействительно: dired-mode-map - person Marius Hofert; 09.11.2011
comment
Вам нужно добавить (требуется 'dired) - person Oleg Pavliv; 09.11.2011
comment
Работает как шарм, спасибо :-) Итак, решение: 1) C-x d 2) перемещаться с помощью a 3) c - person Marius Hofert; 09.11.2011
comment
Когда вы работаете с навигатором ОС (Проводник для Windows, .. для Mac), вам нужно только открыть каталог в Emacs и нажать 'c'. В противном случае вы можете перейти из dired в Emacs и нажать «c», когда окажетесь в нужном вам каталоге. - person Oleg Pavliv; 09.11.2011
comment
Есть ли способ выполнить обратное действие, например: 1. Внутри emacs я открыл терминал 2. Я хочу перейти с помощью dired в текущий каталог, открытый в терминале (терминал открыт ВНУТРИ emacs)? - person micholeodon; 15.02.2020
comment
@micholeodon Я пробовал в своих emacs C-x C-f, и он предлагает текущий каталог, открытый в терминале. Я не думаю, что я что-то изменил в emacs, чтобы иметь такое поведение - person Oleg Pavliv; 16.02.2020
comment
@OlegPavliv Я пробовал это, и у меня нет предложений. Я использую некоторые пакеты, которые могут перекрывать это поведение: multi-term, helm - person micholeodon; 18.02.2020