Существует ли существующая функция Emacs, которая добавляет символ под точкой в __all__
при редактировании кода Python?
Например, скажем, курсор был на первом o
в foo
:
# v---- cursor is on that 'o'
def foo():
return 42
Если бы вы сделали M-x python-add-to-all (или что-то еще), это добавило бы 'foo'
к __all__
.
Я не видел ни одного, когда гуглял, но, как всегда, возможно, я упускаю что-то очевидное.
Обновление
Я опробовал Ответ Трея Джексона (спасибо, Трей!) И сделал несколько исправлений / улучшений, на случай, если кому-то интересно (больше не будет вставлять дважды, и ставит __all__
в более типичное место, если оно еще не существует):
(defun python-add-to-all ()
"Take the symbol under the point and add it to the __all__
list, if it's not already there."
(interactive)
(save-excursion
(let ((thing (thing-at-point 'symbol)))
(if (progn (goto-char (point-min))
(let (found)
(while (and (not found)
(re-search-forward (rx symbol-start "__all__" symbol-end
(0+ space) "=" (0+ space)
(syntax open-parenthesis))
nil t))
(setq found (not (python-in-string/comment))))
found))
(when (not (looking-at (rx-to-string
`(and (0+ (not (syntax close-parenthesis)))
(syntax string-quote) ,thing (syntax string-quote)))))
(insert (format "\'%s\', " thing)))
(beginning-of-buffer)
;; Put before any import lines, or if none, the first class or
;; function.
(when (not (re-search-forward (rx bol (or "import" "from") symbol-end) nil t))
(re-search-forward (rx symbol-start (or "def" "class") symbol-end) nil t))
(forward-line -1)
(insert (format "\n__all__ = [\'%s\']\n" thing))))))