static T _instance; 
Fichier pour ajouter le support D dans Emacs.
Fichier d-mode.el :
(eval-when-compile
 (require 'cc-langs)
 (require 'cc-fonts)
(eval-and-compile
 ;; Make our mode known to the language constant system. Use Java
 ;; mode as the fallback for the constants we don't change here.
 ;; This needs to be done also at compile time since the language
 ;; constants are evaluated then.
 (c-add-language 'd-mode 'java-mode))
(c-lang-defconst c-identifier-ops
 ;; For recognizing "~this", ".foo", and "foo.bar.baz" as identifiers
 d '((prefix "~")(prefix ".")(left-assoc ".")))
(c-lang-defconst c-after-id-concat-ops
 ;; Also for handling ~this
 d '("~"))
(c-lang-defconst c-string-escaped-newlines
 ;; Set to true to indicate the D handles backslash escaped newlines in strings
 d t)
(c-lang-defconst c-multiline-string-start-char
 ;; Set to true to indicate that D doesn't mind raw embedded newlines in strings
 d t)
(c-lang-defconst c-opt-cpp-prefix
 ;; Preprocssor directive recognizer. D doesn't have cpp, but it has #line
 d "\\s *#\\s *")
(c-lang-defconst c-assignment-operators
 ;; List of all assignment operators.
 d '("=" "*=" "/=" "%=" "+=" "-=" "»=" "«=" "»>=" "&=" "^=" "|=" "~="))
(c-lang-defconst c-other-op-syntax-tokens
 "List of the tokens made up of characters in the punctuation or
parenthesis syntax classes that have uses other than as expression
operators."
 d '("/+" "+/" "…" ".." "!" "*" "&"))
(c-lang-defconst c-literal-start-regexp 
 ;; Regexp to match the start of comments and string literals.
 d "/[*+/]\\|\"\\|`")
(c-lang-defconst c-doc-comment-start-regexp
 ;; doc comments for D use "///", "/**" or doxygen's "/*!" "//!"
 d "/\\*[*!]\\|//[/!]")
(c-lang-defconst c-primitive-type-kwds
 d '("bit" "byte" "ubyte" "char" "delegate" "double" "float" "function" 
 "int" "long" "ubyte" "short" "uint" "ulong" "ushort" "cent" "ucent" 
 "real" "ireal" "ifloat" "creal" "cfloat" "cdouble"
 "wchar" "dchar" "void"))
(c-lang-defconst c-modifier-kwds
 d '("auto" "abstract" "const" "deprecated" "extern" 
 "final" "lazy" "private" "protected" "public"
 "scope" "static" "synchronized" "volatile" "mixin"))
(c-lang-defconst c-class-decl-kwds
 ;; Keywords introducing declarations where the following block (if any)
 ;; contains another declaration level that should be considered a class.
 d '("class" "struct" "union" "interface" "template"))
(c-lang-defconst c-type-modifier-kwds
 d '("const" "lazy" "volatile" "invariant" "enum")
(c-lang-defconst c-type-prefix-kwds
 ;; Keywords where the following name - if any - is a type name, and
 ;; where the keyword together with the symbol works as a type in
 ;; declarations. In this case, like "mixin foo!(x) bar;"
 d '("mixin" "align"))
(c-lang-defconst c-typedef-decl-kwds
 d '("typedef" "alias"))
(c-lang-defconst c-decl-hangon-kwds
 d '("export"))
(c-lang-defconst c-protection-kwds
 ;; Access protection label keywords in classes.
 d '("export" "private" "package" "protected" "public"))
(c-lang-defconst c-type-list-kwds
 d '("import"))
(c-lang-defconst c-ref-list-kwds
 d '("module"))
(c-lang-defconst c-colon-type-list-kwds
 ;; Keywords that may be followed (not necessarily directly) by a colon
 ;; and then a comma separated list of type identifiers.
 d '("class" "enum"))
(c-lang-defconst c-paren-nontype-kwds
 ;;Keywords that may be followed by a parenthesis expression that doesn't
 ;; contain type identifiers.
 d '("version" "extern" "macro" "mixin"))
(c-lang-defconst c-paren-type-kwds
 ;; Keywords that may be followed by a parenthesis expression containing
 ;; type identifiers separated by arbitrary tokens.
 d '("throw"))
(c-lang-defconst c-block-stmt-1-kwds
 ;; Statement keywords followed directly by a substatement.
 d '("do" "else" "finally" "try" "in" "out" "body"))
(c-lang-defconst c-block-stmt-2-kwds
 ;; Statement keywords followed by a paren sexp and then by a substatement.
 d '("for" "if" "switch" "while" "catch" "synchronized" "scope"
 "foreach" "foreach_reverse" "with" "unittest" 
 "else static if" "else"))
(c-lang-defconst c-simple-stmt-kwds
 ;; Statement keywords followed by an expression or nothing.
 d '("break" "continue" "goto" "return" "throw"))
(c-lang-defconst c-paren-stmt-kwds
 ;; Statement keywords followed by a parenthesis expression that
 ;; nevertheless contains a list separated with ';' and not ','."
 d '("for" "foreach" "foreach_reverse"))
(c-lang-defconst c-asm-stmt-kwds
 ;; Statement keywords followed by an assembler expression.
 d '("asm"))
(c-lang-defconst c-label-kwds
 ;; Keywords introducing colon terminated labels in blocks.
 d '("case" "default"))
(c-lang-defconst c-before-label-kwds
 ;; Keywords that might be followed by a label identifier.
 d '("goto" "break" "continue"))
(c-lang-defconst c-constant-kwds
 ;; Keywords for constants.
 d '("null" "true" "false"))
(c-lang-defconst c-primary-expr-kwds
 ;; Keywords besides constants and operators that start primary expressions.
 d '("this" "super"))
(c-lang-defconst c-inexpr-class-kwds
 ;; Keywords that can start classes inside expressions.
 d nil)
(c-lang-defconst c-inexpr-brace-list-kwds
 ;; Keywords that can start brace list blocks inside expressions.
 d nil)
(c-lang-defconst c-other-decl-kwds
 d '("module" "import"))
(c-lang-defconst c-other-kwds
 ;; Keywords not accounted for by any other `*-kwds' language constant.
 d '("assert"))
(defcustom d-font-lock-extra-types nil
 "*List of extra types (aside from the type keywords) to recognize in D mode.
 Each list item should be a regexp matching a single identifier.")
 "Minimal highlighting for D mode.")
 "Fast normal highlighting for D mode.")
 "Accurate normal highlighting for D mode.")
(defvar d-font-lock-keywords d-font-lock-keywords-3
 "Default expressions to highlight in D mode.")
(defvar d-mode-syntax-table nil
 "Syntax table used in d-mode buffers.")
(or d-mode-syntax-table
 (setq d-mode-syntax-table
 (let ((table (funcall (c-lang-const c-make-mode-syntax-table d))))
 ;; Make it recognize D `backquote strings`
 (modify-syntax-entry ?` "\"" table)
 ;; Make it recognize D's nested /+ +/ comments 
 (modify-syntax-entry ?+ ". 23n" table)
 table)))
(defvar d-mode-abbrev-table nil
 "Abbreviation table used in d-mode buffers.")
(c-define-abbrev-table 'd-mode-abbrev-table
 ;; Use the abbrevs table to trigger indentation actions 
 ;; on keywords that, if they occur first on a line, might alter the
 ;; syntactic context.
 ;; Syntax for abbrevs is:
 ;; ( pattern replacement command initial-count)
 '(("else" "else" c-electric-continued-statement 0)
 ("while" "while" c-electric-continued-statement 0)
 ("catch" "catch" c-electric-continued-statement 0)
 ("finally" "finally" c-electric-continued-statement 0)))
 "Keymap used in d-mode buffers.")
(if d-mode-map
 nil
 (setq d-mode-map (c-make-inherited-keymap))
 ;; Add bindings which are only useful for D
 ;; (define-key d-mode-map "\C-c\C-e" 'd-cool-function)
(c-lang-defconst c-mode-menu
 ;; The definition for the mode menu. The menu title is prepended to
 ;; this before it's fed to `easy-menu-define'.
 t `(["Comment Out Region" comment-region
 (c-fn-region-is-active-p)]
 ["Uncomment Region" (comment-region (region-beginning)
 (region-end) '(4))
 (c-fn-region-is-active-p)]
 ["Indent Expression" c-indent-exp
 (memq (char-after) '(?\( ?\[ ?\{))]
 ["Indent Line or Region" c-indent-line-or-region t]
 ["Fill Comment Paragraph" c-fill-paragraph t]
 ["Backward Statement" c-beginning-of-statement t]
 ["Forward Statement" c-end-of-statement t]
 ("Toggle…"
 ["Syntactic indentation" c-toggle-syntactic-indentation
 :style toggle :selected c-syntactic-indentation]
 ["Electric mode" c-toggle-electric-state
 :style toggle :selected c-electric-flag]
 ["Auto newline" c-toggle-auto-newline
 :style toggle :selected c-auto-newline]
 ["Hungry delete" c-toggle-hungry-state
 :style toggle :selected c-hungry-delete-key]
 ["Subword mode" c-subword-mode
 :style toggle :selected (and (boundp 'c-subword-mode)
 c-subword-mode)])))
(easy-menu-define d-menu d-mode-map "D Mode Commands"
 (cons "D" (c-lang-const c-mode-menu d)))
 "Major mode for editing code written in the D Programming Language.
See http://www.digitalmars.com/d for more information about the D language.
The hook `c-mode-common-hook' is run with no args at mode
initialization, then `d-mode-hook'.
Key bindings:
\\{d-mode-map}"
 (interactive)
 (kill-all-local-variables)
 (c-initialize-cc-mode t)
 (set-syntax-table d-mode-syntax-table)
 (setq major-mode 'd-mode
 mode-name "D"
 local-abbrev-table d-mode-abbrev-table
 abbrev-mode t)
 (use-local-map d-mode-map)
 (c-init-language-vars d-mode)
 (c-common-init 'd-mode)
 (easy-menu-add d-menu)
 (c-run-mode-hooks 'c-mode-common-hook 'd-mode-hook)
 (c-update-modeline))