YCMD는 Code-Completion에 대한 API 및 Semantic GOTO 명령 (및 기타)과 같은 기타 코드 이해 사용 사례를 제공하는 서버입니다. 특정 파일 타입의 경우 YCMD는 진단 오류 및 경고를 제공 할 수도 있습니다.
YCMD는 원래 YouCompleTeme 코드베이스의 일부 였지만 VIM 이외의 편집자에 사용할 수 있도록 별도의 프로젝트로 나뉘어졌습니다.
클라이언트를 구현하려면 API 문서를 확인하십시오. YCMD와 상호 작용하는 방법을 배우는 좋은 방법은 example_client.py 파일을 통해 읽고 실행하는 것입니다. 예제 클라이언트를 실행하는 방법에 대한 자세한 내용은 예제 폴더에 대해서는 readme를 참조하십시오.
클라이언트에 링크를 추가하는 풀 요청을 보내 주시기 바랍니다.
YCMD를 개발하려면 테스트 실행 지침을 참조하십시오.
이것은 우분투 리눅스를위한 것입니다. 다른 OS에서 YCMD를 실행하는 것에 대한 자세한 내용은 YCM의 지침에서 찾을 수 있습니다 (VIM 특정 부품 무시). YCMD는 Python 3.8.0+에서 실행됩니다.
먼저 최소 의존성을 설치하십시오.
sudo apt install build-essential cmake python3-dev
다음으로 필요한 언어 별 종속성을 설치하십시오.
sudo apt install golang-go .sudo apt install npm .sudo apt install mono-devel .sudo apt install openjdk-8-jre .처음으로 저장소를 복제하면 하위 모듈을 업데이트해야합니다.
git submodule update --init --recursive
그런 다음 python3 build.py --all 에서 나열된 특정 완성기 또는 python3 build.py --help 실행하십시오. 이것은 당신이 가게 될 것입니다.
YCMD 구축에 대한 자세한 지침은 YCM의 지침을 참조하십시오 (VIM 특정 부품 무시).
n 으로 끝납니다.x-ycm-hmac HTTP 헤더에 HMAC가 포함되어야 합니다 . HMAC는 시작시 서버와 요청/응답 본문에 전달 된 공유 비밀에서 계산됩니다. 다이제스트 알고리즘은 SHA-256입니다. 서버는 또한 응답에 HMAC를 포함합니다. 응답을 사용하기 전에 확인 해야합니다 . 수행 방법을 보려면 example_client.py 참조하십시오.YCMD에는 몇 가지 완료 엔진이 있습니다. 가장 기본적인 것은 완료 요청에 제공된 파일의 모든 식별자를 수집하는 식별자 기반 소수체, 이전에 제공된 동일한 파일 유형의 다른 파일 및 CTAG에서 생성 된 모든 태그 파일을 수집합니다. 이 엔진은 의미가 없습니다.
YCM에는 여러 의미 론적 엔진도 있습니다. C-Family Languages에 대한 시맨틱 완성을 제공하는 Clangd 기반 불신자가 있습니다. 또한 Python의 시맨틱 완료제, C#에 대한 옴니 셔프 기반의 불신자, GO 용 GOPLS 기반 불신자 (정의로 점프하기 위해 GOPLS 사용), JavaScript 및 TypeScript 용 TSSERVER 기반의 소주인, JDT.LS 기반 서버 인 JAVA 기반 보조제도 있습니다. 시간이 지남에 따라 더 많은 것이 추가됩니다.
Filepath Completer (식별자 호수의 일부)와 같은 다른 완성 엔진도 있습니다.
서버는 모든 상황에서 어떤 완성 엔진이 최고인지 자동으로 감지합니다. 때때로, 그것은 한 번에 여러 가지를 쿼리하고 출력을 병합하고 결과를 나타냅니다.
시맨틱 엔진은 시맨틱 "트리거"가 코드에 삽입 된 후에 만 트리거됩니다. 받은 요청에 따라 사용자의 커서가 string foo; foo. C# 파일에서는 Semantic Engine이 foo 의 멤버를 검사하기 위해 트리거됩니다 . C#에 대한 기본 시맨틱 트리거입니다 (트리거는 동적으로 변경할 수 있음). 텍스트가 string foo; foo.zoo , 시맨틱 완료는 여전히 트리거되고 (방아쇠는 사용자가 입력하는 zoo 단어 뒤에 있습니다) 결과는 zoo 쿼리로 필터링됩니다.
Semantic 완료는 force_semantic: true 를 완료 요청에 대한 JSON 데이터에서 설정함으로써 강요 될 수 있지만, 사용자가 키보드 단축키로 시맨틱 완료를 명시 적으로 요청한 경우에만이를 수행해야합니다 . 그렇지 않으면 어떤 엔진을 사용 해야하는지 결정하려면 YCMD까지 맡기십시오.
시맨틱 완료가 가능한 경우에도 항상 사용되지 않는 이유는 의미 론적 엔진이 느려질 수 있고 대부분의 시간에 사용자가 실제로 시맨틱 완료가 필요하지 않기 때문입니다.
코드 완성을위한 두 가지 주요 사용 사례가 있습니다.
첫 번째 유스 케이스는 가장 일반적인 사용 케이스이며 식별자 완료 엔진 (BTW가 빠르게 타오르는)으로 사소하게 해결됩니다. 두 번째는 의미 론적 완성이 필요합니다.
주목해야 할 중요한 점은 완료 필터링은 입력이 완료의 문자열 접두사 인 것 (그러나 그 역시 작동)을 기반으로한다는 것 입니다. 입력은 완료의 후속 일치 여야합니다. 이것은 입력 문자가 입력에 나타나는 순서대로 완료 문자열로 존재해야한다고 말하는 멋진 방법입니다. 따라서 abc 는 xaybgc 의 후속이지만 xbyxaxxc 는 아닙니다.
후속 필터는 입력과 일치하지 않는 완성을 제거하지만 분류 시스템이 시작됩니다. 약간 관련이 있지만 대략 "Word Boundary"(WB) 후속 문자 일치는 비 WB 일치보다 "가치"입니다. 사실상, 이것은 "GUA"의 입력이 주어지면 "GetUserAccount"완료는 "Fooguxa"완료보다 목록에서 더 높아질 것입니다 (둘 다 후속 일치). 단어에 대한 문자는 모두 자본 문자, 밑줄이 밑줄이 앞서, 완성 문자열의 첫 글자 문자입니다.
서버가 한동안 요청을받지 못한 경우 ( --idle_suicide_seconds ycmd 플래그에 의해 제어됨) 자체가 종료됩니다. 이는 YCMD를 시작한 프로세스가 YCMD에도 죽도록 지시하지 않고 또는 YCMD가 걸려있는 경우 (이는 극히 드물어야 함)에 유용합니다.
YCMD 용 클라이언트를 구현하는 경우 정기적으로 핑을하는 일종의 유지 배경 스레드가 있는지 확인하십시오 (핸들러가 수행하더라도 /healthy 핸들러로 전화하십시오).
권장되지는 않지만 --idle_suicide_seconds=0 통과하여이를 꺼질 수도 있습니다.
시작하는 동안 YCMD는 ycm_core 라이브러리를로드하려고 시도하고 실패한 경우 다음 리턴 코드 중 하나를 종료합니다.
ycm_core 라이브러리가 누락되었습니다.ycm_core 라이브러리의 버전은 구식입니다. 서버 시작시 YCMD에 설정을 제공 할 수 있습니다. 조정할 수있는 default_settings.json 파일이 있습니다. 각 옵션에 대한 설명은 YCM 사용자 안내서 의 옵션 섹션을 참조하십시오. 수정 된 설정 파일로의 경로를 ycmd로 --options_file=/path/to/file flag로 전달하십시오. hmac_secret 설정을 설정해야합니다 (Base64로 값을 인코딩). 전달하는 파일에는 비밀 토큰이 포함되어 있으므로 안전한 방식으로 임시 파일을 생성하고 있는지 확인하십시오 ( mkstemp() Linux 시스템 호출은 좋은 아이디어입니다. 다른 OS의 경우 유사한 것을 사용하십시오).
시작 후 YCMD는 읽은 후 제공 한 설정 파일을 삭제합니다 .
설정 파일은 사용자가 구성한 값에 따라 편집기가 생성 해야하는 것입니다. 추가 파일 ( .ycm_extra_conf.py )도 있습니다. 사용자가 특정 시맨틱 완료자를 구성하기 위해 제공해야합니다. 이에 대한 자세한 내용은 YCM 사용자 안내서 의 해당 섹션에서도 확인할 수 있습니다.
.ycm_extra_conf.py 사양 .ycm_extra_conf.py 모듈은 다음 함수를 정의 할 수 있습니다.
Settings( **kwargs ) 이 기능을 통해 사용자는 프로젝트 당 또는 전 세계적으로 언어 완성기를 구성 할 수 있습니다. 현재 Libclang 기반의 불신자에 의해 요구되며 다른 완성기를위한 선택 사항입니다. 다음 주장은 kwargs 사전에서 검색 할 수 있으며 모든 완성 자에게 공통적입니다.
language : 함수를 불리는 불만의 식별자. 그 가치는 Python Completer의 python 이고 C-Family Completer의 cfamily 입니다. 이 인수는 한 번에 여러 완료자를 구성하는 데 유용합니다. 예를 들어:
def Settings ( ** kwargs ):
language = kwargs [ 'language' ]
if language == 'cfamily' :
return {
# Settings for the libclang and clangd-based completer.
}
if language == 'python' :
return {
# Settings for the Python completer.
}
return {} filename : 현재 편집 된 파일의 절대 경로.
client_data : 클라이언트 응용 프로그램에서 제공하는 추가 데이터. 예를 들어 YouCompleTeme 문서를 참조하십시오.
반환 값은 콘텐츠가 불신자에 의존하는 사전입니다.
LSP 서버는 종종 초기화 요청을 통해 사용자 구성을 지원합니다. 이들은 일반적으로 UI의 옵션으로 표시됩니다. YCMD는 사용자가 서버 초기화 메시지에 전달되는 설정의 정확한 사전을 지정할 수있게하여 .ycm_extra_conf.py 를 사용하여이를 지원합니다. 이 옵션은 ls 키에 따른 Settings 에서 반환됩니다. Python 사전은 JSON으로 변환되어 LSP 초기화 요청에 구두를 포함시킵니다. 서버의 옵션 세트를 결정하려면 서버의 문서 또는 package.json 파일을 참조하십시오. config_sections 객체는 키가 "섹션"이고 값은 해당 섹션에 해당하는 설정 조각 (일반적으로 ls 객체에서 발견)입니다. 이것은 훨씬 더 잘 지정되어 있으며 그것을 작동시키기 위해서는 시행 착오가 필요합니다. 선택 사항이며 workspace/configuration 지원을 명시 적으로 활성화하는 경우에만 유용합니다.
LSP 구성의 예 :
def Settings ( ** kwargs ):
if kwargs [ 'language' ] == 'java' :
return { 'ls' : { 'java.rename.enabled' : False },
# `config_sections` is not used for java...
'config_sections' : { 'section0' : {} } 또한 YCMD는 파일 유형과 명령 줄이 주어지면 모든 언어 서버를 사용할 수 있습니다. LSP 서버를 연결하는 데 사용자 옵션 language_server 사용하여 ycmd가 일반적으로 알지 못하는 것입니다. 값은 다음을 포함하는 사전 목록입니다.
name : 서버 이름을 나타내는 문자열cmdline : 서버를 실행하기위한 명령 줄을 나타내는 목록 (옵션; 포트를 지정하지 않은 경우 필수)port : 선택 사항. 지정된 경우이 포트에 TCP 연결이 사용됩니다. * 로 설정된 경우 사용되지 않은 로컬 포트가 선택되어 cmdline 에서 ${port} 로 사용할 수 있습니다 (아래 예제 참조).filetypes : 지원되는 필레 타입 목록.project_root_files : ycmd에 어떤 파일에 프로젝트 루트가 표시되는지 알려줍니다.capabilities' : YCMD의 기본 LSP 기능을 재정의합니다.workspace/configuration 지원을 활성화하면 LSP 서버와 관련된 추가 CONVENTRED 세부 정보를 확인하십시오.additional_workspace_dirs : LSP 서버 시작에서 열려야하는 정적으로 알려진 작업 공간을 지정합니다.triggerCharacters : LSP 서버의 트리거 문자를 완료하도록 재정의하십시오. 이는 서버가 모든 문자 또는 예를 들어 공백 문자에 대한 완료를 독창적으로 요청할 때 유용 할 수 있습니다. {
"language_server" : [ {
"name" : " gopls " ,
"cmdline" : [ " /path/to/gopls " , " -rpc.trace " ],
"filetypes" : [ " go " ],
"project_root_files" : [ " go.mod " ],
"triggerCharacters" : [ " . " ]
} ]
}또는 TCP 연결을 사용하려면 :
{
"language_server" : [ {
"name" : " godot " ,
"port" : " 6008 " ,
"filetypes" : [ " gdscript " ]
} ]
} 또는 사용되지 않는 로컬 포트를 사용하려면 port * 로 설정하고 cmdline 에서 ${port} 사용하십시오.
{
"language_server" : [ {
"name" : " someserver " ,
"cmdline" : [ " /path/to/some/server " , " --port " , " ${port} " ],
"port" : " * " ,
"filetypes" : [ " somethign " ],
"project_root_files" : [ " somethingfile " ]
} ]
} 이런 방식으로 만연한 사람을 연결하면 kwargs[ 'language' ] name 키의 값, 즉 위의 예에서 gopls 로 설정됩니다.
다수의 LSP 완성기는 현재 language_server 없이 다음과 같이 지원됩니다.
project_directory 사용하여 루트 디렉토리를 무시할 수도 있습니다.
def Settings ( ** kwargs ):
return { 'project_directory' : 'src/' } # The path may be absolute as well.참고 : LSP 기반 불신자가 "내장"을 지원하는 언어에 대해 구성된 경우 내장 지원을 무시합니다.
Settings 함수는 Libclang 및 Clangd 기반 완료자가 호출하여 현재 파일을 컴파일 할 때 컴파일러 플래그를 사용할 수 있습니다. 이 파일의 절대 경로는 kwargs Dictionary의 filename 키에 따라 액세스 할 수 있습니다.
두 완료자가 예상하는 반환 값은 다음 항목을 포함하는 사전입니다.
flags : (libclang의 필수, Clangd의 선택 사항) 컴파일러 플래그 목록.
include_paths_relative_to_dir : (선택 사항) 플래그 목록의 포함 경로가 상대적인 디렉토리. Libclang Completer 및 .ycm_extra_conf.py 의 디렉토리에 대한 ycmd 작업 디렉토리에 대한 기본값.
do_cache : (선택 사항) 부울은이 호출의 결과 (즉, 플래그 목록) 가이 파일 이름에 대해 캐시되어야하는지 여부를 나타내는 부울입니다. 기본값은 True . 확실하지 않은 경우, 기본값은 거의 항상 정확합니다.
Libclang 기반 불신자는 다음 항목도 지원합니다.
override_filename : (선택 사항) 파일 이름을 제공하는 파일 이름의 변환 단위로 구문 분석하는 문자열입니다. 이 고급 기능을 사용하면 'Unity'스타일 빌드를 사용하는 프로젝트 또는 다른 파일의 다른 포함에 의존하는 헤더 파일에 대한 프로젝트가 가능합니다.
flags_ready : (선택 사항) 플래그를 사용해야한다는 부울. 기본값은 True . 확실하지 않은 경우, 기본값은 거의 항상 정확합니다.
단순히 플래그 목록을 반환하는 최소 예제는 다음과 같습니다.
def Settings ( ** kwargs ):
return {
'flags' : [ '-x' , 'c++' ]
} Format 서브 컨 운송에 대한 구성은 Java Subserver 및 TypeScript 서브 서버에 대한 추가 conf로 지정할 수 있습니다. Formatter 옵션은 아래에서 찾을 수 있습니다.
이 서버는 나머지 서버와 다른 방식으로 제공되도록 사용자 정의 서식 옵션을 지원합니다. 이 목적을 위해 Settings 함수는 formatter 속성을 반환 할 수 있습니다.
Formatter 구성의 예는 다음과 같습니다.
def Settings ( ** kwargs ):
return {
'formatting_options' : {
'org.eclipse.jdt.core.formatter.lineSplit' : 30 ,
}
} Settings 함수를 통해 사용자는 완료 및 코드 이해력을 제공하기 위해 Compler가 사용하는 Python 통역사 및 sys.path 지정할 수 있습니다. 추가 논쟁은 전달되지 않습니다.
불러자가 예상하는 반환 값은 다음 항목을 포함하는 사전입니다.
interpreter_path : (선택 사항) Python 통역사로가는 경로. ~ 경로의 환경 변수가 확장됩니다. 절대적인 경로가 아니라면 PATH 를 통해 검색됩니다.
sys_path : (선택 사항) sys.path 에 선불 경로 목록.
사용 예 :
def Settings ( ** kwargs ):
return {
'interpreter_path' : '~/project/virtual_env/bin/python' ,
'sys_path' : [ '~/project/third_party/module' ]
}PythonSysPath( **kwargs )파이썬 지원을위한 선택 사항.
이 기능을 사용하면 Python Path sys.path 의 추가 사용자 정의가 가능합니다. 매개 변수는 Python Completer의 Settings 함수에 의해 반환 된 가능한 항목입니다.
interpreter_path : Python 통역사로가는 경로.
sys_path : sys.path 의 파이썬 경로 목록.
반환 값은 파이썬 경로의 수정 된 목록이어야합니다.
예를 들어 YCMD 자체 .ycm_extra_conf.py 참조하십시오.
글로벌 추가 모듈은 다음 추가 기능이있는 .ycm_extra_conf.py 모듈과 동일한 기능을 노출해야합니다.
YcmCorePreLoad()선택 과목.
이 방법은 정의 된 경우 C ++ Python 플러그인을 가져 오기 전에 서버에서 호출됩니다. 일반적으로 필요하지 않으며 고급 사용자에게만 사용됩니다.
Shutdown()선택 과목.
서버가 깨끗하게 종료되기 전에 호출됩니다. 일반적으로 필요하지 않으며 고급 사용자에게만 사용됩니다.
YCMD의 HTTP+JSON 인터페이스는 SEMVER를 따릅니다. YCMD는 YCM의 일부로 지난 몇 년 동안 광범위한 사용을 보았지만, API의 일부는 다른 편집자와 YCMD를 통합하는 가능한 문제를 발견 할 때 API의 일부가 약간 변경 될 수 있기 때문에 버전 번호는 1.0 미만입니다. 다시 말해, 현재 API는 의도하지 않게 VIM 특정 일 수 있습니다. 우리는 그것을 원하지 않습니다.
YCMD의 내부 API (즉, HTTP+JSON 이외의 다른)는 SEMVER로 덮여 있지 않으며 무작위로 변경 됩니다 . Python/C ++/etc 코드와 직접 상호 작용 하지 마십시오 !
HMAC 인증이 없으면 악의적 인 웹 사이트가 사용자를 가장 할 수 있습니다. Evil.com은 사용자가 브라우저에서 Evil.com을 방문하는 경우 LocalHost에서 청취하는 서버에 요청을 보낼 수 있다는 것을 잊지 마십시오.
이것은 단순히 이론적 관심이 아닙니다 . 로컬 호스트에서 실행되는 YCMD를 위해 작업 개념의 원격 코드 실행 익스플로잇이 작성되었습니다. 이 공격 벡터를 차단하기 위해 HMAC 인증이 추가되었습니다.
이 프로젝트는 기고자 행동 강령으로 공개됩니다. 이 프로젝트에 참여함으로써 귀하는 그 용어를 준수하는 데 동의합니다.
플러그인에 대해 궁금한 점이 있거나 도움이 필요한 경우 YCMD 사용자 메일 링리스트를 사용하십시오.
저자의 홈페이지는 http://val.markovic.io입니다.
이 소프트웨어는 GPL V3 라이센스에 따라 라이센스가 부여됩니다. © 2015-2019 YCMD 기고자