Как установить рабочий каталог по умолчанию в Emacs - устранение неполадок

Я знаю, что это было опубликовано много раз, но решения не работают для меня. Я попробовал следующие решения из этого поста ( Изменение папки по умолчанию в Emacs):

  • Решение 1: Добавить (cd "C:/Users/Name/Desktop") к .emacs файл
  • Решение 2: Добавить (setq default-directory "C:/Documents and Settings/USER NAME/Desktop/" ) к .emacs файл
  • Решение 3: Щелкните правой кнопкой мыши по ярлыку emacs, выберите "Свойства" и измените поле начала в желаемом каталоге.

и только решение 3 работает. К сожалению, мне нужно использовать решение 1 или 2.

Я считаю, что мой .emacs файл правильный, потому что моя тема корректно загружается / выгружается при добавлении / удалении (load-theme 'light-blue t) от .emacs файл.

Вот мой самый последний .emacs файл:

(message "Default Dir: %S" default-directory)
(setq-default default-directory "C:/Users/Lucas/")
(message "Default Dir: %S" default-directory)
(setq-default indent-tabs-mode nil)
(add-hook 'ruby-mode-hook
      (lambda ()
        (define-key ruby-mode-map "\C-c#" 'comment-or-uncomment-region)
        )
 )  
(defadvice comment-or-uncomment-region (before slick-comment activate compile)
  "When called interactively with no active region, comment a single line instead."
  (interactive
   (if mark-active (list (region-beginning) (region-end))
     (list (line-beginning-position)
       (line-beginning-position 2)))))
(load-theme 'light-blue t)
;setq default-directory "~/")
(setq-default default-directory "C:/Users/Lucas/")

(defun xp-read-file-name (prompt &optional dir default-filename mustmatch initial predicate)
(setq last-nonmenu-event nil)
  (funcall (or read-file-name-function #'read-file-name-default)
           prompt dir default-filename mustmatch initial predicate))

(defun xp-save-as (filename &optional confirm)
  (interactive
   (list (if buffer-file-name
       (xp-read-file-name "Write file: " nil nil nil nil)
     (xp-read-file-name "Write file: " "C:/Users/Lucas/"
         (expand-file-name
          (file-name-nondirectory (buffer-name))
          "C:/Users/Lucas/")
         nil nil))
   (not current-prefix-arg)))
  (or (null filename) (string-equal filename "")
      (progn
  (if (file-directory-p filename)
      (setq filename (concat (file-name-as-directory filename)
           (file-name-nondirectory
            (or buffer-file-name (buffer-name))))))
  (and confirm
       (file-exists-p filename)
       (not (and (eq (framep-on-display) 'ns)
           (listp last-nonmenu-event)
           use-dialog-box))
       (or (y-or-n-p (format "File `%s' exists; overwrite? " filename))
     (error "Canceled")))
  (set-visited-file-name filename (not confirm))))
  (set-buffer-modified-p t)
  (and buffer-file-name
       (file-writable-p buffer-file-name)
       (setq buffer-read-only nil))
  (save-buffer)
  (vc-find-file-hook))
(defun comment-or-uncomment-region-or-line ()
    "Comments or uncomments the region or the current line if there's no active region."
    (interactive)
    (let (beg end)
        (if (region-active-p)
            (setq beg (region-beginning) end (region-end))
            (setq beg (line-beginning-position) end (line-end-position)))
        (comment-or-uncomment-region beg end)
        (next-line)))
(global-set-key (kbd "C-x C-;") 'comment-region)
(setq lazy-highlight-cleanup nil)
(message "Default Dir: %S" default-directory)

мой emacs.exe сохраняется в C:\emacs\emacs-24.3\bin (который также является моим каталогом по умолчанию, но я хочу изменить его на C:/Users/Lucas/), и мой .emacs находится под моим домом - C:\Users\Lucas,

ОБНОВИТЬ

Я недавно узнал, что моя команда (setq-default default-directory "C:/Users/Lucas/"), который должен установить мой default-directoryне выполняет. Сразу после запуска это мой *Messages* буфер:

Default Dir: "C:\\emacs\\emacs-24.3\\bin/" [3 times]
For information about GNU Emacs and the GNU system, type C-h C-a.

Он ведет себя так, как будто я переопределяю .emacs файл. Я дважды / трижды проверил, и я не могу найти другой .emacs на моем пути. Кроме того, я не запускаю Emacs с ярлыка. Мы ценим любые предложения. Спасибо за всю поддержку.

7 ответов

Для меня проблемой был начальный стартовый экран emacs.

Это может быть деактивировано:

;; no startup msg  
(setq inhibit-startup-message t)

Похоже, что экран приветствия по умолчанию в emacs (со ссылками на учебники) заставляет вас начать с $HOME дорожка.


После этого вы можете либо cd или же setq default-directory вот так:

(setq default-directory "~/")

или же

(cd "~/")

Из того, что вы пишете, звучит так, как будто вы запускаете Windows. Вы убедились, что emacs фактически находит и загружает.emacs из каталога C:\Users\Lucas? Если это так, это означает, что Windows понимает, что ваш домашний каталог - C:\Users\Lucas. Вы можете проверить это, посмотрев на переменную окружения HOME. В Emacs попробуйте:

(getenv "HOME")

В вашем файле.emacs вы можете поместить:

(setq default-directory "~/")

Вот что я сделал и работал без проблем:

setq default-directory "C:\\Path\\To\\Directory\\"

Сохранено и перезапущено. Я думаю, что в Windows ENV, вы должны иметь двойную обратную косую черту.

Я только что проверил, и он вел себя нормально в отношении Default-Directory. Мои настройки следующие:

emacs.exe в c:\bin\emacs\bin

%PATH% включает в себя c:\bin\emacs\bin\

%HOME% установлен в %USERPROFILE (C:\Users\)

Прямо из Run-box

Win+ гemacs -qRET

(message "%s" default-directory) => "C: \ Users \ jonpe /"

Из cmd.exe после смены каталога

Win+ гcmdRET

cd c:\users\publicRET

emacs -qRET

(message "%s" default-directory) => "C: \ Users \ Public /"

У вас есть emacs, добавленный к вашему %PATH% переменная?

Если я пытаюсь запустить emacs, перейдя к его местоположению, то при запуске каталога по умолчанию устанавливается исполняемый каталог.

С Emacs 24.3.1 в Windows 10 я страдал от подобных странностей. Решение еще более странное: настроить Emacs так, чтобы запретить экран запуска. Это можно сделать с помощью кнопок настройки запуска, поэтому в вашем.emacs вы получите следующее:

(custom-set-variables
 ;; custom-set-variables was added by Custom.
 ;; If you edit it by hand, you could mess it up, so be careful.
 ;; Your init file should contain only one such instance.
 ;; If there is more than one, they won't work right.
 '(inhibit-startup-screen t))

При установленном экране запуска (например, смените t на nil выше) доминирует поле ярлыка Windows "Начать в" (установленное на "E:\Users\Rob\"), а Ctrl-x Ctrl-f дает E: \ Users \ Роб / (обратите внимание на странные наклонные направления).

При запрещенном экране запуска (t выше).emacs

 (setq default-directory "E:/Users/Rob/me/")

доминирует и Ctrl-x Ctrl-f выдает E:/Users/Rob/me/ (все косые черты).

При моей настройке на OSX каталог по умолчанию для буфера, не посещающего файлы, совпадает с моим user-emacs-directory,

Я настроил различные функции для использования разных каталогов - например, при открытии файла или сохранении файла. Вот несколько примеров того, как изменить местоположение для сохранения при использовании Emacs в Windows, и другой пример для OSX. Переменная default-directory используется для xp-save-as, но вы можете установить его на что угодно - даже поставить в кавычки "C:/Documents and Settings/USER NAME/Desktop/",


Пример Windows:

(defun xp-read-file-name (prompt &optional dir default-filename mustmatch initial predicate)
(setq last-nonmenu-event nil)
  (funcall (or read-file-name-function #'read-file-name-default)
           prompt dir default-filename mustmatch initial predicate))

(defun xp-save-as (filename &optional confirm)
  (interactive
   (list (if buffer-file-name
       (xp-read-file-name "Write file: " nil nil nil nil)
     (xp-read-file-name "Write file: " default-directory
         (expand-file-name
          (file-name-nondirectory (buffer-name))
          default-directory)
         nil nil))
   (not current-prefix-arg)))
  (or (null filename) (string-equal filename "")
      (progn
  (if (file-directory-p filename)
      (setq filename (concat (file-name-as-directory filename)
           (file-name-nondirectory
            (or buffer-file-name (buffer-name))))))
  (and confirm
       (file-exists-p filename)
       (not (and (eq (framep-on-display) 'ns)
           (listp last-nonmenu-event)
           use-dialog-box))
       (or (y-or-n-p (format "File `%s' exists; overwrite? " filename))
     (error "Canceled")))
  (set-visited-file-name filename (not confirm))))
  (set-buffer-modified-p t)
  (and buffer-file-name
       (file-writable-p buffer-file-name)
       (setq buffer-read-only nil))
  (save-buffer)
  (vc-find-file-hook))

Пример OSX:

(defun ns-lawlist-save-as ()
(interactive)
    (let ((filename (ns-read-file-name "Write file: " (if buffer-file-name (file-name-directory buffer-file-name)) nil (if buffer-file-name (file-name-nondirectory buffer-file-name) "Untitled"))))
   (and filename (write-file (expand-file-name filename)))))

Установите свой default-directory последний в вашем файле инициализации, если вы ожидаете, что этот параметр будет полезен после загрузки файла инициализации.

Если вам также нужно, чтобы он был установлен ранее в файле инициализации (например, чтобы часть кода в файле инициализации получила правильное значение), то установите его также и раньше. Когда вы делаете что-то в вашем файле инициализации, это может изменить значение переменной.

Вы также можете использовать (setq-default default-directory "C:/Documents and Settings/USER NAME/Desktop/") (или каково бы ни было имя каталога), если вы хотите, чтобы это было значением по умолчанию для каждого буфера.

Я думаю, что вам просто нужно использовать правую обратную косую черту (и избежать их). Это сработало в моем.emacs:

(setq default-directory "C: \ windows")

Другие вопросы по тегам