さまざまなGVimインスタンスを一意に識別する方法は?

さまざまなGVimインスタンスを一意に識別する方法は?

コマンドライン引数を使用して、新しいターミナルウィンドウをウィンドウマネージャまたは他のアプリケーションで一意に識別できるようにすることgnome-terminalができます。たとえば、次のようになります。--role

gnome-terminal --role=irc

これにより、以下のようにXウィンドウの役割が「irc」に設定されますxprop

WM_WINDOW_ROLE(STRING) = "foo"

GVimを使って同じことをする方法はありますか?シャンシャンが遅れてgvim --help見たけど無駄だった。

答え1

xdotool以下を使用してウィンドウのプロパティを設定できますWM_WINDOW_ROLE

$ xdotool set_window --role <ROLE_STRING> <WINDOW_ID>

WINDOW_ID次の方法で見つけることができますPID

$ xdotool search --onlyvisible --pid <PID>

xdotool 2.xこの方法を使用すると、無害なエラーメッセージが表示されます。

$ xdotool search --onlyvisible --pid 16076
Can't consume 1 args; are only 0 available. This is a bug.
23068675

あなたはそれを使用することができますxdotool 3.xこのエラーを削除してください。

しかし、インスタンスを起動してウィンドウがgvim表示されるのを待ってから、ここで新しいロール文字列を設定するカスタムラッパーを作成できます。次のように見えます。

#!/bin/sh

role="$1"
shift

gvim --nofork "$@" &
pid="$!"
window_id=

while true; do
    window_id=$(xdotool search --onlyvisible --pid "$pid" 2>&1 | tail -1)
    case $window_id in
    ''|*[!0-9]*) continue ;;
    *) break ;;
    esac
done

xdotool set_window --role "$role" "$window_id"

使用法:

$ ./gvim.sh FANTASTIC-NEW-ROLE <FILENAME> <OTHER-GVIM-PARAMS> <...>

この行は:

window_id=$(xdotool search --onlyvisible --pid "$pid" 2>&1 | tail -1)

xdotool 2.xとと両方が正常に動作します3.xgvimプロセスを開始してウィンドウを表示するのに時間がかかるため、ここに示すようなwhileループがsleep()必要になることがあります。インスタンスPIDを--nofork取得するにはオプションが必要ですgvim。変数にコピーされた数値が含まれていることを確認する移植可能な方法この回答

新しく作成されたウィンドウですでにある種のフックを使用している場合、たとえば悪魔スパイこのコードはあなたには適していない可能性があります。の新しいインスタンスは2つのウィンドウを作成しますが、1つだけが表示されるため、xdotoolwithと一緒に使用する必要があります。たとえば、ウィンドウを別のワークスペースに移動すると、表示されなくなります。--onlyvisiblegvimdevilspiegvim

関連情報