2015-08-17 3 views
1

строке документации у меня есть следующий код/​​текст:Emacs24 и питон-режим: отступы в

def f(): 
    """ 
    Return nothing. 

    .. NOTE:: 

     First note line 
second note line 

В Emacs23 (23.4.1), я был в состоянии нажать TAB в последней строке («вторая нота линия» ; NoMatter, как эта линия была отступ), и это было правильно выровнено так:

def f(): 
    """ 
    Return nothing. 

    .. NOTE:: 

     First note line 
     second note line 

Т.е., он использует предыдущую строку и отступы следующую строку таким же образом.

Сейчас в Emacs24 (24.3.1), это больше не работает, и оно располагалось так:

def f(): 
    """ 
    Return nothing. 

    .. NOTE:: 

     First note line 
    second note line 

Т.е. он выравнивает многострочный строковый блок, но не зависит от предыдущей строки.

Это касается только доклинков; код отступом, как я хочу. Я использую python-mode. Как я могу изменить это, так что нажатие TAB правильно выравнивает блок?

ответ

0

Режим Python сильно изменился между Emacs 23 и 24. Конфигурация не позволяет вам делать то, что вы хотите.

Но Emacs довольно гибкий, и вы можете посоветовать функцию (python-indent-context), чтобы вернуть другой результат, который приведет к поведению, которое вы хотите. Функция (python-indent-context) возвращает символ, в котором измеряется отступ и используется для отступов текущей строки. По умолчанию, когда внутри строки, она возвращает точку, в которой находится начало строки. Таким образом, ваша строка будет отступать от отступов начала строки. Мы можем легко изменить его, чтобы вернуть точку в предыдущей непустой строки, а не, к примеру, как это:

(defun python-fake-indent-context (orig-fun &rest args) 
    (let ((res (apply orig-fun args))) ; Get the original result 
    (pcase res 
     (`(:inside-string . ,start) ; When inside a string 
     `(:inside-string . ,(save-excursion ; Find a point in previous non-empty line 
          (beginning-of-line) 
          (backward-sexp) 
          (point)))) 
     (_ res)))) ; Otherwise, return the result as is 

;; Add the advice 
(advice-add 'python-indent-context :around #'python-fake-indent-context) 

Тот же эффект может быть достигнут с помощью старого defadvice для старших Emacs:

(defadvice python-indent-context (after python-fake-indent-context) 
    (pcase ad-return-value 
    (`(:inside-string . ,start) ; When inside a string 
    (setq ad-return-value  ; Set return value 
      `(:inside-string . ,(save-excursion ; Find a point in previous non-empty line 
           (beginning-of-line) 
           (backward-sexp) 
           (point))))))) 
(ad-activate 'python-indent-context) 
+0

Кажется, что «совет-добавить» существует только с 24.4 по; У меня есть 24.3.1 :( –

+0

См. Совет, преобразованный в «старые» советы –

+0

Чтобы указать отступ предыдущей непустой строки в строке (начало строки) (backward-sexp), не будет Допустим, слово «sexp in string» проверяется на непустое и использует back-to-indentation/current-column. –

0

Как отредактировать раздел, снятый в отдельном буфере? Это позволит использовать режим python со всеми его возможностями.

Здесь первый проект - исходная строка будет храниться в уничтожений кольце:

(defun temp-edit-docstring() 
    "Edit docstring in python-mode. " 
    (interactive "*") 
    (let ((orig (point)) 
    (pps (parse-partial-sexp (point-min) (point)))) 
    (when (nth 3 pps) 
     (let* (;; relative position in string 
     (relpos (- orig (+ 2 (nth 8 pps)))) 
     (beg (progn (goto-char (nth 8 pps)) 
      (skip-chars-forward (char-to-string (char-after)))(push-mark)(point))) 

     (end (progn (goto-char (nth 8 pps)) 
      (forward-sexp) 
      (skip-chars-backward (char-to-string (char-before))) 
      (point))) 

     (docstring (buffer-substring beg end))) 
    (kill-region beg end) 
    (set-buffer (get-buffer-create "Edit docstring")) 
    (erase-buffer) 
    (switch-to-buffer (current-buffer)) 
    (insert docstring) 
    (python-mode) 
    (goto-char relpos))))) 

Когда все будет готово, скопируйте содержимое обратно в первоначальный буфер. Это еще предстоит реализовать.

+0

Спасибо (но не то, что я буду использовать, так как у меня много меньших многострочных строк, поэтому нецелесообразно использовать отдельный буфер). –