Как заставить Tab вставлять заданное количество пробелов в Emacs

Я не хочу использовать вкладки в emacs, я хотел бы установить его так, чтобы нажатие клавиши табуляции вставляло заданное количество пробелов в зависимости от типа файла. Например, я хотел бы, нажав вкладку, чтобы вставить 4 пробела при работе с файлом python. Вот мой текущий файл .emacs

(setq-default indent-tabs-mode nil)
(setq tab-width 4)
(setq tab-stop-list (number-sequence 4 200 4))

В настоящее время, когда я нажимаю вкладку, она добавляет пробелы только в том случае, если это то, что emacs считает подходящим местом. Например, если бы я открыл файл Python и нажал вкладку, ничего бы не произошло. Однако, если я наберу «if:», а затем нажму вкладку в следующей строке, добавятся 4 пробела. Однако, если я снова нажму вкладку, это вернет меня к началу строки. Я думаю, я просто хотел бы сделать так, чтобы он добавлял заданное количество пробелов, простых и простых (если только кто-то не может дать мне вескую причину, почему полезно иметь цикл табуляции по строке).

Основная причина, по которой я этого хочу, заключается в том, что я работаю над проектом, в котором комментарии следуют определенному формату, предполагающему использование отступов на основе наборов из 4 пробелов. Например:

    r"""
    Return the value of the q-gamma function. 

    .. MATH::

        qgamma(z,q) = \Gamma_q (z).
    """

Итак, для строки с «qgamma» я должен начинать ее с 8 пробелов, и я хотел бы иметь возможность сделать это, дважды нажав табуляцию. Однако emacs не считает, что это подходящее место для двойного перехода по табуляции, поэтому всякий раз, когда я нажимаю табуляцию дважды, я возвращаюсь к началу строки.

Спасибо!

Изменить: проверка основной переменной режима говорит о том, что она находится в режиме Python.


person Zach    schedule 12.01.2017    source источник
comment
Вы можете добавить, какой основной режим вы используете для редактирования файлов Python.   -  person D Krueger    schedule 13.01.2017


Ответы (2)


Если вы используете встроенный python.el, вы можете установить indent-line-function в indent-relative вместо python-indent-line-function в python-mode-hook.

(defun jpk/python-mode-hook ()
  (setq indent-line-function #'indent-relative))
(add-hook 'python-mode-hook #'jpk/python-mode-hook)

Каждый основной режим имеет свою собственную функцию отступа, на которую указывает переменная indent-line-function. indent-relative - это очень простая универсальная функция отступа, которая используется для fundamental-mode (самый простой основной режим).


Python немного странный в Emacs тем, что имеет два широко используемых основных режима: встроенный python.el и сторонний python-mode.el. Используйте то, что хотите, но помните, что вы используете и на какие люди ссылаются в статьях и ответах SO.

person jpkotta    schedule 14.01.2017

M-x customize, найдите py-tab-indent, выключите и Apply. Я считаю, что это то поведение, которое вы ищете. Проверьте это, и если да, Apply and Save настройку.

Отметив, как указал @jpkotta, приведенное выше предназначено для python-mode.el, а не для встроенного python.el.

person Justin Schell    schedule 13.01.2017
comment
Это для python-mode.el, что не то же самое, что встроенное в python.el. - person jpkotta; 14.01.2017
comment
Извините, он упомянул режим Python. Я думал, что он имел в виду пакет режима Python. - person Justin Schell; 14.01.2017
comment
Это все еще неоднозначно. Основной режим - python-mode для обоих. Я не указывал, что ваш ответ какой-то плохой, просто вы должны отметить, какой режим Python вы имеете в виду. - person jpkotta; 15.01.2017