Трудность с добавлением отступа Emacs

Я действительно пытаюсь переключиться на 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. Кто-либо?

---ОТРЕДАКТИРУЙТЕ К ADD МОЙ ЦЕЛЫЙ .emacs (на самом деле ~/.emacs.d/init.el)

; 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)
8
задан Luke Girvin 22 February 2012 в 21:09
поделиться

3 ответа

Ваши настройки по умолчанию, возможно, отменяются функцией стиля cc-mode .

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

(setq c-default-style '((java-mode. "Java") (awk-mode. "Awk") (other. "User")))

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

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

3
ответ дан 5 December 2019 в 11:23
поделиться

В EmacsWiki есть хорошая статья о IndentingC.

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

6
ответ дан 5 December 2019 в 11:23
поделиться

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

Открытая фигурная скобка после оператора if имеет смещение с именем. Если вы измените значение смещения, открытый фигурный будет иметь другой отступ. Точно так же открытая фигурная скобка после объявления функции имеет именованное смещение. Продолжение строк в макросе имеет именованное смещение. Метки case в операторе switch, циклы do 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)

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

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

alt text

6
ответ дан 5 December 2019 в 11:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: