Emacs глобальная конфигурация вкладок - PullRequest
6 голосов
/ 02 июля 2010

Я пытаюсь переключиться с Vim на Emacs, но я рву свои волосы, пытаясь настроить его так, чтобы он обрабатывал вкладки так, как я хочу. Я требую:

  • Вставленные «вкладки» для расширения в два пробела. Emacs упорно не прилипает к восьми, независимо от того, что я делаю.
  • Вкладки (то есть реальные \t символов), которые должны быть представлены на экране двумя пробелами.
  • Нажатие клавиши TAB должно вставить вкладку в курсор вместо для отступа всей строки . В настоящее время я нажимаю TAB в любом месте, и Emacs уничтожает все пробелы в начале строки; это самая бешеная вещь на данный момент.

Мой текущий ~/.emacs читает

(setq standard-indent 2)
(setq-default indent-tabs-mode nil)

но я не пробовал ни одного конца предложенных конфигураций из Интернета, ни одна из которых не сделала то, что они сказали, что они будут. (API постоянно меняется? Я использую GNU Emacs 23.1.1, по-видимому.)

Ответы [ 3 ]

7 голосов
/ 02 июля 2010

Emacs имеет чрезвычайно гибкую поддержку для обработки отступов.Как правило, режим, в котором вы находитесь, диктует, как они работают - поэтому, если вы работаете с файлом C, то способ нажатия кнопки Tab будет отличаться от способа работы с файлом Python.

Итакэто зависит от того, в каком режиме вы работаете, что ограничит ответы, которые вы получите.В большинстве случаев я бы порекомендовал вам не бороться с этим - для меня поведение отступов - одна из лучших особенностей emacs.Однако вам нужно потратить время на то, чтобы настроить его под себя.

Чтобы изменить способ отображения вкладок, необходимо установить ширину вкладки равной 2. Если вы редактируете код в стиле Java или C, тогдазвучит так, как будто вы хотите отключить все замечательные функции отступов для NIL:

  • c-tab-всегда-отступ
  • c-синтаксический-отступ
  • indent-tabs-mode

Я предлагаю вам установить их через интерфейс настройки.Если вы используете «Mx customize-group RET C», вы можете увидеть различные настройки режима C.

Если вы редактируете файлы разных типов, то инструкции будут другими.

Возможно, emacs находится в неправильном режиме для вашего файла.Вы можете попробовать выполнить «Mx basic-mode», чтобы увидеть, предпочитаете ли вы такое поведение.

4 голосов
/ 02 июля 2010
;; * Inserted "tabs" to be expanded into two spaces. Emacs stubbornly
;;   sticks to eight, no matter what I do.

;; * Tabs (i.e. real \t characters) to be represented on screen by two
;;   spaces.

(setq-default tab-width 2)


;; * Pressing TAB should insert a tab at the cursor rather than indent
;;   the entire line. Currently, I press TAB anywhere and Emacs
;;   destroys all whitespace at the start of the line; this is the
;;   most infuriating thing so far.

(setq-default indent-tabs-mode t)

(mapcar (lambda (hooksym)
          (add-hook hooksym
                    (lambda ()
                      (kill-local-variable 'indent-tabs-mode)
                      (kill-local-variable 'tab-width)
                      (local-set-key (kbd "TAB") 'self-insert-command))))

        '(
          c-mode-common-hook

          ;; add other hook functions here, one for each mode you use :-(
          ))

;; How to know the name of the hook function?  Well ... visit a file
;; in that mode, and then type C-h v major-mode RET.  You'll see the
;; mode's name in the *Help* buffer (probably on the second line).

;; Then type (e.g.) C-h f python-mode; you'll see blather about the
;; mode, and (hopefully) somewhere in there you'll see (again e.g.)
;; "This mode runs the hook `python-mode-hook', as the final step
;; during initialization."
1 голос
/ 02 июля 2010

Это должно получить вам большую часть того, что вы хотите.Возможно, вам придется настроить некоторые другие режимы программирования, которые вы обычно используете.

(defun insert-tab ()
  "self-insert-command doesn't seem to work for tab"
  (interactive)
  (insert "\t"))
(setq indent-line-function 'insert-tab)  ;# for many modes
(define-key c-mode-base-map [tab] 'insert-tab) ;# for c/c++/java/etc.
(setq-default tab-width 2)
...