;;; auto-complete-d.el --- ;; Copyright (C) 2011 みかん屋 ;; Author: みかん屋 ;; Created: 2011-06-01 ;; Version: 0.1 ;; Keywords: auto-complete ;;; Code: (require 'auto-complete) ;;;; D言語のキーワード補完 (defconst ac-d-keywords-list '("abstract" "alias" "align" "asm" "assert" "auto" "body" "bool" "break" "byte" "case" "cast" "catch" "cdouble" "cent" "cfloat" "char" "class" "const" "continue" "creal" "dchar" "debug" "default" "delegate" "delete" "deprecated" "do" "double" "else" "enum" "export" "extern" "false" "final" "finally" "float" "for" "foreach" "function" "foreach_reverse" "goto" "idouble" "if" "ifloat" "immutable" "import" "in" "inout" "int" "interface" "invariant" "ireal" "is" "lazy" "long" "macro" "mixin" "module" "new" "nothrow" "null" "out" "override" "package" "pragma" "private" "protected" "public" "pure" "real" "ref" "return" "scope" "shared" "short" "static" "struct" "super" "switch" "synchronized" "template" "this" "throw" "true" "try" "typedef" "typeid" "typeof" "ubyte" "ucent" "uint" "ulong" "union" "unittest" "ushort" "version" "void" "volatile" "wchar" "while" "with" "__FILE__" "__LINE__" "_gshared" "__thread" "__traits")) (ac-define-source d-keywords '((candidates . ac-d-keywords-list))) ;;;; パッケージやモジュールの補完 (defconst ac-d-import-pass '("/usr/local/src/druntime/import" "/usr/local/src/phobos/")) ;;; (defvar ac-d-package-candidates-cache nil) (defconst ac-d-package-alist '(("/" "std" "etc" "core") ("std" "c" "windows" "net") ("std/c" "linux" "windows" "freebsd") ("etc" "c") ("core" "stdc" "sync" "sys") ("core/sys" "osx" "posix" "windows") ("core/sys/osx" match) ("core/sys/posix" "arpa" "sys" "net" "netinet"))) (defun ac-d-package-candidates-init () (setq ac-d-package-candidates-cache ac-d-package-alist)) (defun ac-d-package-candidates(package) (assoc-default package ac-d-package-candidates-cache)) (ac-define-source d-packages '((init . ac-d-package-candidates-init) (candidates . (ac-d-package-candidates "/")) (prefix . "import *\\(.*\\)") (requires . 0) (symbol . "p"))) (ac-define-source d-packages-std '((candidates . (ac-d-package-candidates "std")) (prefix . "import *std\\.\\(.*\\)") (requires . 0 ) (symbol . "p"))) (ac-define-source d-packages-std-c '((candidates . (ac-d-package-candidates "std/c")) (prefix . "import *std\\.c\\.\\(.*\\)") (requires . 0 ) (symbol . "p"))) (ac-define-source d-packages-etc '((candidates . (ac-d-package-candidates "etc")) (prefix . "import *etc\\.\\(.*\\)") (requires . 0) (symbol . "p"))) (ac-define-source d-packages-core '((candidates . (ac-d-package-candidates "core")) (prefix . "import *core\\.\\(.*\\)") (requires . 0) (symbol . "p"))) (ac-define-source d-packages-core-sys '((candidates . (ac-d-package-candidates "core/sys")) (prefix . "import *core\\.sys\\.\\(.*\\)") (requires . 0) (symbol . "p"))) (ac-define-source d-packages-core-sys-osx '((candidates . (ac-d-package-candidates "core/sys/osx")) (prefix . "import *core\\.sys\\.osx\\.\\(.*\\)") (requires . 0) (symbol . "p"))) (ac-define-source d-packages-core-sys-posix '((candidates . (ac-d-package-candidates "core/sys/posix")) (prefix . "import *core\\.sys\\.posix\\.\\(.*\\)") (requires . 0) (symbol . "p"))) ;;; (defvar ac-d-module-candidates-cache nil) (defun ac-d-module-candidates-init-1 (abspass relpass) (mapcar (lambda (x) (if (file-directory-p x) (if (not (or (equal (file-name-nondirectory x) ".") (equal (file-name-nondirectory x) ".."))) (ac-d-module-candidates-init-1 abspass (file-relative-name x abspass))) (if (string-match "\\.di?$" x) (if (assoc-default relpass ac-d-module-candidates-cache) (setcdr (assoc-ignore-representation relpass ac-d-module-candidates-cache) (cons (file-name-sans-extension (file-name-nondirectory x)) (assoc-default relpass ac-d-module-candidates-cache))) (setq ac-d-module-candidates-cache (cons (list relpass (file-name-sans-extension (file-name-nondirectory x))) ac-d-module-candidates-cache)))))) (directory-files (concat abspass "/" relpass) t))) (defun ac-d-module-candidates-init () (setq ac-d-module-candidates-cache nil) (mapcar (lambda (x) (ac-d-module-candidates-init-1 x "/")) ac-d-import-pass)) (defun ac-d-module-candidates(package) (assoc-default package ac-d-module-candidates-cache)) (ac-define-source d-modules '((init . ac-d-module-candidates-init) (candidates . (ac-d-module-candidates "/")) (prefix . "import *\\(.*\\)") (requires . 0))) (ac-define-source d-modules-std '((candidates . (ac-d-module-candidates "std")) (prefix . "import *std\\.\\(.*\\)") (requires . 0))) (ac-define-source d-modules-std-c '((candidates . (ac-d-module-candidates "std/c")) (prefix . "import *std\\.c\\.\\(.*\\)") (requires . 0))) (ac-define-source d-modules-std-net '((candidates . (ac-d-module-candidates "std/net")) (prefix . "import *std\\.net\\.\\(.*\\)") (requires . 0))) (ac-define-source d-modules-std-windows '((candidates . (ac-d-module-candidates "std/windows")) (prefix . "import *std\\.windows\\.\\(.*\\)") (requires . 0))) (ac-define-source d-modules-std-c-linux '((candidates . (ac-d-module-candidates "std/c/linux")) (prefix . "import *std\\.c\\.linux\\.\\(.*\\)") (requires . 0))) (ac-define-source d-modules-std-c-windows '((candidates . (ac-d-module-candidates "std/c/windows")) (prefix . "import *std\\.c\\.windows\\.\\(.*\\)") (requires . 0))) (ac-define-source d-modules-std-c-osx '((candidates . (ac-d-module-candidates "std/c/osx")) (prefix . "import *std\\.c\\.osx\\.\\(.*\\)") (requires . 0))) (ac-define-source d-modules-std-c-freebsd '((candidates . (ac-d-module-candidates "std/c/freebsd")) (prefix . "import *std\\.c\\.freebsd\\.\\(.*\\)") (requires . 0))) (ac-define-source d-modules-etc-c '((candidates . (ac-d-module-candidates "etc/c")) (prefix . "import *etc\\.c\\.\\(.*\\)") (requires . 0))) (ac-define-source d-modules-core '((candidates . (ac-d-module-candidates "core")) (prefix . "import *core\\.\\(.*\\)") (requires . 0))) (ac-define-source d-modules-core-stdc '((candidates . (ac-d-module-candidates "core/stdc")) (prefix . "import *core\\.stdc\\.\\(.*\\)") (requires . 0))) (ac-define-source d-modules-core-sync '((candidates . (ac-d-module-candidates "core/sync")) (prefix . "import *core\\.sync\\.\\(.*\\)") (requires . 0))) (ac-define-source d-modules-core-sys-osx-mach '((candidates . (ac-d-module-candidates "core/sys/osx/mach")) (prefix . "import *core\\.sys\\.osx\\.mach\\.\\(.*\\)") (requires . 0))) (ac-define-source d-modules-core-sys-posix '((candidates . (ac-d-module-candidates "core/sys/posix")) (prefix . "import *core\\.sys\\.posix\\.\\(.*\\)") (requires . 0))) (ac-define-source d-modules-core-sys-posix-arpa '((candidates . (ac-d-module-candidates "core/sys/posix/arpa")) (prefix . "import *core\\.sys\\.posix\\.arpa\\.\\(.*\\)") (requires . 0))) (ac-define-source d-modules-core-sys-posix-sys '((candidates . (ac-d-module-candidates "core/sys/posix/sys")) (prefix . "import *core\\.sys\\.posix\\.sys\\.\\(.*\\)") (requires . 0))) (ac-define-source d-modules-core-sys-posix-net '((candidates . (ac-d-module-candidates "core/sys/posix/net")) (prefix . "import *core\\.sys\\.posix\\.net\\.\\(.*\\)") (requires . 0))) (ac-define-source d-modules-core-sys-posix-netinet '((candidates . (ac-d-module-candidates "core/sys/posix/netinet")) (prefix . "import *core\\.sys\\.posix\\.netinet\\.\\(.*\\)") (requires . 0))) (ac-define-source d-modules-core-sys-windows '((candidates . (ac-d-module-candidates "core/sys/windows")) (prefix . "import *core\\.sys\\.windows\\.\\(.*\\)") (requires . 0))) ;;;; (defun ac-d-mode-setup() (make-local-variable 'ac-sources) (setq ac-sources '(ac-source-d-keywords ac-source-d-packages ac-source-d-packages-std ac-source-d-packages-std-c ac-source-d-packages-etc ac-source-d-packages-core ac-source-d-packages-core-sys ac-source-d-packages-core-sys-osx ac-source-d-packages-core-sys-posix ac-source-d-modules ac-source-d-modules-std ac-source-d-modules-std-c ac-source-d-modules-std-net ac-source-d-modules-std-windows ac-source-d-modules-std-c-linux ac-source-d-modules-std-c-windows ac-source-d-modules-std-c-osx ac-source-d-modules-std-c-freebsd ac-source-d-modules-etc-c ac-source-d-modules-core ac-source-d-modules-core-stdc ac-source-d-modules-core-sync ac-source-d-modules-core-sys-osx-mach ac-source-d-modules-core-sys-posix ac-source-d-modules-core-sys-posix-arpa ac-source-d-modules-core-sys-posix-sys ac-source-d-modules-core-sys-posix-net ac-source-d-modules-core-sys-posix-netinet ac-source-d-modules-core-sys-windows ))) (provide 'auto-complete-d) ;;; auto-complete-d.el ends here