ฉันจะใช้ --servername และ --remote ใน neovim ได้อย่างไร


15

ใน vim ฉันสามารถทำvim --servername fooและvim --servername foo --remote-silent bar.txtเปิดไฟล์ในอินสแตนซ์หนึ่งของ vim จากเทอร์มินัล windows หลายแห่ง (ผ่าน tmux หรืออะไรก็ตาม) สิ่งเดียวกันใน NeoVim ทำได้อย่างไร

คำตอบ:


8

เท่าที่ฉันรู้ vim มีคุณสมบัตินี้เพราะ GUI vim (gvim) ใช้เซิร์ฟเวอร์กราฟิก X ผมทราบว่าไม่ใช่ GUI เป็นกลุ่มยังสามารถใช้--servernameอาร์กิวเมนต์ แต่เฉพาะเมื่อ X11 ทำงานและยังโดยการเข้าถึงมัน ในทางตรงกันข้าม neovim ไม่มีการสนับสนุนกราฟิก ด้วยเหตุผลนั้นฉันไม่คิดว่า--servernameตัวเลือกสามารถทำงานได้ (ยกเว้นว่าตัวเลือกนั้นจะถูกเขียนใหม่อย่างสมบูรณ์ในวิธีอื่น) เนื่องจากฉันจะแปลกที่มีโปรแกรมคอนโซลที่เข้าถึงเซิร์ฟเวอร์ X11 เพื่อจุดประสงค์นั้นเท่านั้น


ตอนแรกฉันคิดว่าคำตอบนี้ผิดเนื่องจาก IPC ที่ไม่มี X เป็นไปไม่ได้ แต่เป็นเรื่องธรรมดามาก (เช่นซ็อกเก็ต) แต่:help x11-clientserverดูเหมือนว่าจะยืนยัน: "การสื่อสารระหว่างไคลเอนต์และเซิร์ฟเวอร์ต้องผ่านเซิร์ฟเวอร์ X [.. ] GUI Vim ที่ไม่ใช่ที่มีสิทธิ์เข้าถึงจอแสดงผล X11 (| xterm-clipboard | เปิดใช้งาน) สามารถทำหน้าที่เป็นเซิร์ฟเวอร์คำสั่งได้เช่นกัน ชื่อเซิร์ฟเวอร์จะได้รับอย่างชัดเจน" ...
มาร์ติน Tournoij

7

รีโมต Neovimเป็นสคริปต์ไพ ธ อนสำหรับการควบคุมกระบวนการนีโอวิม มันมีรูปแบบเป็นกลุ่ม - ชื่อผู้ใช้และ - ตัวเลือกระยะไกล นี่คือสิ่งที่ฉันใช้ตอนนี้สำหรับสภาพแวดล้อมการทำงานหลายเทอร์มินัลของฉัน


เป็นมูลค่าการกล่าวขวัญว่าปลั๊กอินนี้ไม่ทำงานสำหรับแพลตฟอร์ม Windows
jdhao

4

ตามที่กล่าวถึงฟีเจอร์ไคลเอนต์เซิร์ฟเวอร์ทั้งหมดจะถูกลบใน 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 แต่ไม่มีการทำงานใด ๆ ดูเหมือนว่าใครก็ตามที่นำคุณสมบัตินี้ออกไปทำสิ่งที่ไม่สวย


นี่คือคำตอบที่ยอดเยี่ยม มันช่วยให้ผมเขียนเองง่ายของฉันหน้าต่างเข้ากันได้กับรุ่นของ neovim :terminalระยะไกลสำหรับการทำงานใน รับข้อมูลนี้มันง่ายอย่างน่าพิศวง
David
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.