2010-03-17 4 views
8

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

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

if(asdf) 
{ 
    asdr = 1; 
} 

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

if(asdf) { 
    asdr = 1; 
} 

I не может изменить размер отступа от 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. Кто-нибудь?

--- EDIT ДОБАВИТЬ Вся моя .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) 

ответ

3

Ваши настройки по умолчанию, возможно, быть переопределены cc-mode «s особенность стиля.

Try инициализация стиля по умолчанию, как это:

(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-statements, как вы хотите.

+0

Я попытался вставить строку, которую написал и погрузо-файл, но я все еще вижу ГНУ стандарт. Я также пробовал с «stroustrup» и «python», никакой разницы. – Gauthier

+0

У вас есть файл настроек, который загружается и переопределяет ваши настройки? Кроме того, я не уверен в использовании setq-default с переменными стиля пользователя - можете ли вы попробовать простой setq? (Это не объясняет, почему strustrup/python не работает.) – Doug

+0

Я так не думаю. Я добавил все свои .emacs в исходное сообщение, я думаю, это может помочь. С «пользователем» я почти получаю то, что хочу. Вкладки не заменяются пробелами, я не понимаю почему. – Gauthier

6

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

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

+0

'(setq c-default-style" k & r ")' работал! Я не знаю, почему строка, которую написал Дуг, не сделала. Возможно, я поместил его в неправильное место в моих .emacs. Но когда я использую это, вкладки остаются символами табуляции, хотя я сказал им заменить их пробелами на '(setq-default indent-tabs-mode nil)'. – Gauthier

+0

yap. При изменении инициализации.el, обычно я держу один экземпляр emacs открытым для редактирования файла init.el, а затем открываю и закрываю другой экземпляр для проверки изменений. – Cheeso

6

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

Открытое курение после оператора if имеет смещение с именем. Если вы измените значение смещения, курсор будет иметь отступы по-разному. Аналогично, открытый курсор после объявления функции имеет именованное смещение. Продолжение линии в макросе имеет именованное смещение. Ярлыки case в инструкции switch делают while while. У всех есть смещения. Есть миллион «em», все хранятся в переменной под названием 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, что подразумевает, сохранить отступ такой же, как в предыдущей строке
  • + подразумевая, увеличения отступ, один дополнительный уровень
  • - подразумевающий, дек. ase отступ, один дополнительный уровень

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

(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) 

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

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

alt text http://i44.tinypic.com/262nlup.jpg

+0

Благодарим вас за подробный ответ. Это для создания нового стиля. Что делать, если я хочу перейти из одного стиля (например, K & R) и изменить его, чтобы добавить '(setq indent-tabs-mode nil)'? – Gauthier

+0

вы можете сделать это, используя крючок c-mode. Посмотрите, что я написал выше для 'doug-c-mode-hook-fn'. Просто замените '(c-set-style" myCStyle ")' на '(c-set-style" k & r ")'. См. Cc-styles.el для большего количества стилей. – Cheeso

Смежные вопросы