2016-02-02 3 views
1

Я запускаю оба emacs 23 и 24 с «--no-init-file», чтобы не загружать мои настройки. Но затем я явно загружаю свою старую версию python-mode.el (версия 3.105, последнее уведомление об авторских правах 1998 года) и вижу то же поведение, которое я собираюсь описать, поэтому я считаю, что это основные emacs, а не python.emacs 24: Как мне вернуть поведение emacs-23 sexp для режима python?

Рассмотрим этот код (* помечает местоположения курсора):

*def emacs_is_fun(): 
    for x in range(3): 
     print(x) 

Поместить курсор в колонку 4 в начале "DEF".

С emacs 23, работает mark-sexp выбирает "def".

С emacs 24, mark-sexp выбирает весь блок кода, до конца отчета о печати.

Это неплохо. Основная проблема заключается это общее использование:

*very_long_var_name[very_long_expn] += long_function_call(long_arg_list, blah) 

Опять же, курсор находится в начале печатной части линии, Col 4.

В Emacs 23, mark-sexp выбирает very_long_var_name.

В emacs 24, mark-sexp выбирает полную линию, от col 4 до конца.

Я использовал Ctrl-alt-space alt-w, чтобы быстро сохранить имена переменных. (Или alt-2 ctrl-alt-space alt-w, чтобы сохранить выражение.) Теперь это ушло. Это emacs, поэтому это должно быть настраиваемо, но я не нашел , где реализовано новое поведение (и помните, что я использую python-режим , которому около 15 лет). Что мне нужно вставить в файл .emacs?

ответ

1

@Eric Интересно. Спасибо за контекст в комментарии к моему другому ответу.

Я думаю, вы можете просто хочу, чтобы это потом:

(add-hook 'python-mode-hook (lambda() (setq forward-sexp-function nil)))

Из комментариев внутри python-mode встроенный в Emacs 24 (который я думаю, что вы можете получать вместо этого)

Наконец-но не в последнюю очередь специализированный python-nav-forward-sexp позволяет легко перемещаться между кодовыми блоками. Если вы предпочитаете cc-mode -как forward-sexp движение, установка forward-sexp-function до нуля достаточно ...

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

+0

Вот и все! Большое спасибо! Это все еще работает так, как ожидалось, для выражений и строк в скобках. Другая проблема, которую я испытываю с новым поведением, - это ее асимметрия: сидеть на «def», fwd-sexp идет до конца блока, но как только (fwd-sexp -1) возвращается один традиционный sexp. – Eric

+0

Нет проблем. Счастлив, что помогло. Не уверен, что я полностью понимаю ваш второй вопрос. Если у вас все еще есть проблема, то, пожалуйста, внесите новый вопрос SO с примером и @ me в комментарии, и я буду рад взглянуть. – Jack

0

Похоже, это было исправление ошибки в emacs 24. Как это технически сейчас маркирует полный sexp. Кажется, что вам нужна функциональность маркировки символа.

I думаю, положив это в свой .emacs, вы получите необходимую функциональность.

(defun your-mark-symbol (&optional arg allow-extend) 
    "mark-sexp in lisp.el but with fowrad-symbol instead of foward-sexp" 
    (interactive "P\np") 
    (cond ((and allow-extend 
      (or (and (eq last-command this-command) (mark t)) 
      (and transient-mark-mode mark-active))) 
    (setq arg (if arg (prefix-numeric-value arg) 
      (if (< (mark) (point)) -1 1))) 
    (set-mark 
     (save-excursion 
     (goto-char (mark)) 
     (forward-symbol arg) 
     (point)))) 
    (t 
    (push-mark 
     (save-excursion 
     (forward-symbol (prefix-numeric-value arg)) 
     (point)) 
     nil t)))) 

(global-set-key (kbd "C-M-SPC") 'your-mark-symbol) 

Обратите внимание, что буквально копия mark-sexp но с foward-symbol вместо forward-sexp.

Это вполне может привести к неожиданной странности, если вы используете mark-sexp через C-M-SPC в других буферах/режимах, в этом случае вы хотели бы сделать, сделать это с помощью режима данного сочетания клавиш крюка вместо этого.

+0

Я думаю, что это регрессия, представленная в версии 24. Я уже более 15 лет редактирую файлы python в emacs, и это первый раз, когда я столкнулся с этим поведением. И я все еще хочу, чтобы совпадение совпадало. В моем примере я упомянул использование 'alt-2 ctrl-alt-space alt-w' для yank' very_long_var_name [very_long_expn] ', где выражение могло содержать несколько слов. Кажется, здесь есть какой-то другой крючок, и хотелось бы знать, как его сузить. – Eric