1

次のコード/テキストがあります。

def f():
    """
    Return nothing.

    .. NOTE::

        First note line
second note line

Emacs23(23.4.1)では、最後の行(「2番目のメモ行」;この行がどのようにインデントされていても)でTABを押すことができ、次のように正しく配置されました。

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

つまり、複数行の文字列ブロックを整列しますが、前の行には依存しません。

docstring のみに影響します。コードは私が望むようにインデントされています。を使用してpython-modeいます。TAB を押すとブロックが正しく整列するように、これを変更するにはどうすればよいですか?

4

2 に答える 2

0

別のバッファで非文字列化されたセクションを編集するのはどうですか? これにより、すべての機能を備えた python-mode が可能になります。

最初のドラフト - 元の文字列は kill-ring に保存されます:

(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)))))

準備ができたら、コンテンツを元のバッファにコピーします。これはまだ実装されていません。

于 2015-08-19T06:55:10.147 に答える
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)

古い Emacs の古い defadvice を使用して、同じ効果を達成できます。

(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)
于 2015-08-17T21:25:32.097 に答える