web-dev-qa-db-ja.com

ファイルマネージャーまたはコマンドラインから同じVimインスタンスで新しいファイルを開く方法は?

真夜中の司令官では、Options > Configuration > Use internal editが設定されていない場合、MCを押すと、Mceditではなくデフォルトのエディター(私はVimに設定しています)を使用します。 F4。それは良いことですが、Vimを終了するまでファイルマネージャがブロックされます。それを回避するために、

type/text
 Open=xterm -e vim %f &

拡張ファイル(~/.config/mc/mc.ext)そして私が押すと Enter 選択したテキストファイルで、Vimを使用して新しいターミナルで開き、MCを使用してナビゲートし続けることができます。

しかし、しばらくすると、さまざまな端末が開かれ、それぞれにファイルがあり、それらを次のように循環します AltTab 面倒になります。既存の単一のVimインスタンスの新しいタブ/バッファーですべての新しいファイルを開いて、多数のターミナルウィンドウを取得しないようにする方法はありますか?

編集:質問は当初、真夜中の司令官のみを対象としていました。現在、スコープはコマンドラインと他のファイルマネージャーにも拡張されています。

3
Quasímodo

はい。ただし、最初に_vim --version | grep clientserver_が_+clientserver_を返すことを確認してください。 _-_ではなく_+_を返す場合、その機能を有効にする簡単な方法はgVimをインストールすることです。たとえば、DebianとUbuntuでは、_Sudo apt-get install vim-gtk3_がインストールします。別の方法は、そのオプションでVimをコンパイルすることです。

_+clientserver_を取得したので、次の内容のファイル_~/vimserver.sh_を作成します。

_#!/bin/sh
if [ -z "$(vim --serverlist)" ]; then
    x-terminal-emulator -e vim -p --servername XVIM "$@" &
else
    vim --servername XVIM --remote-tab "$@"
fi
_

もちろん、それをホームフォルダに置く必要はありません。あなたのケースで最も適切なパスを選択してください。 _chmod +x ~/vimserver.sh_で実行可能にすることを忘れないでください。また、3行目では、ターミナルマンページで、新しいターミナルウィンドウでコマンドを実行するために適切なフラグを見つけます。 XTermの場合、これは確かに_-e_フラグですが、Gnome-terminalの場合1、Xfce4-terminalおよびTerminator。これは_-x_フラグです。

いくつかのファイルでテストします(複数のファイルを引数で渡すことができます):

_~/vimserver.sh file1 file2
~/vimserver.sh file3 file4
_

各ファイルは、同じVimインスタンスの新しいタブで開く必要があります。新しいファイルを新しいタブではなく新しいバッファーに入れたい場合は、_--remote-tab_を_--remote_に変更し、_-p_オプションを削除します。

ファイルマネージャー

真夜中の司令官

拡張ファイル_~/.config/mc/mc.ext_を編集して、以下を追加します。

_type/text
 Open=~/vimserver.sh %s
_

_%s_マクロは、選択された単一のファイルだけでなく、複数のタグ付きファイルも開くことができることを意味します!

Xfe

_~/vimserver.sh_に_Edit > Preferences > Programs > Text editor_を入れるだけです。 Xfeは複数のタグ付きファイルを一度に開くこともできます。

Pcmanfm、Thunar、Nemo、Rox、そしておそらく他のGUIファイルマネージャ

メニューエントリのラベルは少し異なる場合がありますが、手順は同じです。

テキストファイル_Open with... > Custom command line / Use a custom command_を右クリックします。コマンドテキストフィールドに_~/vimserver.sh_を入力し、チェックボックスをマークするか、デフォルトとして設定するボタンを押します。

_vimserver.sh_の説明

  • if [ -z "$(vim --serverlist)" ];

Vimサーバーがまだ存在していないかどうかをテストします。 Vimインスタンスが存在しない場合:

  • _x-terminal-emulator -e vim -p --servername XVIM "$@" &_

新しい端末が起動され、新しいVimサーバー(名前はXVIM)が使用されます。ファイルはその新しいVimインスタンスにロードされます(複数のファイルが指定されている場合、_-p_オプションにより、それぞれが独自のタブにあります)。特定の端末を指定できます。たとえば、_x-terminal-emulator_の代わりにxtermを使用できます。

  • _else vim --servername XVIM --remote-tab "$@"_

この場合、XVIMサーバーはすでに存在しているので、ファイルを新しいタブにロードするようにXVIMに指示するだけです。


既存のサーバーでファイルが開かれている場合、DE/WMがVimでターミナルに焦点を合わせていない場合があります。 Xtermの場合、単一のxdotool行を追加すると、次のように解決されます。

_#!/bin/sh
if [ -z "$(vim --serverlist)" ]; then
    xterm -name vimserver -e vim -p --servername XVIM "$@" &
else
    xdotool search --classname vimserver windowactivate
    vim --servername XVIM --remote-tab "$@"
fi
_

_-name_オプションがあるため、xdotoolはVimウィンドウを見つけてフォーカスを要求できます。私はいくつかの最新の端末(Gnome、Xfce4 ...)のマンページを読みましたが、それらには_--role_オプションがありますが、_-name_オプションとxdotoolがありません。役割オプションがないため、xdotool行をそれらに適合させる方法はありません。一方、ウィンドウマネージャーは役割を認識してウィンドウに焦点を合わせることができる場合があります。たとえば、Icewmは_icesh -R rolename activate_を提供しています。

gVim

GVimを希望または許可する場合2、_vimserver.sh_を気にしないでください。 _gvim --remote-tab-silent_を使用するだけです。例としてMCを使用すると、これは_~/.config/mc/mc.ext_に入ります。

_type/text
 Open=gvim --remote-tab-silent %f &
_

1 Gnome-terminalは_-x_を優先して_--_フラグを非推奨にしましたが、前者は引き続き機能します。

2 ユーザー@goldilocksが、gVimの使用法について クライアント/サーバーモードの実際の使用法は何ですか? の回答にコメントします。

3
Quasímodo