*remote.txt*	For Vim バージョン 9.1.  Last change: 2025 Nov 09


		  VIM リファレンスマニュアル	by Bram Moolenaar


Vimクライアントサーバー通信				*client-server*

1. 共通機能			|clientserver|
2. X11特有の項目		|x11-clientserver|
3. Win32特有の項目		|w32-clientserver|
4. ソケットサーバー固有の項目	|socketserver-clientserver|

==============================================================================
1. 共通機能						*clientserver*

オプション|+clientserver|でコンパイルした時には、Vimはコマンドサーバーとして動
作することができる。それによりクライアントからメッセージを受け取りそれを実行す
ることができる。同時に、Vimはクライアントの機能も持ち合わせVimサーバーへメッ
セージを送ることもできる。

以下のコマンドライン引数が利用できる:

    引数			意味 ~

   --remote [+{cmd}] {file} ...					*--remote*
				ファイルをリモートのVimで開く。Vimサーバーが無
				い時には、ローカルで実行される。オプションで
				+{cmd}に一つだけExコマンドを指定できる。コマン
				ドは "|" でつなげて複数指定できる。コマンドラ
				インの残りの部分はファイルのリストとして扱われ
				る。だからファイルではない引数はこれよりも前に
				書かなければならない。
				この方法で標準入力を開くことはできない|--|。
				次のようにしなければリモートのVimが問題を起こ
				すかもしれない。 >
				 vim --remote-send "<C-\><C-N>:n filename<CR>"
<
   --remote-silent [+{cmd}] {file} ...			*--remote-silent*
				上と同様、しかしサーバーが存在しなくてもエラー
				を報告しない。指定したファイルがすでにローカル
				で編集中であっても同様。
   --remote-wait [+{cmd}] {file} ...				*--remote-wait*
				--remoteと 同様、しかしリモートVimでファイルが
				完了(解放)されるまで待つ。
   --remote-wait-silent [+{cmd}] {file} ...		*--remote-wait-silent*
				--remote-wait と同様、しかしサーバーが存在しな
				くてもエラーを報告しない。
							*--remote-tab*
   --remote-tab			--remote と同様、しかし各ファイルを新しいタブ
				ページで開く。
							*--remote-tab-silent*
   --remote-tab-silent		--remote-silent と同様、しかし各ファイルを新し
				いタブページで開く。
							*--remote-tab-wait*
   --remote-tab-wait		--remote-wait と同様、しかし各ファイルを新しい
				タブページで開く。

						*--remote-tab-wait-silent*
   --remote-tab-wait-silent	--remote-wait-silent と同様、しかし各ファイル
				を新しいタブページで開く。
								*--servername*
   --servername {name}		サーバー名{name}になる。--remote コマンドのど
				れか1つと併用すると、デフォルトのサーバーでは
				なく{name}で指定されるサーバーに接続する(下を
				参照)。使用される名前は大文字になる。ソケット
				サーバーを使用する場合は、パスを指定できる。詳
				細については |socketserver-name| を参照。
								*--remote-send*
   --remote-send {keys}		サーバーに{keys}を送信して終了する。{keys} に
				マップは適用されない。特殊キー名が使用できる。
				例: "<CR>" は CR 文字になる。
								*--remote-expr*
   --remote-expr {expr}		サーバーに{expr}を実行評価させ、その結果を標準
				出力に印刷する。
								*--serverlist*
   --serverlist			サーバー名のリストを表示する。
								*--clientserver*
   --clientserver {method}	指定されたメソッド {method} をクライアントサー
				バー機能のバックエンドとして使用する。"socket"
				または "x11" のいずれかを指定できる。
				{Vim が |+X11| と |+socketserver| の両方の機能
				付きでコンパイルされたときのみ有効}


使用例 ~

既に起動しているgvimサーバーで "file.txt" を編集する: >
    gvim --remote file.txt

既に起動しているFOOBARという名のサーバーで "file.txt" を編集する: >
    gvim --servername FOOBAR --remote file.txt

既に起動しているFILESという名のサーバーがあれば、FILESで "file.txt" を編集する
が、無ければ自分がFILESになる: >
    gvim --servername FILES --remote-silent file.txt

--remoteの後の全ての引数がファイル名として解釈されるので動作しない: >
    gvim --remote --servername FOOBAR file.txt

リモートサーバーで "+foo" という名のファイルを編集する("./" により先頭の "+"
の特別な意味が無効化されていることに注目): >
    vim --remote ./+foo

"BLA" という名のリモートサーバーで編集中の全てのファイルを保存して終了する: >
    vim --servername BLA --remote-send '<C-\><C-N>:wqa<CR>'

☆サーバー名						*client-server-name*

デフォルトではVimは自分が起動された時の名前(gvim, egvim ...)のサーバーになろう
とする。これは引数 --servername で変更できる。指定した名前が利用できない場合に
は、利用できる名前になるように後置名が付加される。例えば、1つのX-Serverで2つ目
のgvimを起動したときには "gvim1" というようになる。その時のサーバー名へは組み
込み変数|v:servername|によりアクセスできる。サーバー名の大文字小文字は区別され
ないので、"gvim" と "GVIM" は同じとみなされる。Note ソケットサーバーが使用され
ている場合、いくつかの違いがあることに注意。|socketserver-differences| を参照。

Vimが引数 --remote や --remote-wait または --remote-send で起動された時には、
上記のようにその名前で起動されたサーバーを探そうと試みる。正確に一致するサー
バーがなかった時には、数字の後置名を付けて見つかった最初のサーバーを使用する。
引数 --servername に数字の後置を付けた名前を指定した場合には、それは正確に一致
するものだけを対象とする。

サーバーが見つからなく、--remote か --remote-wait が使われた時には、Vimは残り
のコマンドラインに従い起動し、そのファイルの編集セッションを自分自身で取り持
つ。この方法ならgvimはコマンドを送信する時に、既に別のgvimが起動しているかどう
かを知る必要は無い。

引数 --serverlist はVimに登録(実行)されている全てのコマンドサーバーを、標準出
力(stdout)に印刷して終了する。ソケットサーバーが使用されている場合は注意点があ
る。|socketserver-differences| を参照。

							*{server}*
引数 {server} はいくつかの関数で使われる。これが空文字列の場合、Unix ではデフォ
ルトのサーバー名として "GVIM" が使用される。MS-Windows では空文字列は動作しな
い。

Win32 NOTE: Vimサーバーをアクティブアプリケーション(トップウィンドウ)にするこ
とは、MS-Windowsがそれを許していないので必ずしも成功するわけではない。クライア
ントは引数 --remote や --remote-wait を使用しサーバー名が "g" で始まる時には、
サーバーをアクティブアプリケーションにすることを試みる。


☆リモート編集

引数 --argument は残りのコマンドラインから|:drop|コマンドを構成することを引き
起こし、それを上記の方法で送信する。
引数 --remote-wait は同じ事をして、加えて全てのファイルの編集の完了を待つよう
に設定される。これはBufUnloadイベントを使用し、だからファイルがアンロードされ
るとすぐに、Vimはファイルの編集が完了したと判断する。
引数 --remote と --remote-wait は残りのコマンドライン全てを自分のものとして扱
うことに注意。言い換えれば残り全ての引数はファイル名とみなされる。そこにオプ
ションを置くことはできない!


☆Vim script 関数
								*E240* *E573*
Vim script にはコマンドサーバーを操作するために幾つか関数がある。詳細な解説は
|builtin.txt|を参照するか、関数名の上でCTRL-]を使って完全な解説を参照すること。

    概要				     説明 ~
    remote_startserver( name)		     サーバーを開始する
    remote_expr( server, string, idvar)      式を送信する
    remote_send( server, string, idvar)      キーシーケンスを送信する
    serverlist()			     利用可能なサーバーのリストを得る
    remote_peek( serverid, retvar)	     結果文字列の有無確認する
    remote_read( serverid)		     結果文字列を取得する
    server2client( serverid, string)	     結果文字列を送信する
    remote_foreground( server)		     サーバーを前面に移動する

|CTRL-\_CTRL-N|の説明も参照。キーシーケンスの先頭に使用すると便利。
server2client()で使用するサーバーIDはexpand("<client>")で取得できる。

==============================================================================
2. X11特有の項目					*x11-clientserver*
				    *E247* *E248* *E251* *E258* *E277*

クライアントとサーバー間の通信はXサーバーにより行われる。Vimサーバーのディスプ
レイを指定する必要がある。Xサーバーの通常の保護機能が使われており、通信が成り
立つためにはそのXサーバーでウィンドウを作成できなければならない。異なるマシン
間での通信も可能である。

デフォルトでは、GUI Vim は X サーバーに名前を登録して送信された文字列を実行で
きるように備える。Vim はクライアントとしても振舞い、同じ X11 ディスプレイで動
作する別の Vim インスタンスに文字列を送ることができる。

X11のGUI Vim(gvim)が起動すると、ルートウィンドウの 'VimRegistry' プロパティに
送信サーバー名を登録しようと試みる。

X11ディスプレイにアクセスできる非GUIのVim(|xterm-clipboard|が有効になっている)
も、サーバー名が引数 --servername で明示的に与えられるか、Vim が
|+autoservername| 機能付きでビルドされている場合は、コマンドサーバーとして振舞
うことができる。

引数 --servername に空のサーバー名を与えればコマンドサーバー機能を無効にできる。

異なるアプリケーションからVimサーバーへコマンドを送るには、使われているプロト
コルの幾つかのヒントを含むソースコードsrc/if_xcmdsrv.cを参照のこと。

==============================================================================
3. Win32特有の項目					*w32-clientserver*

全てのWin32版Vimはコンソールもサーバーとして動作できる。OLEを組み込んでコンパ
イルする必要は無い。どのMS-Windowsでも動作する、Windowsメッセージが使用されて
いる。しかしネットワークを通じてやり取りすることはできない。

MS-Windowsメッセージを使っているから、どのようなアプリケーションでもVimサーバー
と通信することができる。加えてOLEの機能を使うこともできる|ole-interface|。

gvimを使っている時には、--remote-wait は以下のようにしないと正しく動作しない: >

	start /w gvim --remote-wait file.txt
<
==============================================================================
4. ソケットサーバー固有の項目			    *socketserver-clientserver*
				    *E1563* *E1564* *E1565* *E1566* *E1567*

クライアントとサーバー間の通信は Unix ドメインソケットを使用して行われる。これ
らのソケットは、以下の利用可能な順序で以下のディレクトリに配置される。
    1. 環境に $XDG_RUNTIME_DIR が設定されている場合は "$XDG_RUTIME_DIR/vim"。
    2. "$TMPDIR/vim-[uid]"。ここで "[uid]" はユーザーの uid である。このディレ
       クトリのアクセス権限は 700 に設定され、ユーザーのみが読み書きできる。
       $TMPDIR が設定されていない場合は、"/tmp" が使用される。

						    *socketserver-name*
サーバー id/名前を指定する際は、汎用名、絶対パス、または相対パスで指定できる。
サーバー id が "/" (絶対パス) または "./" または "../" (相対パス) で始まる場
合、ソケットへのパスとして扱われる。それ以外の場合、サーバー id は上記の共通
ディレクトリに配置されるソケットのファイル名になる。Note サーバー id/名前をパ
スとして指定する場合、スラッシュ "/" のみを含めることができる。"abc/dir" のよ
うな名前は無効である。

ソケットサーバー機能は、GTK GUI 版とターミナル版の両方の Vim で使用できる。Vim
が |+autoservername| 機能付きでコンパイルされていない場合、GUI 版であっても
X11 と同様にソケットサーバーを明示的に起動する必要がある。

Vim がクラッシュしたり、正常に終了しなかったりした場合、ソケットサーバーはソ
ケットファイルを削除せずそのまま残す。これは通常問題にはならない。ソケット名が
既に使用されている場合、Vim はそのソケットがデッド (どのプロセスにも接続されて
いない) かどうかを確認し、新しい名前を探す代わりに既存のソケットを置き換えるこ
とができるためである。

別のアプリケーションから Vim ソケットサーバーにコマンドを送信するには、ソース
ファイル src/os_unix.c を読むこと。そこには、使用されるプロトコルの詳細な説明
があります。

						    *socketserver-differences*
機能の大部分は X11 と同じだが、X11 ではクライアントがサーバーとして動作してい
なくてもサーバーと通信できるのに対し、ソケットサーバーではクライアントであって
もサーバーが動作している必要がある。ただし、|serverlist()| または
|--serverlist| 引数は例外で、サーバーが動作している必要はない。

さらに、サーバー id またはクライアント id は、X11 や MS-Windows のような数値
(16進数で表示) ではなく、ソケットへの絶対パスになる。これは |v:servername| 変
数で確認できる。

|--serverlist| 引数は X11 と同様に動作するが、確認対象は上記で挙げた共通ディレ
クトリに限られる。したがって、ソケットにカスタムのパスを使用している場合は検出
されない。例えば、|--serverlist| を実行している Vim プロセスの
$XDG_RUNTIME_DIR 以外、あるいは <$TMPDIR または /tmp> /vim 以外の場所にあるパ
スは検出対象にならない。

|+socketserver| と |+X11| の両方をコンパイルしている場合、使用可能なサーバーの
一覧を表示するには、|--clientserver| を "socket" に設定し、|--serverlist| と組
み合わせて追加する必要がある。1 つのコマンドで両方の種類のバックエンドの一覧を
表示することはできない。

						    *socketserver-x11*
Vim が |+X11| と |+socketserver| の両方でコンパイルされている場合、どちらのバッ
クエンドを使用するかは起動時に |--clientserver| 引数によって決定される。指定さ
れていない場合はデフォルトで X11 が使用される。ソケットサーバーを使用する Vim
インスタンスは、X11 を使用する Vim インスタンスと通信できない。

 vim:tw=78:sw=4:ts=8:noet:ft=help:norl:
