0

最新のパッチを適用した Ubuntu 9.04 を実行している HP ノートブックで GNU Emacs 22.2.1 を実行しています。

最近、いくつかの PHP コードを処理する必要があるため、Ubuntu の php-mode パッケージを追加しました。.emacs にあるもので基本をカバーできると考えました。よくほとんど。次の短いスニペットは、症状を示しています。

<?php
# main()
/*
 *
 *
 */
{
    $fpath="/tmp";
    // This is a comment
    if (!file_exists($fpath)) {
        // This is another comment
        print "$fpath doesn't exist on the system!\n";
        exit(1);
    } elseif (!is_dir($fpath)) {
        print "$fpath is not a directory\n";
        exit(2);
    } else
          // I don't know why it doesn't use the } as the anchor position
          // in PHP, but in C and C++?
          print "Found $fpath on the system. Good...\n";
} # end of main()

2 つのコメントと print ステートメントの両方が、私が望んでいた 4 つではなく、6 つのスペースでオフセットされていることに注意してください。私は単純な .emacs しか持っていません。C/C++ の場合は次のとおりです。これは、私が最も広く使用する 2 つの言語です。

[...]
(defconst my-c-style
  '((c-comment-only-line-offset . 0)
    (c-hanging-braces-alist     . ((substatement-open after)
                                   (brace-list-open)))
    (c-hanging-colons-alist     . ((member-init-intro before)
                                   (inher-intro)
                                   (case-label after)
                                   (label after)
                                   (access-label after)))
    (c-cleanup-list             . (scope-operator
                                   empty-defun-braces
                                   defun-close-semi))
    (c-offsets-alist            . ((arglist-close . c-lineup-arglist)
                                   (substatement-open . 0)
                                   (case-label        . 4)
                                   (block-open        . 0)
                                   (defun-block-intro . 0)
                                   (statement-block-intro . 4)
                                   (substatement . 4)
                                   (knr-argdecl-intro . -)))
    (c-echo-syntactic-information-p . t)
    )
  "My C Programming Style")

;; Customizations for all of c-mode, c++-mode, and objc-mode
(defun my-c-mode-common-hook ()
  ;; add my personal style and set it for the current buffer
  (c-add-style "PERSONAL" my-c-style t)
  ;; offset customizations not in my-c-style
  (c-set-offset 'defun-block-intro' +)
  ;; other customizations
  ;
  (setq-default indent-tabs-mode nil)

  ;; make sure that comments don't get moved when you do a //
  (c-set-offset 'comment-intro 0)
  ;; keybindings for all supported languages.  We can put these in
  ;; c-mode-base-map because c-mode-map, c++-mode-map, objc-mode-map,
  ;; java-mode-map, and idl-mode-map inherit from it.
  (define-key c-mode-base-map "\C-m" 'newline-and-indent)
  )

(add-hook 'c-mode-common-hook 'my-c-mode-common-hook)
(require 'php-mode)
[...]

私が困惑しているのは、C または C++ では、emacs が必要に応じてコードをインデントできることです。

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    [...]
    if ((cond = strcmp(word, mid->word)) < 0) {
        high = mid;
        low = mid - 1;
    } else if (cond > 0) {
        low = mid + 1;
        high = mid + 2;
    } else
        return mid;
}

CC モードのマニュアルをもう一度見直しましたが、emacs がそのように振る舞う原因がわかりませんでした。私は典型的な Cc Cs を実行しましたが、構文要素は PHP でも「ステートメント」です。そのため、なぜ PHP の場合、emacs は else の「e」をオフセット計算のアンカーとして使用しますが、C/C++ ではそれを使用します。右中括弧 '}' は正しいですか? ヒントや指針をいただければ幸いです。

4

1 に答える 1

0

あなたの問題は、他の後に{が欠けていることです。Emacsはあなたが他を続けているかのようにインデントしています。{を追加すると、正常に機能します

于 2009-10-03T15:46:43.687 に答える