Трудность с отступом Emacs - PullRequest
8 голосов
/ 17 марта 2010

Я действительно пытаюсь перейти на emacs, но научиться настраивать среду - настоящая боль. Все говорят, что это того стоит, поэтому я просто продолжаю.

Я хочу, чтобы мой код на c был реализован таким образом:

if(asdf)
{
    asdr = 1;
}

В зависимости от текущего стандарта (я знаю, не заводите меня), может быть:

if(asdf) {
    asdr = 1;
}

Я не могу изменить размер отступа от 2, он всегда выглядит как стандарт GNU:

if(asdf)
  {
    asdr = 1;
  }

, что мне не нравится. Вот что я положил в мой .emacs:

; Warn in C for while();, if(x=0), ...
(global-cwarn-mode 1)

; no electric mode in c
(c-toggle-electric-state -1)
; indent the current line only if the cursor is at the beginning of the line
(setq-default c-tab-always-indent nil)
(setq-default c-indent-level 4)
(setq-default tab-width 4)
(setq-default indent-tabs-mode nil)
(setq-default c-basic-offset 4)
(setq-default c-basic-indent 4)
; These commands I read about on the web, but they don't work?
;(highlight-tabs)
;(highlight-trailing_whitespace)

Это не помогло, у меня все еще есть отступ GNU. Кто-нибудь?

--- РЕДАКТИРОВАТЬ, ЧТОБЫ ДОБАВИТЬ МОЙ ВЕС. ; directory to put various el files into (add-to-list 'load-path "C:/Program/emacs-22.3/includes") ; loads ruby mode when a .rb file is opened. (autoload 'ruby-mode "ruby-mode" "Major mode for editing ruby scripts." t) (setq auto-mode-alist (cons '(".rb$" . ruby-mode) auto-mode-alist)) (setq auto-mode-alist (cons '(".rhtml$" . html-mode) auto-mode-alist)) (add-hook 'ruby-mode-hook (lambda() (add-hook 'local-write-file-hooks '(lambda() (save-excursion (untabify (point-min) (point-max)) (delete-trailing-whitespace) ))) (set (make-local-variable 'indent-tabs-mode) 'nil) (set (make-local-variable 'tab-width) 2) (imenu-add-to-menubar "IMENU") (define-key ruby-mode-map "\C-m" 'newline-and-indent) ;Not sure if this line is 100% right but it works! (require 'ruby-electric) (ruby-electric-mode t) )) ; Install mode-compile to give friendlier compiling support! (autoload 'mode-compile "mode-compile" "Command to compile current buffer file based on the major mode" t) (global-set-key "\C-cc" 'mode-compile) (autoload 'mode-compile-kill "mode-compile" "Command to kill a compilation launched by `mode-compile'" t) (global-set-key "\C-ck" 'mode-compile-kill) (show-paren-mode 1) ; Color theme (require 'color-theme) (color-theme-pok-wog) ;;Emacs.pane.menubar.* does not seem to work? ;Emacs.pane.menubar.background: darkGrey ;Emacs.pane.menubar.foreground: black ; Default font 9 pt (set-face-attribute 'default nil :height 80) (custom-set-variables ;; custom-set-variables was added by Custom. ;; If you edit it by hand, you could mess it up, so be careful. ;; Your init file should contain only one such instance. ;; If there is more than one, they won't work right. ) (custom-set-faces ;; custom-set-faces was added by Custom. ;; If you edit it by hand, you could mess it up, so be careful. ;; Your init file should contain only one such instance. ;; If there is more than one, they won't work right. '(font-lock-comment-face ((t (:foreground "limegreen" :slant oblique)))) '(font-lock-preprocessor-face ((t (:inherit font-lock-builtin-face :foreground "orange" :weight bold))))) (global-set-key [C-tab] 'other-window) (global-set-key [C-S-tab] (lambda () (interactive) (other-window -1))) (defun linux-c-mode () "C mode with adjusted defaults for use with the Linux kernel." (interactive) (c-mode) (setq c-indent-level 8) (setq c-brace-imaginary-offset 0) (setq c-brace-offset -8) (setq c-argdecl-indent 8) (setq c-label-offset -8) (setq c-continued-statement-offset 8) (setq indent-tabs-mode nil) (setq tab-width 8)) ; Warn in C for while();, if(x=0), ... (global-cwarn-mode 1) ; no electric mode in c (c-toggle-electric-state -1) ; indent the current line only if the cursor is at the beginning of the line (setq-default c-tab-always-indent nil) (setq-default c-indent-level 4) (setq-default tab-width 4) (setq indent-tabs-mode nil) (setq-default c-basic-offset 4) (setq-default c-basic-indent 4) ; These commands I read about on the web, but they don't work? ;(highlight-tabs) ;(highlight-trailing_whitespace) (setq indent-tabs-mode nil) (setq c-default-style "user") ;; Remove lull: scroll bar, tool bar, menu bar. (if (fboundp 'scroll-bar-mode) (scroll-bar-mode -1)) (if (fboundp 'tool-bar-mode) (tool-bar-mode -1)) (if (fboundp 'menu-bar-mode) (menu-bar-mode -1)) ;; restore window size as it was at previous use (defun restore-saved-window-size() (unless (load "~/.emacs.d/whsettings" t nil t) (setq saved-window-size '(80 30))) (nconc default-frame-alist `((width . ,(car saved-window-size)) (height . ,(cadr saved-window-size))))) (restore-saved-window-size) (defun save-window-size-if-changed (&optional unused) (let ((original-window-size `(,(frame-width) ,(frame-height)))) (unless (equal original-window-size saved-window-size) (with-temp-buffer (setq saved-window-size original-window-size) (insert (concat "(setq saved-window-size '" (prin1-to-string saved-window-size) ")")) (write-file "~/.emacs.d/whsettings"))))) (add-hook 'window-size-change-functions 'save-window-size-if-changed) ;; Ack as a replacment for grep (global-set-key "\M-s" 'ack) (require 'ack)

Ответы [ 3 ]

6 голосов
/ 17 марта 2010

EmacsWiki имеет хорошую статью о IndentingC .

На самом деле, в EmacsWiki есть хорошие статьи обо всем. Я бы не хотел изучать Emacs до того, как он существовал.

6 голосов
/ 17 марта 2010

Отступ в cma-режиме emacs регулируется набором смещений, каждое из которых может быть установлено в соответствии с именем, прикрепленным к смещению.

Открытое-фигурное после оператора if имеет смещение с именем. Если вы измените значение смещения, open-curly будет иметь отступ по-другому Аналогично, open-curly после объявления функции имеет именованное смещение. Продолжения строк в макросе имеют именованное смещение. Метки дел в операторе switch делают циклы while. Все они имеют смещения. Их существует миллион, и все они хранятся в переменной с именем c-offsets-alist.

Стили, упомянутые в других местах, предоставляют «базовое смещение», которое обычно составляет 2, 4 или 8 пробелов, а затем значение для c-offsets-alist. У каждого стиля также есть имя, и вы можете создавать собственные стили из других стилей. Как это:

(c-add-style "myCStyle"
  '("bsd"  ; this must be defined elsewhere - it is in cc-modes.el
  (c-basic-offset . 4)
  (c-echo-syntactic-information-p . t)
  (c-comment-only-line-offset . (0 . 0))
  (c-offsets-alist . (
    (c                     . c-lineup-C-comments)
    (statement-case-open   . 0)
    (case-label            . +)
    (substatement-open     . 0)
    ))
  ))

Значение для каждого именованного смещения в c-offsets-alist является одним из:

  • 0 подразумевается, оставить отступ таким же, как и в предыдущей строке
  • + подразумевается, увеличить отступ, один дополнительный уровень
  • - подразумевается, уменьшить отступ, один дополнительный уровень

Вы также можете использовать ++, - и так далее. Поместите нечто подобное, чтобы определить стиль, в своем файле .emacs. Затем, чтобы автоматически использовать этот стиль при редактировании файлов C, используйте c-set=style в хуке c-mode, например:

(defun doug-c-mode-hook-fn ()
  (cond (window-system
     ;; use my defined style for all C modules
     (c-set-style "myCStyle")
     ;; never convert leading spaces to tabs
     (setq indent-tabs-mode nil)
       ....
  )))

(add-hook 'c-mode-hook 'doug-c-mode-hook-fn)

Следующий вопрос: как определить, какое из названных смещений вам нужно установить для какой-либо конкретной ситуации? Для этого есть приложение. хорошо, не приложение, а функция elisp.

M-x c-set-offset
Отображает, где, по мнению emacs, он находится в исходном файле режима cc. Чтобы использовать это, поместите курсор в положение, в котором вы хотите узнать имя смещения, или измените смещение. Затем вызовите эту функцию. Он сообщит вам имя смещения для текущего синтаксического элемента.
Если вы измените значение этого именованного элемента в вашем c-offsets-alist для выбранного вами стиля, то, что обычно делается в .emacs или аналогичном ему, тогда отступ значение будет истинным для всех исходных модулей.

alt text

3 голосов
/ 17 марта 2010

Ваши значения по умолчанию могут быть переопределены функцией стиля cc-mode.

Попробуйте инициализировать стиль по умолчанию следующим образом:

(setq c-default-style '((java-mode . "java") (awk-mode . "awk") (other . "user")))

Вы сможете вставить предыдущую строку в файл .emacs или настроить переменную c-default-style. По умолчанию (other "gnu") является последним элементом списка, что означает, что все файлы не-Java и не-awk получают стиль gnu вместо того, что вы установили с помощью setq. Специальный стиль user инициализируется из установленных вручную переменных стиля.

Другим вариантом является выбор одного из встроенных стилей вместо определения его самостоятельно или создание собственного стиля с помощью функции c-add-style. Для этого измените "user" в приведенной выше команде на имя стиля (в виде строки). Попробуйте встроенные стили stroustrup или python, чтобы форматировать операторы if так, как вы хотите.

...