2014-12-05 1 views
1

Файл .emacs (emacs 23.4.1) содержит код, связанный с python и латекс. Для обоих есть eval-after-load (код, который я хочу выполнить только один раз, когда emacs инициирует) и перехватывает. Соответствующая часть его:Emacs: всегда выполняется код eval-after-load

(setq py-install-directory "~/.emacs.d/python-mode.el-6.1.3") 
(add-to-list 'load-path py-install-directory) 
(require 'python-mode) 

(defun my-eval-after-load-python() 
    (setq initial-frame-alist '((top . 48) (left . 45) (width . 142) (height . 57))) 
    (split-window-horizontally (floor (* 0.49 (window-width))))) 

(eval-after-load "python-mode" '(my-eval-after-load-python)) 

Все крючки прекрасно работают, но мой-Eval-после нагрузки питона не делает, что вызывает кадр должен быть разделен на два окна Everytime Emacs инициируемых для каждого расширения (например: emacs file.py, emacs file.tex, файл emacs). Я попытался изменить его на:

(eval-after-load "python-mode" 
    '(progn 
    (setq initial-frame-alist '((top . 48) (left . 45) (width . 142) (height . 57))) 
    (split-window-horizontally (floor (* 0.49 (window-width)))) 

, но он все еще не работает. Вероятно, здесь начинается ошибка начинающих, но я не могу ее найти. Как бы я расколол окно только при первом открытии скрипта python (emacs file.py), и не каждый раз, когда я открываю новый buffer file2.py?

+0

* Избавьтесь от всего вышеприведенного кода, который специально не связан с проблемой * - весь материал латекса и большая часть материала python. Просто укажите один, простой, суженный, минимальный бит кода и полный рецепт для воспроизведения проблемы **, начиная с 'emacs -Q' **. – Drew

+1

Мое дикое предположение: вы не хотите запускать материал из 'my-eval-after-load-python' после загрузки пакета python, но после загрузки первого файла python. Поэтому вы должны перевести 'my-eval-after-load-python' в' python-mode-hook'. Возможно, вы должны это условно определить в зависимости от того, вы уже вызвали его (установив флаг и протестировав его). – Tobias

+0

Я бы не хотел, чтобы окно менялось каждый раз, когда я открываю буфер с другим .py-файлом. Ваше второе решение в порядке, но кажется, что автозагрузка - это то, что я искал. –

ответ

2

Похоже, что происходит (load "python-mode") «каждый раз, когда emacs инициирует каждое расширение» (я не уверен, что вы на самом деле подразумеваете под этим).

Ваш код также странный в том, что вы принудительно загружаете python-режим с require, а затем оцениваете eval-after-load для этой же библиотеки, хотя вы знаете, что он определенно уже загружен. Это все равно будет работать, но это странно. Один имеет тенденцию использовать eval-after-load - , избегая загрузки чего-то впереди (позволяя автозагрузке справляться с этим по требованию, но все еще имея пользовательский код, работающий в это время).

Edit: О, вы просто означает, что, когда вы начать Emacs он оценивает свой eval-after-load код? Это потому, что вы сказали это - вы загрузили режим python, а затем сказали Emacs, что если/когда режим python загружен, разделите экран на две части.

+0

Это было прекрасно! Вы поняли это правильно, это было глупо. Спасибо, что использование 'autoload' вместо' require' сохраняет мой код. –

0

Может ввести некоторые булеву

(DefVar моих-действие сделано ноль)

Поместите их не-ноль следующих действий и

(если мои действия, не сделало сделать ...

0

Вы делаете (require 'python-mode) в самом начале, поэтому режим python всегда загружается даже до того, как вы дойдете до части (eval-after-load "python-mode" ...). Я думаю, что ваш my-eval-after-load-python не предназначен для загрузки, когда в режиме python загружен, но когда в режиме python введен. Таким образом, вы хотите использовать

(add-hook 'python-mode-hook #'my-eval-after-load-python)