Add a emacs-ycmd contrib layer.
This commit is contained in:
parent
a383c273e6
commit
191d696dd1
|
@ -34,6 +34,7 @@ tmp/
|
||||||
server/
|
server/
|
||||||
*~
|
*~
|
||||||
*.elc
|
*.elc
|
||||||
|
*.pyc
|
||||||
/*.zip
|
/*.zip
|
||||||
*.db
|
*.db
|
||||||
python-*-docs-html
|
python-*-docs-html
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
# YCMD
|
||||||
|
|
||||||
|
This contrib layer adds [emacs-ycmd](https://github.com/abingham/emacs-ycmd) support.
|
||||||
|
In order to use this layer you must have a local [ycmd](https://github.com/Valloric/ycmd#building) installation
|
||||||
|
and must set the `ycmd-server-command` variable to reflect the path to that installation. See the emacs-ycmd
|
||||||
|
Readme for more instructions on this.
|
||||||
|
|
||||||
|
This package also requires the `company-mode` layer in order to get actual completion rather than just flychecking and
|
||||||
|
key bindings.
|
||||||
|
|
||||||
|
## Key Bindings
|
||||||
|
|
||||||
|
Adds the `SPC m g` go to definition binding to `c++-mode` as well as `SPC m G` for the more imprecise but faster version.
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
By default this layer only activates ycmd for `c++-mode` so company can provide completion that is better than mere keyword
|
||||||
|
completion for all the modes it would otherwise add itself to. If you want ycmd in all sorts of other modes then put this
|
||||||
|
snippet in your dotspacemacs init function:
|
||||||
|
```elisp
|
||||||
|
(setq ycmd/all-the-modes t)
|
||||||
|
```
|
||||||
|
otherwise you might just want to add it for specific languages like:
|
||||||
|
```elisp
|
||||||
|
(add-hook 'c++-mode-hook 'ycmd-mode)
|
||||||
|
```
|
|
@ -0,0 +1,84 @@
|
||||||
|
import os
|
||||||
|
import ycm_core
|
||||||
|
|
||||||
|
default_flags = [
|
||||||
|
'-Wall',
|
||||||
|
'-Wextra',
|
||||||
|
'-Werror',
|
||||||
|
'-Wc++98-compat',
|
||||||
|
'-Wno-long-long',
|
||||||
|
'-Wno-variadic-macros',
|
||||||
|
'-fexceptions',
|
||||||
|
'-DNDEBUG',
|
||||||
|
'-std=c++11',
|
||||||
|
'-x',
|
||||||
|
'c++',
|
||||||
|
# This path will only work on OS X, but extra paths that don't exist are not harmful
|
||||||
|
'-isystem'
|
||||||
|
'/System/Library/Frameworks/Python.framework/Headers',
|
||||||
|
'-isystem',
|
||||||
|
'/usr/include',
|
||||||
|
'-isystem',
|
||||||
|
'/usr/local/include',
|
||||||
|
'-isystem',
|
||||||
|
'/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1',
|
||||||
|
'-isystem',
|
||||||
|
'/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include',
|
||||||
|
]
|
||||||
|
|
||||||
|
def DirectoryOfThisScript():
|
||||||
|
return os.path.dirname( os.path.abspath( __file__ ) )
|
||||||
|
|
||||||
|
|
||||||
|
def MakeRelativePathsInFlagsAbsolute( flags, working_directory ):
|
||||||
|
if not working_directory:
|
||||||
|
return list( flags )
|
||||||
|
new_flags = []
|
||||||
|
make_next_absolute = False
|
||||||
|
path_flags = [ '-isystem', '-I', '-iquote', '--sysroot=' ]
|
||||||
|
for flag in flags:
|
||||||
|
new_flag = flag
|
||||||
|
|
||||||
|
if make_next_absolute:
|
||||||
|
make_next_absolute = False
|
||||||
|
if not flag.startswith( '/' ):
|
||||||
|
new_flag = os.path.join( working_directory, flag )
|
||||||
|
|
||||||
|
for path_flag in path_flags:
|
||||||
|
if flag == path_flag:
|
||||||
|
make_next_absolute = True
|
||||||
|
break
|
||||||
|
|
||||||
|
if flag.startswith( path_flag ):
|
||||||
|
path = flag[ len( path_flag ): ]
|
||||||
|
new_flag = path_flag + os.path.join( working_directory, path )
|
||||||
|
break
|
||||||
|
|
||||||
|
if new_flag:
|
||||||
|
new_flags.append( new_flag )
|
||||||
|
return new_flags
|
||||||
|
|
||||||
|
# Thanks to https://github.com/decrispell/vim-config for this code
|
||||||
|
def FlagsForFile( filename, **kwargs ):
|
||||||
|
""" given the source filename, return the compiler flags """
|
||||||
|
opt_basename = '.clang_complete'
|
||||||
|
curr_dir = os.path.dirname(filename)
|
||||||
|
opt_fname = os.path.join(curr_dir, opt_basename)
|
||||||
|
# keep traversing up the tree until we find the file, or hit the root
|
||||||
|
while not os.path.exists(opt_fname):
|
||||||
|
new_dir = os.path.dirname(curr_dir)
|
||||||
|
if new_dir == curr_dir:
|
||||||
|
# we've reached the root of the tree
|
||||||
|
break
|
||||||
|
curr_dir = new_dir
|
||||||
|
opt_fname = os.path.join(curr_dir, opt_basename)
|
||||||
|
try:
|
||||||
|
fd = open(opt_fname, 'r')
|
||||||
|
except IOError:
|
||||||
|
return {'flags': default_flags, 'do_cache': True}
|
||||||
|
flags = [line.strip() for line in fd.readlines()]
|
||||||
|
relative_to = os.path.dirname(opt_fname)
|
||||||
|
flags = MakeRelativePathsInFlagsAbsolute(flags, relative_to)
|
||||||
|
return {
|
||||||
|
'flags': flags, 'do_cache': True
|
||||||
|
}
|
|
@ -0,0 +1,41 @@
|
||||||
|
(defvar ycmd-packages
|
||||||
|
'(
|
||||||
|
ycmd
|
||||||
|
flycheck-ycmd
|
||||||
|
)
|
||||||
|
"List of all packages to install and/or initialize. Built-in packages
|
||||||
|
which require an initialization must be listed explicitly in the list.")
|
||||||
|
|
||||||
|
(unless (boundp 'ycmd-server-command)
|
||||||
|
(message "YCMD won't work unless you set the ycmd-server-command variable to the path to a ycmd install."))
|
||||||
|
|
||||||
|
(when (member 'company-mode dotspacemacs-configuration-layers)
|
||||||
|
(add-to-list 'ycmd-packages 'company-ycmd))
|
||||||
|
|
||||||
|
(defvar ycmd/all-the-modes nil
|
||||||
|
"use ycmd for all the modes it supports, most will only use fancy keyword completion.")
|
||||||
|
|
||||||
|
(defun ycmd/init-ycmd ()
|
||||||
|
(use-package ycmd
|
||||||
|
:init
|
||||||
|
(progn
|
||||||
|
(if ycmd/all-the-modes
|
||||||
|
(ycmd-setup)
|
||||||
|
(add-hook 'c++-mode-hook 'ycmd-mode))
|
||||||
|
(setq-default ycmd-global-config
|
||||||
|
(expand-file-name "~/.emacs.d/contrib/ycmd/global_conf.py")))
|
||||||
|
:config
|
||||||
|
(evil-leader/set-key-for-mode 'c++-mode
|
||||||
|
"mg" 'ycmd-goto
|
||||||
|
"mG" 'ycmd-goto-imprecise)))
|
||||||
|
|
||||||
|
(defun ycmd/init-company-ycmd ()
|
||||||
|
(use-package company-ycmd
|
||||||
|
:init (company-ycmd-setup)))
|
||||||
|
|
||||||
|
(defun ycmd/init-flycheck-ycmd ()
|
||||||
|
(use-package flycheck-ycmd
|
||||||
|
:init
|
||||||
|
(progn
|
||||||
|
(add-hook 'ycmd-file-parse-result-hook 'flycheck-ycmd--cache-parse-results)
|
||||||
|
(add-to-list 'flycheck-checkers 'ycmd))))
|
Loading…
Reference in New Issue