YCMD เป็นเซิร์ฟเวอร์ที่ให้ APIs สำหรับการเติมรหัสและรหัสการใช้งานรหัสอื่น ๆ เช่นคำสั่ง goto semantic (และอื่น ๆ ) สำหรับรูปแบบบางอย่าง YCMD ยังสามารถให้ข้อผิดพลาดในการวินิจฉัยและคำเตือน
YCMD เป็นส่วนหนึ่งของ codebase ของ YouCompleTeme แต่ได้ถูกแบ่งออกเป็นโครงการแยกต่างหากเพื่อให้สามารถใช้ในบรรณาธิการอื่นที่ไม่ใช่ VIM
ตรวจสอบเอกสาร API หากคุณต้องการใช้ไคลเอนต์ วิธีที่ดีในการเรียนรู้วิธีการโต้ตอบกับ YCMD คือการอ่าน (และรัน) ไฟล์ example_client.py ดูโฟลเดอร์ readme สำหรับตัวอย่างสำหรับรายละเอียดเกี่ยวกับวิธีเรียกใช้ตัวอย่างไคลเอนต์
อย่าลังเลที่จะส่งคำขอดึงเพิ่มลิงก์ไปยังลูกค้าของคุณที่นี่หากคุณสร้างขึ้นมา
หากคุณกำลังมองหาการพัฒนา YCMD ให้ดูคำแนะนำในการเรียกใช้การทดสอบ
ทั้งหมดนี้สำหรับ Ubuntu Linux รายละเอียดเกี่ยวกับการให้ YCMD ทำงานบนระบบปฏิบัติการอื่น ๆ สามารถพบได้ในคำแนะนำของ YCM (ไม่สนใจชิ้นส่วนเฉพาะ VIM) โปรดทราบว่า YCMD ทำงานบน Python 3.8.0+
ขั้นแรกให้ติดตั้งการพึ่งพาน้อยที่สุด:
sudo apt install build-essential cmake python3-dev
ถัดไปติดตั้งการอ้างอิงเฉพาะภาษาที่คุณต้องการ:
sudo apt install golang-go สำหรับ GOsudo apt install npm สำหรับ JavaScript และ TypeScriptsudo apt install mono-devel สำหรับ c#sudo apt install openjdk-8-jre สำหรับ javaเมื่อคุณโคลนที่เก็บครั้งแรกคุณจะต้องอัปเดต submodules:
git submodule update --init --recursive
จากนั้นเรียกใช้ python3 build.py --all หรือทั้งหมดที่แสดงโดยเฉพาะที่แสดงโดย python3 build.py --help สิ่งนี้ควรทำให้คุณไป
สำหรับคำแนะนำโดยละเอียดเพิ่มเติมเกี่ยวกับการสร้าง YCMD ดูคำแนะนำของ YCM (ละเว้นชิ้นส่วนเฉพาะ VIM)
nx-ycm-hmac HTTP HMAC คำนวณจากความลับที่ใช้ร่วมกันที่ส่งผ่านไปยังเซิร์ฟเวอร์เมื่อเริ่มต้นและหน่วยร้องขอ/ตอบสนอง อัลกอริทึม Digest คือ SHA-256 เซิร์ฟเวอร์จะรวม HMAC ไว้ในการตอบกลับ คุณ ต้อง ตรวจสอบก่อนใช้การตอบกลับ ดู example_client.py เพื่อดูว่ามันทำอย่างไรมีเครื่องยนต์ที่สมบูรณ์หลายอย่างใน YCMD สิ่งที่พื้นฐานที่สุดคือ completer-based identifier ที่รวบรวมตัวระบุทั้งหมดในไฟล์ที่ให้ไว้ในคำขอเสร็จสิ้นไฟล์อื่น ๆ ของไฟล์เดียวกันที่ให้ไว้ก่อนหน้านี้และไฟล์แท็กใด ๆ ที่ผลิตโดย CTAGs เครื่องยนต์นี้ไม่เป็นความหมาย
นอกจากนี้ยังมีเครื่องยนต์ความหมายหลายอย่างใน YCM มี completer ที่ใช้ clangd ที่ทั้งสองให้ความสมบูรณ์แบบความหมายสำหรับภาษา C-family นอกจากนี้ยังมี Completer ที่ใช้ Jedi สำหรับความสมบูรณ์แบบสำหรับ Python ซึ่งเป็น Completer ที่ใช้ Omnisharp สำหรับ C#ซึ่งเป็นผู้สร้างที่ใช้ GOPLS สำหรับ GO (ใช้ GOPLS สำหรับการกระโดดไปยังคำจำกัดความ) ซึ่งเป็น Completer ที่ใช้ TSServer สำหรับ JavaScript และ TypeScript จะเพิ่มมากขึ้นตามเวลา
นอกจากนี้ยังมีเอ็นจิ้นที่เสร็จสมบูรณ์อื่น ๆ เช่น Filepath Completer (เป็นส่วนหนึ่งของตัวระบุที่สมบูรณ์)
เซิร์ฟเวอร์จะตรวจพบว่าเอ็นจิ้นความสมบูรณ์จะดีที่สุดในทุกสถานการณ์โดยอัตโนมัติ ในบางครั้งมันก็สอบถามหลายคนในครั้งเดียวรวมเอาท์พุทและนำเสนอผลลัพธ์
เครื่องยนต์ความหมายจะถูกกระตุ้นหลังจากแทรก "ทริกเกอร์" ความหมายในรหัสเท่านั้น หากคำขอที่ได้รับแสดงให้เห็นว่าเคอร์เซอร์ของผู้ใช้เป็นหลังจากอักขระตัวสุดท้ายใน string foo; foo. ในไฟล์ C# สิ่งนี้จะทำให้เอ็นจิ้นความหมายตรวจสอบสมาชิกของ foo . เป็นทริกเกอร์ความหมายเริ่มต้นสำหรับ C# (ทริกเกอร์สามารถเปลี่ยนแปลงได้แบบไดนามิก) ถ้าข้อความเป็น string foo; foo.zoo ความสมบูรณ์แบบจะยังคงถูกเรียกใช้ (ทริกเกอร์อยู่ด้านหลังคำว่า zoo ที่ผู้ใช้กำลังพิมพ์) และผลลัพธ์จะถูกกรองด้วยการสืบค้น zoo
ความสมบูรณ์แบบอาจถูกบังคับโดยการตั้งค่า force_semantic: true ในข้อมูล JSON สำหรับคำขอเสร็จสมบูรณ์ แต่คุณควรทำสิ่งนี้เฉพาะในกรณีที่ผู้ใช้ร้องขอความสมบูรณ์แบบความหมายอย่างชัดเจนด้วยแป้นพิมพ์ลัด มิฉะนั้นปล่อยให้อยู่ที่ YCMD เพื่อตัดสินใจว่าจะใช้เครื่องยนต์ใด
เหตุผลที่ทำให้ความสมบูรณ์แบบไม่ได้ใช้เสมอไปแม้ว่าจะมีอยู่เพราะเครื่องยนต์ความหมายอาจช้าและเนื่องจากส่วนใหญ่เวลาผู้ใช้ไม่จำเป็นต้องใช้ความหมายแล้ว
มีสองกรณีการใช้งานหลักสำหรับการเติมรหัส:
กรณีการใช้งานครั้งแรกเป็นกรณีที่พบบ่อยที่สุดและได้รับการแก้ไขเล็กน้อยกับเครื่องระบุตัวตนที่สมบูรณ์ (ซึ่ง BTW นั้นเร็ว) อันที่สองต้องการความสมบูรณ์แบบ
สิ่งสำคัญที่ควรทราบคือ การกรองความสมบูรณ์ไม่ได้ขึ้นอยู่กับการป้อนข้อมูลเป็นคำนำหน้าสตริงของการเสร็จสิ้น (แต่ใช้งานได้เช่นกัน) อินพุตจะต้องเป็นการ จับคู่ที่ตามมา ของการเสร็จสิ้น นี่เป็นวิธีแฟนซีในการบอกว่าอักขระอินพุตใด ๆ ที่จำเป็นต้องมีอยู่ในสตริงที่เสร็จสมบูรณ์ตามลำดับที่ปรากฏในอินพุต ดังนั้น abc จึงเป็นลำดับของ xaybgc แต่ไม่ใช่ของ xbyxaxxc
ตัวกรองที่ต่อมาจะลบความสมบูรณ์ใด ๆ ที่ไม่ตรงกับอินพุต แต่จากนั้นระบบการเรียงลำดับเริ่มเข้ามามันเกี่ยวข้องกับการจับคู่ตัวละครที่ตามมา "ขอบเขตคำ" (WB) โดยคร่าวๆว่า "คุ้มค่า" มากกว่าการแข่งขันที่ไม่ใช่ WB ผลนี้หมายถึงการป้อนข้อมูลของ "gua" ความสำเร็จ "GetuserAccount" จะได้รับการจัดอันดับสูงกว่าในรายการมากกว่า "Fooguxa" เสร็จสมบูรณ์ (ทั้งสองอย่างนี้เป็นการแข่งขันที่ตามมา) อักขระที่มีขอบเขตเป็นตัวละครทั้งหมดตัวละครนำหน้าด้วยขีดเส้นใต้และตัวอักษรตัวแรกในสตริงที่เสร็จสมบูรณ์
หากเซิร์ฟเวอร์ยังไม่ได้รับคำขอใด ๆ ในขณะที่ (ควบคุมโดย --idle_suicide_seconds YCMD FLAG) มันจะปิดตัวเอง สิ่งนี้มีประโยชน์สำหรับกรณีที่กระบวนการที่เริ่มต้น 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 เป็นความคิดที่ดีใช้สิ่งที่คล้ายกันสำหรับระบบปฏิบัติการอื่น ๆ )
หลังจากเริ่มต้นขึ้น YCMD จะ ลบ ไฟล์การตั้งค่าที่คุณให้หลังจากอ่าน
ไฟล์การตั้งค่าเป็นสิ่งที่ตัวแก้ไขของคุณควรสร้างตามค่าที่ผู้ใช้ของคุณได้รับการกำหนดค่า นอกจากนี้ยังมีไฟล์พิเศษ ( .ycm_extra_conf.py ) ผู้ใช้ของคุณควรจะให้การกำหนดค่าความสมบูรณ์แบบบางอย่าง ข้อมูลเพิ่มเติมเกี่ยวกับมันสามารถพบได้ในส่วนที่สอดคล้องกันของ คู่มือผู้ใช้ ของ YCM
.ycm_extra_conf.py ข้อกำหนด โมดูล .ycm_extra_conf.py อาจกำหนดฟังก์ชั่นต่อไปนี้:
Settings( **kwargs ) ฟังก์ชั่นนี้ช่วยให้ผู้ใช้สามารถกำหนดค่าความสมบูรณ์ของภาษาได้ตามโครงการหรือทั่วโลก ขณะนี้จำเป็นต้องใช้ผู้สร้างที่ใช้ Libclang และเป็นตัวเลือกสำหรับผู้ที่ทำสำเร็จอื่น ๆ ข้อโต้แย้งต่อไปนี้สามารถเรียกคืนได้จากพจนานุกรม kwargs และเป็นเรื่องธรรมดาสำหรับผู้ที่ทำสำเร็จทั้งหมด:
language : ตัวระบุของผู้สร้างที่เรียกว่าฟังก์ชั่น ค่าของมันคือ python สำหรับ Python Completer และ cfamily สำหรับ C-Family Completer อาร์กิวเมนต์นี้มีประโยชน์ในการกำหนดค่าความสมบูรณ์หลายครั้งพร้อมกัน ตัวอย่างเช่น:
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 โดยอนุญาตให้ผู้ใช้ระบุพจนานุกรมที่แน่นอนของการตั้งค่าที่ส่งผ่านในข้อความเริ่มต้นเซิร์ฟเวอร์ ตัวเลือกเหล่านี้จะถูกส่งคืนจาก Settings ภายใต้คีย์ ls พจนานุกรม 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 สามารถใช้เซิร์ฟเวอร์ภาษาใดก็ได้เนื่องจากประเภทไฟล์และบรรทัดคำสั่ง ตัวเลือกผู้ใช้ language_server สามารถใช้เสียบปลั๊กเซิร์ฟเวอร์ LSP YCMD มักจะไม่ทราบ ค่าคือรายการพจนานุกรมที่มี:
name : สตริงที่แสดงชื่อของเซิร์ฟเวอร์cmdline : รายการที่แสดงบรรทัดคำสั่งเพื่อดำเนินการเซิร์ฟเวอร์ (ไม่บังคับ; บังคับหากไม่ได้ระบุพอร์ต)port : ไม่บังคับ หากระบุการเชื่อมต่อ TCP จะใช้กับพอร์ตนี้ หากตั้งค่าเป็น * พอร์ต locall ที่ไม่ได้ใช้จะถูกเลือกและทำให้มีประโยชน์ใน cmdline เป็น ${port} (ดูตัวอย่างด้านล่าง)filetypes : รายการของ FileTypes ที่รองรับproject_root_files : บอก ycmd ไฟล์ที่ระบุรูทโครงการcapabilities' : แทนที่ความสามารถของ LSP เริ่มต้นของ YCMDworkspace/configuration ให้ตรวจสอบรายละเอียด CONF พิเศษที่เกี่ยวข้องกับเซิร์ฟเวอร์ LSPadditional_workspace_dirs : ระบุพื้นที่ทำงานที่เป็นที่รู้จักแบบคงที่ซึ่งควรเปิดในการเริ่มต้นเซิร์ฟเวอร์ LSPtriggerCharacters : แทนที่อักขระทริกเกอร์ของเซิร์ฟเวอร์ 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 เป็น * และใช้ ${port} ใน cmdline :
{
"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 , usch เป็น:
หนึ่งยังสามารถแทนที่ไดเรกทอรีรากด้วย project_directory
def Settings ( ** kwargs ):
return { 'project_directory' : 'src/' } # The path may be absolute as well.หมายเหตุ: หากผู้สร้างที่สมบูรณ์แบบ LSP ได้รับการกำหนดค่าสำหรับภาษาที่รองรับ "ในตัว" มันจะแทนที่การสนับสนุนในตัว
ฟังก์ชั่น Settings ถูกเรียกโดย libclang และ clangd-based completer เพื่อให้ Flag คอมไพเลอร์ใช้เมื่อรวบรวมไฟล์ปัจจุบัน เส้นทางที่แน่นอนของไฟล์นี้สามารถเข้าถึงได้ภายใต้คีย์ filename ของพจนานุกรม kwargs
มูลค่าผลตอบแทนที่คาดว่าจะเป็นพจนานุกรมที่มีพจนานุกรมที่มีรายการต่อไปนี้:
flags : (บังคับสำหรับ libclang, เป็นตัวเลือกสำหรับ clangd) รายการของหมายเหตุคอมไพเลอร์
include_paths_relative_to_dir : (ไม่บังคับ) ไดเรกทอรีที่รวมพา ธ ในรายการของธงนั้นสัมพันธ์กัน ค่าเริ่มต้นไปยังไดเรกทอรีการทำงานของ YCMD สำหรับ Libclang Completer และ .ycm_extra_conf.py ไดเรกทอรีของ clangd completer
do_cache : (ไม่บังคับ) บูลีนที่ระบุว่าผลลัพธ์ของการโทรนี้ (เช่นรายการธง) ควรแคชสำหรับชื่อไฟล์นี้หรือไม่ ค่าเริ่มต้นเป็น True หากไม่แน่ใจค่าเริ่มต้นจะถูกต้องเกือบตลอดเวลา
ผู้สร้างที่ใช้ Libclang ยังรองรับรายการต่อไปนี้:
override_filename : (ไม่บังคับ) สตริงที่ระบุชื่อของไฟล์เพื่อแยกวิเคราะห์เป็นหน่วยการแปลสำหรับชื่อไฟล์ที่ให้มา ฟีเจอร์ที่ทันสมัยนี้ช่วยให้โครงการที่ใช้ 'Unity' Build' หรือสำหรับไฟล์ส่วนหัวซึ่งขึ้นอยู่กับอื่น ๆ รวมอยู่ในไฟล์อื่น ๆ
flags_ready : (ไม่บังคับ) บูลีนระบุว่าควรใช้ธง ค่าเริ่มต้นเป็น True หากไม่แน่ใจค่าเริ่มต้นจะถูกต้องเกือบตลอดเวลา
ตัวอย่างน้อยที่สุดที่ส่งคืนรายการธงคือ:
def Settings ( ** kwargs ):
return {
'flags' : [ '-x' , 'c++' ]
} การกำหนดค่าสำหรับคำสั่งย่อย Format สามารถระบุได้ด้วย cONF พิเศษสำหรับ Subserver Java และสำหรับ subserver typeScript ตัวเลือก Formatter สามารถดูได้ด้านล่าง:
เซิร์ฟเวอร์เหล่านี้รองรับตัวเลือกการจัดรูปแบบที่กำหนดเองที่จะจัดหาในวิธีที่แตกต่างจากที่เหลือ เพื่อจุดประสงค์นี้ฟังก์ชั่น Settings สามารถส่งคืนคุณสมบัติ formatter
ตัวอย่างของการกำหนดค่าฟอร์แมตจะเป็น:
def Settings ( ** kwargs ):
return {
'formatting_options' : {
'org.eclipse.jdt.core.formatter.lineSplit' : 30 ,
}
} ฟังก์ชั่น Settings ช่วยให้ผู้ใช้สามารถระบุล่าม Python และ sys.path ที่ผู้ทำสำเร็จจะใช้เพื่อให้การทำความเข้าใจเสร็จสมบูรณ์และรหัส ไม่มีการโต้แย้งเพิ่มเติม
มูลค่าคืนที่คาดว่าจะเป็นพจนานุกรมที่มีรายการต่อไปนี้:
interpreter_path : (ไม่บังคับ) เส้นทางไปยัง Python Interpreter ~ และตัวแปรสภาพแวดล้อมในเส้นทางจะขยายออกไป หากไม่ใช่เส้นทางที่แน่นอนมันจะถูกค้นหาผ่าน 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
ฟังก์ชั่นนี้อนุญาตให้ปรับแต่งเพิ่มเติมของ Python Path sys.path พารามิเตอร์ของมันคือรายการที่เป็นไปได้ที่ส่งคืนโดยฟังก์ชั่น Settings สำหรับ Python Completer:
interpreter_path : เส้นทางไปยัง Python Interpreter
sys_path : รายการเส้นทาง Python จาก sys.path
ค่าส่งคืนควรเป็นรายการที่แก้ไขของเส้นทาง Python
ดู YCMD ของตัวเอง .ycm_extra_conf.py สำหรับตัวอย่าง
โมดูลพิเศษทั่วโลกจะต้องเปิดเผยฟังก์ชั่นเดียวกับโมดูล .ycm_extra_conf.py พร้อมเพิ่มเติมต่อไปนี้:
YcmCorePreLoad()ไม่จำเป็น.
วิธีนี้หากกำหนดจะถูกเรียกโดยเซิร์ฟเวอร์ก่อนที่จะนำเข้าปลั๊กอิน C ++ Python โดยปกติจะไม่จำเป็นและการใช้งานสำหรับผู้ใช้ขั้นสูงเท่านั้น
Shutdown()ไม่จำเป็น.
เรียกว่าก่อนเซิร์ฟเวอร์ที่ออกอย่างหมดจด โดยปกติจะไม่จำเป็นและการใช้งานสำหรับผู้ใช้ขั้นสูงเท่านั้น
อินเทอร์เฟซ HTTP+JSON ของ YCMD เป็นไปตาม Semver ในขณะที่ YCMD ได้เห็นการใช้งานอย่างกว้างขวางในช่วงหลายปีที่ผ่านมาซึ่งเป็นส่วนหนึ่งของ YCM หมายเลขเวอร์ชันต่ำกว่า 1.0 เนื่องจาก API บางส่วน อาจ เปลี่ยนแปลงได้เล็กน้อยเนื่องจากผู้คนค้นพบปัญหาที่เป็นไปได้ในการรวม YCMD กับบรรณาธิการอื่น ๆ กล่าวอีกนัยหนึ่ง API ปัจจุบันอาจเป็นแบบเฉพาะเจาะจงโดยไม่ได้ตั้งใจ เราไม่ต้องการสิ่งนั้น
โปรดทราบว่า API ภายในของ YCMD (เช่นสิ่งอื่นใดนอกเหนือจาก HTTP+JSON) ไม่ ครอบคลุมโดย Semver และ จะ เปลี่ยนแปลงแบบสุ่มภายใต้คุณ อย่า โต้ตอบกับรหัส Python/C ++/etc โดยตรง!
หากไม่มี HMAC Auth เป็นไปได้ที่เว็บไซต์ที่เป็นอันตรายจะปลอมตัวเป็นผู้ใช้ อย่าลืมว่า Evil.com สามารถส่งคำขอไปยังเซิร์ฟเวอร์ที่ฟังใน LocalHost หากผู้ใช้เยี่ยมชม Evil.com ในเบราว์เซอร์
นี่ไม่ใช่แค่ความกังวลทางทฤษฎี การใช้งานรหัสระยะไกลที่ผ่านการพิสูจน์แนวคิดการใช้งานได้ถูกสร้างขึ้นสำหรับ YCMD ที่ทำงานบน LocalHost HMAC Auth ถูกเพิ่มเข้ามาเพื่อบล็อกเวกเตอร์การโจมตีนี้
โปรดทราบว่าโครงการนี้ได้รับการปล่อยตัวพร้อมกับจรรยาบรรณของผู้สนับสนุน โดยการเข้าร่วมในโครงการนี้คุณตกลงที่จะปฏิบัติตามข้อกำหนดของมัน
หากคุณมีคำถามเกี่ยวกับปลั๊กอินหรือต้องการความช่วยเหลือโปรดใช้รายชื่อผู้รับจดหมาย YCMD-users
หน้าแรกของผู้เขียนคือ http://val.markovic.io
ซอฟต์แวร์นี้ได้รับอนุญาตภายใต้ใบอนุญาต GPL V3 © 2015-2019 YCMD ผู้สนับสนุน