Функция отступов Emacs - PullRequest
       25

Функция отступов Emacs

4 голосов
/ 23 марта 2012

Я работаю в cc-mode в Emacs и нахожу отступ очень и очень раздражающим.

Как пользователь VIM, я в значительной степени привык к длинным отступам, а также к тому, чтобы позволить себе нажимать на табуляцию так, как мне хочется.

В Emacs мой TAB сопоставлен с goto-line. Во-первых, какая функция предназначена для отступа текущей строки (или что после точки)? indent-region раздражает, так как вам нужно выделить регион.

Во-вторых, как лучше исправить отступ?

Спасибо,

Ответы [ 3 ]

8 голосов
/ 23 марта 2012

Вы можете увидеть, какой тип табуляции в настоящее время используется с M-x describe-variable RET c-indentation-style (но, как указано в документации, не устанавливайте эту переменную напрямую, вместо этого используйте M-x c-set-style).

Переменная c-basic-offset - это то, что управляет вкладками в cc-mode, и по умолчанию она равна set-from-style, что означает, что вкладки будут унаследованы от того стиля C, который вы используете. установите M-x set-c-style, что позволит вам выбрать из набора встроенных стилей (см. ниже) или вы можете создать свой собственный стиль . Вы можете увидеть, как стили определяются с помощью M-x describe-variable RET c-style-alist, а затем вы можете использовать один из них в качестве шаблона с M-x c-add-style.

  • gnu - стиль кодирования, благословленный Free Software Foundation для кода C в программах GNU.
  • k & r - Классический стиль Кернигана и Ричи для кода C.
  • bsd - также известный как «стиль Allman» после Эрика Аллмана.
  • whitesmith - Популяризован примерами, которые пришли с Whitesmiths C, ранним коммерческим компилятором C.
  • stroustrup - Классический стиль Страуструпа для кода C ++.
  • ellemtel - Популярные стандарты кодирования C ++, определенные в «Программирование на C ++, правила и рекомендации», Эрик Найквист и Матс Хенриксон, Ellemtel ^ 1.
  • linux - стандарт кодирования C для Linux (ядро).
  • python - Стандарт кодирования C для модулей расширения Python ^ 2.
  • java - Стиль для редактирования кода Java. Обратите внимание, что значение по умолчанию для c-default-style устанавливает этот стиль при входе в режим java.
  • awk - Стиль для редактирования кода AWK. Обратите внимание, что значение по умолчанию для c-default-style устанавливает этот стиль при входе в awk-mode.
  • пользователь - Это особый стиль, созданный вами. Он состоит из заводских настроек по умолчанию для всех переменных стиля, измененных настройками, которые вы делаете либо с помощью интерфейса настройки, либо путем написания setqs и c-set-offset на верхнем уровне вашего файла .emacs (см. Основы конфигурации). Система стилей создает этот стиль как часть своей инициализации и не изменяет его впоследствии.

UPDATE:

Другие предложили использовать клавишу tab для вставки символа табуляции \t, но, пожалуйста, не принудительно вставляйте символ табуляции! Как говорит один из создателей StackOverflow «только дебил будет использовать вкладки для форматирования своего кода» . Это немного грубо, но стоит отметить, что даже два самых гигантских конкурента, Google и Microsoft , согласны с этим (хотя они по умолчанию рекомендуют другое количество пробелов) ).

Google говорит :

Используйте только пробелы и отступайте 2 пробела одновременно.

Microsoft говорит :

Символы табуляции (\ 0x09) не должны использоваться в коде. Все отступы должно быть сделано с 4 пробелами.

Кроме того, в emacswiki есть раздел на Вкладки зла .

Так что, иди и развернись !

0 голосов
/ 23 марта 2012

Мне тоже нравится emacs, но я терпеть не могу попытки управлять вкладками для меня. Поэтому я использую следующее в моем .emacs:

(global-set-key "\r" 'newline-and-indent)
(global-set-key "\C-m" 'newline-and-indent)
(global-set-key "\C-j" 'newline)

(defalias 'backward-delete-char-untabify 'backward-delete-char)
(defun indent-according-to-mode () (interactive)
  (save-excursion
    (goto-char (- (line-beginning-position) 1))
    (search-backward-regexp "^[         ]*")
  )
  (if (eq (point) (line-beginning-position))
    (insert (match-string 0))
    (save-excursion
      (goto-char (line-beginning-position))
      (insert (match-string 0))
    )
  )
)

(defun newline-and-indent () (interactive) (newline) (indent-according-to-mode))
(defun lisp-indent-line () (interactive) (insert "      "))
; Is there a way to fix this without a hook?
(defun my-c-hook ()
  (setq c-electric-flag nil)
  (defun c-indent-command (n) (interactive "*") (insert "       ")))
(add-hook 'c-mode-common-hook 'my-c-hook)
(defun my-perl-hook ()
  (defun perl-electric-terminator () (interactive "*") (self-insert-command 1))
  (defun perl-indent-command () (interactive "*") (insert "     ")))
(add-hook 'perl-mode-hook 'my-perl-hook)
(defun indent-for-tab-command () (interactive "*") (insert "    "))

Результирующее поведение: клавиша табуляции - это просто символ табуляции, который нужно вставить, нажатие клавиши Enter копирует точный начальный пробел (пробелы или табуляции) из текущей строки в новую строку, и все специальные свойства отступа в этих режимах отключен. Если вы используете другие языки, возможно, вам придется расширить / адаптировать вышеперечисленное, чтобы добавить для них хуки.

Примечание. В приведенном выше примере большинство пробелов в кавычках на самом деле являются буквальными символами табуляции. Если он не проходит через SO и правильно копирует / вставляет, возможно, вам придется вручную исправить это.

0 голосов
/ 23 марта 2012

Ответ: (setq-default c-basic-offset <value>)

...