ใน vim ฉันสามารถทำvim --servername foo
และvim --servername foo --remote-silent bar.txt
เปิดไฟล์ในอินสแตนซ์หนึ่งของ vim จากเทอร์มินัล windows หลายแห่ง (ผ่าน tmux หรืออะไรก็ตาม) สิ่งเดียวกันใน NeoVim ทำได้อย่างไร
ใน vim ฉันสามารถทำvim --servername foo
และvim --servername foo --remote-silent bar.txt
เปิดไฟล์ในอินสแตนซ์หนึ่งของ vim จากเทอร์มินัล windows หลายแห่ง (ผ่าน tmux หรืออะไรก็ตาม) สิ่งเดียวกันใน NeoVim ทำได้อย่างไร
คำตอบ:
เท่าที่ฉันรู้ vim มีคุณสมบัตินี้เพราะ GUI vim (gvim) ใช้เซิร์ฟเวอร์กราฟิก X ผมทราบว่าไม่ใช่ GUI เป็นกลุ่มยังสามารถใช้--servername
อาร์กิวเมนต์ แต่เฉพาะเมื่อ X11 ทำงานและยังโดยการเข้าถึงมัน ในทางตรงกันข้าม neovim ไม่มีการสนับสนุนกราฟิก ด้วยเหตุผลนั้นฉันไม่คิดว่า--servername
ตัวเลือกสามารถทำงานได้ (ยกเว้นว่าตัวเลือกนั้นจะถูกเขียนใหม่อย่างสมบูรณ์ในวิธีอื่น) เนื่องจากฉันจะแปลกที่มีโปรแกรมคอนโซลที่เข้าถึงเซิร์ฟเวอร์ X11 เพื่อจุดประสงค์นั้นเท่านั้น
รีโมต Neovimเป็นสคริปต์ไพ ธ อนสำหรับการควบคุมกระบวนการนีโอวิม มันมีรูปแบบเป็นกลุ่ม - ชื่อผู้ใช้และ - ตัวเลือกระยะไกล นี่คือสิ่งที่ฉันใช้ตอนนี้สำหรับสภาพแวดล้อมการทำงานหลายเทอร์มินัลของฉัน
ตามที่กล่าวถึงฟีเจอร์ไคลเอนต์เซิร์ฟเวอร์ทั้งหมดจะถูกลบใน Neovim นี่เป็นเพราะพวกเขาใช้หน่วยความจำที่แชร์ X11 และ Neovim ลบการสนับสนุน X11
อย่างไรก็ตามถ้าฉันใช้:help --servername
ใน Neovim ฉันจะลงเอยด้วยเอกสารประกอบสำหรับserverstart()
ฟังก์ชั่น:
serverstart([{address}]) serverstart()
Opens a named pipe or TCP socket at {address} for clients to
connect to and returns {address}. If no address is given, it
is equivalent to:
:call serverstart(tempname())
$NVIM_LISTEN_ADDRESS is set to {address} if not already set.
--servername
The Vim command-line option --servername can be imitated:
nvim --cmd "let g:server_addr = serverstart('foo')"
นี้จะทำให้ซ็อกเก็ตใน/tmp/
; ดู:echo v:servername
เส้นทาง มันอาจมีประโยชน์มากกว่าถ้าใช้ที่อยู่ที่กำหนดได้มากกว่า (เช่นserverstart('/tmp/nvim-remote')
แม้ว่าคุณอาจต้องการห่อสิ่งนี้ในฟังก์ชั่นเนื่องจากมันจะไม่ต่อท้ายหมายเลขที่ Vim --serverstart
ทำหากมีอยู่แล้ว)
คุณสามารถส่งคำสั่งด้วย RPC API เท่าที่ฉันสามารถหาได้ไม่มีทางที่จะส่งคำสั่งไปยังสิ่งนี้ด้วยเพียงแค่ Neovim (meh) คุณจะต้องติดตั้งหนึ่งในลูกค้าของ API ตัวอย่างเช่นกับไคลเอนต์ Python API อ้างอิง (ซึ่งเป็นสิ่งที่ใช้ระยะไกลของ Neovim):
import neovim
nvim = neovim.attach('socket', path='/tmp/nvim-remote')
try:
nvim.command(':e foo')
finally:
nvim.quit()
คุณอาจจะสามารถส่งไบต์เดียวกันด้วยecho ... >> /tmp/nvim-remove
คำสั่งเชลล์ แต่ RPC API ใช้โปรโตคอลที่ไม่ใช่ข้อความ ("MessagePack RPC") และไม่สำคัญว่าต้องใช้ไบต์ใดในการส่งโพสต์นี้ -)
ดู:help rpc
รายละเอียดทั้งหมดเกี่ยวกับ RPC API ของ Neovim
หมายเหตุ:help remote.txt
เช่นเดียวกับรายการความช่วยเหลืออื่น ๆ (เช่นhelp server2client()
และอื่น ๆ อีกมากมาย) ยังคงมีอยู่ใน Neovim แต่ไม่มีการทำงานใด ๆ ดูเหมือนว่าใครก็ตามที่นำคุณสมบัตินี้ออกไปทำสิ่งที่ไม่สวย
:terminal
ระยะไกลสำหรับการทำงานใน รับข้อมูลนี้มันง่ายอย่างน่าพิศวง
:help x11-clientserver
ดูเหมือนว่าจะยืนยัน: "การสื่อสารระหว่างไคลเอนต์และเซิร์ฟเวอร์ต้องผ่านเซิร์ฟเวอร์ X [.. ] GUI Vim ที่ไม่ใช่ที่มีสิทธิ์เข้าถึงจอแสดงผล X11 (| xterm-clipboard | เปิดใช้งาน) สามารถทำหน้าที่เป็นเซิร์ฟเวอร์คำสั่งได้เช่นกัน ชื่อเซิร์ฟเวอร์จะได้รับอย่างชัดเจน" ...