Làm cách nào tôi có thể sử dụng --servername và --remote trong neovim?


15

trong vim tôi có thể làm vim --servername foovim --servername foo --remote-silent bar.txtmở tệp trong một phiên bản của vim từ một số cửa sổ đầu cuối (thông qua tmux hoặc bất cứ điều gì). Làm thế nào là điều tương tự đạt được trong NeoVim?

Câu trả lời:


8

Theo tôi biết vim có tính năng này vì GUI vim (gvim) sử dụng máy chủ đồ họa X. Tôi biết rằng không phải GUI Vim cũng có thể sử dụng --servernameđối số nhưng chỉ khi X11 đang chạy và cũng bằng cách truy cập vào nó . Mặt khác, neovim không có hỗ trợ đồ họa; vì lý do đó, tôi không nghĩ rằng --servernametùy chọn này có thể hoạt động (trừ khi tùy chọn đó đã được viết lại hoàn toàn theo cách khác) vì tôi thấy lạ khi có một chương trình điều khiển truy cập máy chủ X11 chỉ cho mục đích đó.


Lúc đầu tôi nghĩ câu trả lời này là sai, vì IPC không có X không chỉ là có thể, mà còn rất phổ biến (ví dụ: socket). Nhưng :help x11-clientserverdường như xác nhận điều đó: "Giao tiếp giữa máy khách và máy chủ đi qua máy chủ X. [..] Một GUI Vim không có quyền truy cập vào màn hình X11 (| xterm-clipboard | đã bật), cũng có thể hoạt động như một máy chủ lệnh nếu một tên máy chủ được cung cấp rõ ràng "...
Martin Tournoij

7

Neovim remote là một kịch bản python để kiểm soát các quá trình neovim. Nó có các tùy chọn vim style --servername và --remote. Đây là những gì tôi sử dụng bây giờ cho môi trường làm việc nhiều thiết bị đầu cuối của tôi.


Điều đáng nói là plugin này không hoạt động cho nền tảng Windows.
jdhao

4

Như đã đề cập, tất cả các tính năng của máy khách đã bị xóa trong Neovim. Điều này là do họ sử dụng bộ nhớ chia sẻ X11 và Neovim đã loại bỏ hỗ trợ X11.

Tuy nhiên, nếu tôi sử dụng :help --servernametrong Neovim, tôi sẽ kết thúc tài liệu về serverstart()chức năng:

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

Điều này sẽ làm cho một ổ cắm trong /tmp/; xem :echo v:servernamecho đường dẫn Có thể hữu ích hơn khi sử dụng một địa chỉ xác định hơn (ví dụ: serverstart('/tmp/nvim-remote')mặc dù bạn có thể muốn bọc hàm này trong một hàm, vì nó sẽ không nối một số như Vim --serverstartnếu nó tồn tại).

Bạn có thể gửi lệnh với API RPC. Theo như tôi có thể tìm thấy, không có cách nào để gửi lệnh đến điều này chỉ với Neovim (meh). Bạn sẽ cần cài đặt một trong các ứng dụng khách API . Ví dụ với ứng dụng khách Python API tham chiếu (cũng là thứ mà Neovim từ xa sử dụng):

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

Bạn có thể có thể gửi cùng một byte bằng echo ... >> /tmp/nvim-removelệnh shell, nhưng API RPC sử dụng giao thức phi văn bản có phần không tầm thường ("MessagePack RPC") và tìm ra byte nào để gửi chính xác là quá nhiều nỗ lực cho bài đăng này; -)

Xem :help rpcđể biết chi tiết đầy đủ về API RPC của Neovim.


NB :help remote.txtcũng như nhiều mục trợ giúp khác (như help server2client()và nhiều mục khác) vẫn tồn tại trong Neovim, nhưng không có mục nào hoạt động. Có vẻ như bất cứ ai loại bỏ tính năng này đã làm một công việc khá cẩu thả.


Đây là một câu trả lời tuyệt vời . Nó cho phép tôi viết phiên bản neovim-remote tương thích với windows của riêng tôi để chạy trong :terminal. Với thông tin này, nó thật dễ dàng.
David
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.