Emacs中的自动缩进Javascript代码(bsd样式又称Allman样式)

Emacs中的自动缩进Javascript代码(bsd样式又称Allman样式),javascript,emacs,indentation,auto-indent,Javascript,Emacs,Indentation,Auto Indent,我无法将Emacs设置为使用Javascript。我希望Emacs在按下“{”和“}”时自动缩进。当我在C上编写代码时,它工作得非常好。当我按下“}”时,括号会移到它的位置。 我想看看这样的东西: 但我明白了: 我不明白为什么括号还在 你能告诉我,我该怎么做才能把事情做好吗 我想,我需要在.emacs文件中添加一些内容,不是吗 这是我的.emacs: (setq c-default-style "bsd" c-basic-offset 4) (setq-default c-ba

我无法将Emacs设置为使用Javascript。我希望Emacs在按下“{”和“}”时自动缩进。当我在C上编写代码时,它工作得非常好。当我按下“}”时,括号会移到它的位置。 我想看看这样的东西:

但我明白了:

我不明白为什么括号还在

你能告诉我,我该怎么做才能把事情做好吗

我想,我需要在.emacs文件中添加一些内容,不是吗

这是我的.emacs:

(setq c-default-style "bsd" 
      c-basic-offset 4)
(setq-default c-basic-offset 4
              tab-width 4
              indent-tabs-mode nil)

(setq make-backup-files nil
      auto-save-default nil
      auto-save-list-file-name nil)


(global-set-key (kbd "RET") 'newline-and-indent)                           

(show-paren-mode t) ; Highlight expression between {}, (), []
(setq show-paren-style 'parenthesis) ; parenthesis | expression | mixed

(add-hook 'html-mode-hook
            (lambda ()
                  ;; Default indentation is usually 2 spaces, changing to 4.
                  (set (make-local-variable 'sgml-basic-offset) 2)
                  (setq tab-width 2)
            )
)

(setq font-lock-maximum-decoration
      '((html-mode . 1)))

(setq column-number-mode t)

;(electric-pair-mode t)
;(setq electric-pair-preserve-balance nil)
;(electric-indent-mode -1)


; 80 letters rule (highlight)
(setq-default
  whitespace-line-column 78
   whitespace-style       '(face lines-tail))
(add-hook 'prog-mode-hook #'whitespace-mode) ; only if I write code
(add-hook 'text-mode-hook #'whitespace-mode) ; and the other cases

; Use all c-mode settings when I code on javascript (indent, tab-width, ...)
;(add-hook 'js-mode-hook 'c-mode)

;(add-hook 'js-mode-hook #'c-default-style)

;(add-to-list 'auto-mode-alist '("\\.js\\'" . c-mode))

尝试js2模式。它有更好的样式和缩进。 顺便说一句,您可能不应该像这样在.emacs中编写所有内容。 文件结构可能类似于

|.emacs
| -- <your mode files.el> 
在下面

roles--> emacs --> files

你可以看一看作为参考。它并不完美,但结构更好

我找不到任何内置函数或现成的解决方案,所以我阅读了emacs文档并编写了自己的emacs lisp函数。也许有人会需要它

(global-set-key (kbd "RET") 'newline-and-indent)

(add-hook 'js-mode-hook
    (lambda()
        (local-set-key (kbd "{")
            (lambda() (interactive)
                (my-bsd-lparen-align)
                (insert "{")
            )
        )
        (local-set-key (kbd "}")
            (lambda() (interactive)
                (insert "}")
                (indent-according-to-mode)
                ;(c-indent-command)                                             
            )
        )
    )
)


(defun my-bsd-lparen-align()
    (skip-chars-forward " \t")
    (setq cur_pos (point))
    (my-line-begin)
    (setq new_pos (point))
    (goto-char cur_pos)
    (if (eq cur_pos new_pos)
        (__my-bsd-lparen-put)
    )
)

(defun my-line-begin()
    (beginning-of-line)
    (skip-chars-forward " \t")
    (current-column)
)

(defun __my-bsd-lparen-put()
    (setq init_pos (point))
    (setq cur_start (my-line-begin))
    (forward-line -1)
    (setq block_start (my-line-begin))
    (setq diff (- cur_start block_start))
    (goto-char init_pos)
    (if (>= diff 0)
        (delete-backward-char diff)
        (loop for i from 1 to (- diff) do (insert " "))
    )
)

我试过了。同样的结果。更具绘画色彩的突出显示,但家长身份不动。嗯,不知道你为什么会这样。我在windows和linux上都试过了,似乎效果不错。如果您可以提供更多信息(emacs+平台的版本)并链接您的.emacs,那么任何人都可以更轻松地为您提供具体的答案。您是使用内置js模式还是?我想说您的行
(全局设置键(kbd“RET”)'换行和缩进)
可能有问题。你能试试不穿吗?(之后,根据模式缩进)构建在js模式中。
(global-set-key (kbd "RET") 'newline-and-indent)

(add-hook 'js-mode-hook
    (lambda()
        (local-set-key (kbd "{")
            (lambda() (interactive)
                (my-bsd-lparen-align)
                (insert "{")
            )
        )
        (local-set-key (kbd "}")
            (lambda() (interactive)
                (insert "}")
                (indent-according-to-mode)
                ;(c-indent-command)                                             
            )
        )
    )
)


(defun my-bsd-lparen-align()
    (skip-chars-forward " \t")
    (setq cur_pos (point))
    (my-line-begin)
    (setq new_pos (point))
    (goto-char cur_pos)
    (if (eq cur_pos new_pos)
        (__my-bsd-lparen-put)
    )
)

(defun my-line-begin()
    (beginning-of-line)
    (skip-chars-forward " \t")
    (current-column)
)

(defun __my-bsd-lparen-put()
    (setq init_pos (point))
    (setq cur_start (my-line-begin))
    (forward-line -1)
    (setq block_start (my-line-begin))
    (setq diff (- cur_start block_start))
    (goto-char init_pos)
    (if (>= diff 0)
        (delete-backward-char diff)
        (loop for i from 1 to (- diff) do (insert " "))
    )
)