Update modules/lang/*
This commit is contained in:
parent
f0adef1b01
commit
e14e25ecb4
68 changed files with 1487 additions and 750 deletions
80
modules/lang/cc/autoload.el
Normal file
80
modules/lang/cc/autoload.el
Normal file
|
@ -0,0 +1,80 @@
|
|||
;;; lang/cc/autoload.el
|
||||
|
||||
;;;###autoload
|
||||
(defun +cc/install ()
|
||||
(interactive)
|
||||
(irony-install-server
|
||||
(format
|
||||
(concat "%s %s %s && %s --build . "
|
||||
"--use-stderr --config Release --target install")
|
||||
(shell-quote-argument irony-cmake-executable)
|
||||
(shell-quote-argument (concat "-DCMAKE_INSTALL_PREFIX="
|
||||
(expand-file-name
|
||||
irony-server-install-prefix)))
|
||||
(shell-quote-argument irony-server-source-dir)
|
||||
(shell-quote-argument irony-cmake-executable))))
|
||||
|
||||
;;;###autoload
|
||||
(defun +cc/autoclose->-maybe ()
|
||||
"For some reason smartparens won't autoskip >'s, this hack does."
|
||||
(interactive)
|
||||
(if (save-excursion
|
||||
(backward-char)
|
||||
(looking-at-p "[^ \t]>"))
|
||||
(forward-char)
|
||||
(call-interactively 'self-insert-command)))
|
||||
|
||||
(defun +cc--copy-face (new-face face)
|
||||
"Define NEW-FACE from existing FACE."
|
||||
(copy-face face new-face)
|
||||
(eval `(defvar ,new-face nil))
|
||||
(set new-face new-face))
|
||||
|
||||
;;;###autoload
|
||||
(defun +cc|extra-fontify-c++ ()
|
||||
;; We could place some regexes into `c-mode-common-hook', but
|
||||
;; note that their evaluation order matters.
|
||||
;; NOTE modern-cpp-font-lock will eventually supercede some of these rules
|
||||
(font-lock-add-keywords
|
||||
nil '(;; c++11 string literals
|
||||
;; L"wide string"
|
||||
;; L"wide string with UNICODE codepoint: \u2018"
|
||||
;; u8"UTF-8 string", u"UTF-16 string", U"UTF-32 string"
|
||||
("\\<\\([LuU8]+\\)\".*?\"" 1 font-lock-keyword-face)
|
||||
;; R"(user-defined literal)"
|
||||
;; R"( a "quot'd" string )"
|
||||
;; R"delimiter(The String Data" )delimiter"
|
||||
;; R"delimiter((a-z))delimiter" is equivalent to "(a-z)"
|
||||
("\\(\\<[uU8]*R\"[^\\s-\\\\()]\\{0,16\\}(\\)" 1 font-lock-keyword-face t) ; start delimiter
|
||||
( "\\<[uU8]*R\"[^\\s-\\\\()]\\{0,16\\}(\\(.*?\\))[^\\s-\\\\()]\\{0,16\\}\"" 1 font-lock-string-face t) ; actual string
|
||||
( "\\<[uU8]*R\"[^\\s-\\\\()]\\{0,16\\}(.*?\\()[^\\s-\\\\()]\\{0,16\\}\"\\)" 1 font-lock-keyword-face t) ; end delimiter
|
||||
) t))
|
||||
|
||||
;;;###autoload
|
||||
(defun +cc|extra-fontify-c/c++ ()
|
||||
(font-lock-add-keywords
|
||||
nil '(;; PREPROCESSOR_CONSTANT, PREPROCESSORCONSTANT
|
||||
("\\<[A-Z]*_[A-Z_]+\\>" . font-lock-constant-face)
|
||||
("\\<[A-Z]\\{3,\\}\\>" . font-lock-constant-face)
|
||||
;; integer/float/scientific numbers
|
||||
("\\<\\([\\-+]*[0-9\\.]+\\)\\>" 1 font-lock-constant-face t)
|
||||
("\\<\\([\\-+]*[0-9\\.]+\\)\\(f\\)\\>"
|
||||
(1 font-lock-constant-face t)
|
||||
(2 font-lock-keyword-face t))
|
||||
("\\<\\([\\-+]*[0-9\\.]+\\)\\([eE]\\)\\([\\-+]?[0-9]+\\)\\>"
|
||||
(1 font-lock-constant-face t)
|
||||
(2 font-lock-keyword-face t)
|
||||
(3 font-lock-constant-face t))
|
||||
) t))
|
||||
|
||||
;;;###autoload
|
||||
(defun +cc-sp-point-is-template-p (id action context)
|
||||
(and (sp-in-code-p id action context)
|
||||
(sp-point-after-word-p id action context)))
|
||||
|
||||
;;;###autoload
|
||||
(defun +cc-sp-point-after-include-p (id action context)
|
||||
(and (sp-in-code-p id action context)
|
||||
(save-excursion
|
||||
(goto-char (line-beginning-position))
|
||||
(looking-at-p "[ ]*#include[^<]+"))))
|
|
@ -1,91 +1,156 @@
|
|||
;;; module-cc.el --- C, C++, and Objective-C
|
||||
;;; lang/cc/config.el --- C, C++, and Objective-C
|
||||
|
||||
(use-package cc-mode
|
||||
(@def-package cc-mode
|
||||
:commands (c-mode c++-mode objc-mode java-mode)
|
||||
:mode ("\\.mm" . objc-mode)
|
||||
:init
|
||||
(add-hook! (c-mode c++-mode) 'doom|extra-fontify-c/c++)
|
||||
(add-hook 'c-mode-hook 'highlight-numbers-mode)
|
||||
(add-hook 'c++-mode-hook 'doom|extra-fontify-c++)
|
||||
(add-hook 'c-initialization-hook 'doom|init-c/c++-settings)
|
||||
|
||||
;; C++ header files
|
||||
(push (cons (lambda () (and (f-ext? buffer-file-name "h")
|
||||
(or (f-exists? (f-swap-ext buffer-file-name "cpp"))
|
||||
(awhen (car-safe (projectile-get-other-files (buffer-file-name) (projectile-current-project-files)))
|
||||
(f-ext? it "cpp")))))
|
||||
;; Auto-detect C++ header files
|
||||
(push (cons (lambda ()
|
||||
(and (equal (file-name-extension buffer-file-name) "h")
|
||||
(or (file-exists-p (expand-file-name
|
||||
(concat (file-name-sans-extension buffer-file-name)
|
||||
".cpp")))
|
||||
(when-let (file (car-safe (projectile-get-other-files
|
||||
buffer-file-name
|
||||
(projectile-current-project-files))))
|
||||
(equal (file-name-extension file) "cpp")))))
|
||||
'c++-mode)
|
||||
magic-mode-alist)
|
||||
|
||||
;; Obj-C
|
||||
(push (cons (lambda () (and (f-ext? buffer-file-name "h")
|
||||
;; Auto-detect Obj-C header files
|
||||
(push (cons (lambda () (and (equal (file-name-extension buffer-file-name) "h")
|
||||
(re-search-forward "@\\<interface\\>" magic-mode-regexp-match-limit t)))
|
||||
'objc-mode)
|
||||
magic-mode-alist)
|
||||
|
||||
:config
|
||||
(def-electric! (c-mode c++-mode objc-mode) :chars (?\n ?\}))
|
||||
(def-company-backend! (c-mode c++-mode objc-mode) (irony-c-headers irony))
|
||||
|
||||
(setq c-tab-always-indent nil
|
||||
c-electric-flag nil)
|
||||
|
||||
(map! :map c-mode-base-map (:localleader :nv ";" 'doom/append-semicolon))
|
||||
;; extra highlights for numbers in C (`modern-cpp-font-lock' offers something better for C++)
|
||||
(add-hook 'c-mode-hook 'highlight-numbers-mode)
|
||||
;; Fontification of C++11 string literals
|
||||
(add-hook 'c++-mode-hook '+cc|extra-fontify-c++)
|
||||
|
||||
(@set :electric '(c-mode c++-mode objc-mode java-mode)
|
||||
:chars ?\n ?\})
|
||||
|
||||
(@set :company-backend
|
||||
'(c-mode c++-mode objc-mode)
|
||||
'(company-irony-c-headers company-irony))
|
||||
|
||||
(sp-with-modes '(c-mode c++-mode objc-mode java-mode)
|
||||
(sp-local-pair "<" ">" :when '(doom/sp-point-is-template-p doom/sp-point-after-include-p))
|
||||
(sp-local-pair "<" ">" :when '(+cc-sp-point-is-template-p +cc-sp-point-after-include-p))
|
||||
(sp-local-pair "/*" "*/" :post-handlers '(("||\n[i]" "RET") ("| " "SPC")))
|
||||
;; Doxygen blocks
|
||||
(sp-local-pair "/**" "*/" :post-handlers '(("||\n[i]" "RET") ("||\n[i]" "SPC")))
|
||||
(sp-local-pair "/*!" "*/" :post-handlers '(("||\n[i]" "RET") ("[d-1]< | " "SPC"))))
|
||||
|
||||
;; Improve indentation of inline lambdas in C++11
|
||||
(advice-add 'c-lineup-arglist :around 'doom/c-lineup-arglist))
|
||||
(advice-add 'c-lineup-arglist :around '+c-lineup-arglist)
|
||||
|
||||
(use-package modern-cpp-font-lock
|
||||
;; C/C++ style settings
|
||||
(c-toggle-electric-state -1)
|
||||
(c-toggle-auto-newline -1)
|
||||
(c-set-offset 'substatement-open '0) ; brackets should be at same indentation level as the statements they open
|
||||
(c-set-offset 'inline-open '+)
|
||||
(c-set-offset 'block-open '+)
|
||||
(c-set-offset 'brace-list-open '+) ; all "opens" should be indented by the c-indent-level
|
||||
(c-set-offset 'case-label '+) ; indent case labels by c-indent-level, too
|
||||
(c-set-offset 'access-label '-)
|
||||
(c-set-offset 'arglist-intro '+)
|
||||
(c-set-offset 'arglist-close '0)
|
||||
|
||||
(defun +cc--c-lineup-inclass (langelem)
|
||||
(let ((inclass (assoc 'inclass c-syntactic-context)))
|
||||
(save-excursion
|
||||
(goto-char (c-langelem-pos inclass))
|
||||
(if (or (looking-at "struct")
|
||||
(looking-at "typedef struct"))
|
||||
'+
|
||||
'++))))
|
||||
(c-set-offset 'inclass '+cc--c-lineup-inclass)
|
||||
|
||||
|
||||
;; Certain mappings interfere with smartparens and custom bindings,
|
||||
;; so unbind them
|
||||
(@map :map c-mode-map
|
||||
"DEL" nil
|
||||
"#" 'self-insert-command
|
||||
"{" 'self-insert-command
|
||||
"}" 'self-insert-command
|
||||
"/" 'self-insert-command
|
||||
"*" 'self-insert-command
|
||||
";" 'self-insert-command
|
||||
"," 'self-insert-command
|
||||
":" 'self-insert-command
|
||||
"(" 'self-insert-command
|
||||
")" 'self-insert-command
|
||||
|
||||
:map c++-mode-map
|
||||
"}" nil
|
||||
|
||||
;; Smartparens and cc-mode both try to autoclose
|
||||
;; angle-brackets intelligently. The result isn't very
|
||||
;; intelligent (causes redundant characters), so we just do it
|
||||
;; ourselves.
|
||||
"<" nil
|
||||
:map (c-mode-base-map c++-mode-map)
|
||||
:i ">" '+cc/autoclose->-maybe))
|
||||
|
||||
|
||||
(@def-package modern-cpp-font-lock
|
||||
:commands modern-c++-font-lock-mode
|
||||
:init (add-hook 'c++-mode-hook 'modern-c++-font-lock-mode))
|
||||
|
||||
(use-package irony
|
||||
|
||||
(@def-package irony
|
||||
:after cc-mode
|
||||
:config
|
||||
(setq irony-server-install-prefix (concat doom-ext-dir "/irony-mode/server/build/irony/"))
|
||||
(add-hook! c++-mode
|
||||
(setq irony-server-install-prefix (concat doom-cache-dir "irony-server/"))
|
||||
(@add-hook 'irony-mode-hook '(irony-eldoc flycheck-mode))
|
||||
(@add-hook 'c++-mode-hook
|
||||
(make-local-variable 'irony-additional-clang-options)
|
||||
(push "-std=c++11" irony-additional-clang-options))
|
||||
(push "-std=c++11" irony-additional-clang-options)))
|
||||
|
||||
(require 'irony-eldoc)
|
||||
(require 'company-irony)
|
||||
(require 'company-irony-c-headers)
|
||||
(require 'flycheck-irony)
|
||||
(flycheck-irony-setup)
|
||||
(@def-package irony-eldoc :after irony)
|
||||
|
||||
;; some c-mode dervied modes wrongfully trigger these hooks (like php-mode)
|
||||
(add-hook! (c-mode c++-mode objc-mode)
|
||||
(when (memq major-mode '(c-mode c++-mode objc-mode))
|
||||
(flycheck-mode +1)
|
||||
(irony-mode +1)
|
||||
(eldoc-mode +1)
|
||||
(irony-eldoc +1))))
|
||||
(@def-package flycheck-irony :after irony :config (flycheck-irony-setup))
|
||||
|
||||
(use-package disaster :commands (disaster))
|
||||
|
||||
;;
|
||||
(use-package cmake-mode
|
||||
;; Tools
|
||||
;;
|
||||
|
||||
(@def-package disaster :commands disaster)
|
||||
|
||||
|
||||
;;
|
||||
;; Plugins
|
||||
;;
|
||||
|
||||
(@def-package company-cmake :after cmake-mode)
|
||||
|
||||
(@def-package company-irony :after irony)
|
||||
|
||||
(@def-package company-irony-c-headers :after company-irony)
|
||||
|
||||
|
||||
;;
|
||||
;; Major modes
|
||||
;;
|
||||
|
||||
(@def-package cmake-mode
|
||||
:mode "CMakeLists\\.txt$"
|
||||
:config (def-company-backend! cmake-mode (cmake yasnippet)))
|
||||
:config
|
||||
(@set :company-backend 'cmake-mode '(company-cmake company-yasnippet)))
|
||||
|
||||
(use-package company-cmake :after cmake-mode)
|
||||
(@def-package glsl-mode :mode ("\\.glsl\\'" "\\.vert\\'" "\\.frag\\'" "\\.geom\\'"))
|
||||
|
||||
(use-package glsl-mode :mode ("\\.glsl\\'" "\\.vert\\'" "\\.frag\\'" "\\.geom\\'"))
|
||||
(@def-package cuda-mode :mode "\\.cuh?$")
|
||||
|
||||
(use-package cuda-mode :mode "\\.cuh?$")
|
||||
(@def-package opencl-mode :mode "\\.cl$")
|
||||
|
||||
(use-package opencl-mode :mode "\\.cl$")
|
||||
|
||||
(use-package demangle-mode
|
||||
(@def-package demangle-mode
|
||||
:commands demangle-mode
|
||||
:init (add-hook 'llvm-mode-hook 'demangle-mode))
|
||||
|
||||
(provide 'module-cc)
|
||||
;;; module-cc.el ends here
|
||||
|
|
19
modules/lang/cc/packages.el
Normal file
19
modules/lang/cc/packages.el
Normal file
|
@ -0,0 +1,19 @@
|
|||
;; -*- no-byte-compile: t; -*-
|
||||
;;; lang/cc/packages.el
|
||||
|
||||
(@package cmake-mode)
|
||||
(@package cuda-mode)
|
||||
(@package demangle-mode)
|
||||
(@package disaster)
|
||||
(@package glsl-mode)
|
||||
(@package irony)
|
||||
(@package irony-eldoc)
|
||||
(@package opencl-mode)
|
||||
(@package modern-cpp-font-lock)
|
||||
|
||||
(when (@featurep :feature syntax-checker)
|
||||
(@package flycheck-irony))
|
||||
|
||||
(when (@featurep :completion company)
|
||||
(@package company-irony)
|
||||
(@package company-irony-c-headers))
|
48
modules/lang/cc/setup.sh
Executable file
48
modules/lang/cc/setup.sh
Executable file
|
@ -0,0 +1,48 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
source VARS
|
||||
|
||||
#
|
||||
echo "Setting up C/C++ (irony-mode)"
|
||||
|
||||
case "$OSTYPE" in
|
||||
darwin*)
|
||||
brew install cmake
|
||||
brew install llvm --with-clang
|
||||
;;
|
||||
linux*)
|
||||
if is-arch; then
|
||||
sudo pacman --noconfirm --needed -S cmake clang
|
||||
elif is-deb; then
|
||||
echo "Not implemented"
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
|
||||
# Build irony-server
|
||||
git-repo "https://github.com/Sarcasm/irony-mode" "irony-mode"
|
||||
|
||||
# Reset build directory
|
||||
cd irony-mode/server
|
||||
[ -d build ] && rm -rf build
|
||||
mkdir build && cd build
|
||||
|
||||
DEST="$(pwd)/irony-mode/server/build/irony/"
|
||||
|
||||
# Compile
|
||||
if is-mac
|
||||
then
|
||||
cmake -DCMAKE_INSTALL_RPATH_USE_LINK_PATH\=ON \
|
||||
-DCMAKE_INSTALL_PREFIX\="$DEST" ../
|
||||
else
|
||||
cmake -DCMAKE_INSTALL_PREFIX\="$DEST" ../
|
||||
fi
|
||||
cmake --build . --use-stderr --config Release --target install
|
||||
|
||||
if is-mac
|
||||
then
|
||||
install_name_tool -change @rpath/libclang.dylib \
|
||||
/usr/local/opt/llvm/lib/libclang.dylib \
|
||||
$DEST/bin/irony-server
|
||||
fi
|
Loading…
Add table
Add a link
Reference in a new issue