Bagaimana saya bisa menggunakan --servername dan --remote di neovim?

15

dalam vim saya dapat melakukan vim --servername foodan vim --servername foo --remote-silent bar.txtmembuka file dalam satu contoh vim dari beberapa terminal windows (via tmux atau apa pun). Bagaimana hal yang sama dicapai di NeoVim?

Rafael Vega
sumber

Jawaban:

8

Sejauh yang saya tahu vim memiliki fitur ini karena vim GUI (gvim) menggunakan server X grafis. Saya sadar bahwa non GUI Vim juga dapat menggunakan --servernameargumen tetapi hanya ketika X11 berjalan dan juga dengan mengaksesnya . Di sisi lain, neovim tidak memiliki dukungan grafis; untuk alasan itu, saya tidak berpikir bahwa --servernameopsi tersebut dapat bekerja (kecuali jika opsi tersebut telah sepenuhnya ditulis ulang dengan cara lain) karena saya akan merasa aneh memiliki program konsol yang mengakses server X11 hanya untuk tujuan itu.

Thomas Baruchel
sumber
Pada awalnya saya pikir jawaban ini salah, karena IPC tanpa X tidak hanya mungkin, tetapi juga sangat umum (mis. Soket). Tetapi :help x11-clientserversepertinya mengkonfirmasi: "Komunikasi antara klien dan server melewati server X. [..] Vim non GUI dengan akses ke tampilan X11 (| xterm-clipboard | diaktifkan), juga dapat bertindak sebagai server perintah jika nama server secara eksplisit diberikan "...
Martin Tournoij
7

Neovim remote adalah skrip python untuk mengendalikan proses neovim. Ini memiliki opsi vim style --servername dan --remote. Inilah yang saya gunakan sekarang untuk lingkungan kerja multi-terminal saya.

Rafael Vega
sumber
Perlu disebutkan bahwa plugin ini tidak berfungsi untuk platform Windows.
jdhao
4

Seperti disebutkan, semua fitur server klien dihapus di Neovim. Ini karena mereka menggunakan memori bersama X11 dan Neovim menghapus dukungan X11.

Namun, jika saya gunakan :help --servernamedi Neovim saya berakhir di dokumentasi untuk serverstart()fungsi:

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')"

Ini akan membuat soket di /tmp/; lihat :echo v:servernamejalannya. Mungkin lebih bermanfaat untuk menggunakan alamat yang lebih deterministik (misalnya serverstart('/tmp/nvim-remote'); meskipun Anda mungkin ingin membungkusnya dalam suatu fungsi, karena tidak akan menambahkan nomor seperti yang dilakukan Vim --serverstartjika ini sudah ada).

Anda dapat mengirim perintah dengan RPC API. Sejauh yang saya dapat temukan tidak ada cara untuk mengirim perintah untuk ini hanya dengan Neovim (meh). Anda harus memasang salah satu klien API . Misalnya dengan referensi klien Python API (yang juga digunakan oleh Neovim):

import neovim
nvim = neovim.attach('socket', path='/tmp/nvim-remote')
try:
    nvim.command(':e foo')
finally:
    nvim.quit()

Anda mungkin dapat mengirim byte yang sama dengan echo ... >> /tmp/nvim-removeperintah shell, tetapi RPC API menggunakan protokol non-teks yang agak non-sepele ("MessagePack RPC") dan mencari tahu byte mana yang akan dikirim adalah usaha yang terlalu banyak untuk posting ini; -)

Lihat :help rpcdetail lengkap tentang API RPC Neovim.


NB :help remote.txtserta banyak item bantuan lainnya (seperti help server2client()dan banyak lagi) masih ada di Neovim, tetapi tidak ada yang berhasil. Sepertinya siapa pun yang menghapus fitur ini melakukan pekerjaan yang sangat ceroboh.

Martin Tournoij
sumber
Ini jawaban yang sangat bagus . Ini memungkinkan saya untuk menulis versi neovim-remote saya sendiri yang sederhana dan kompatibel dengan windows untuk dijalankan :terminal. Dengan informasi ini, sangat mudah.
David