Gnome Shellランチャーでサブコマンドを実行できますか?

Gnome Shellランチャーでサブコマンドを実行できますか?

テキストエディタを実行するためのエイリアスを設定し、Gnome Shellで使用されている特定のデスクトップにローカルに保持します。

alias geany="geany --socket-file=/tmp/geany-sock-$(xprop -root _NET_CURRENT_DESKTOP | awk '{print $3}') ${1+"$@"}"

実際のGnome Shellランチャーを使ってこれをシミュレートしたいと思います。今私はランチャーコマンドを次のように設定しました。

geany --socket-file=/tmp/geany-sock-$(xprop -root _NET_CURRENT_DESKTOP | awk '{print $3}') %F

Geanyセッションがすでに開いている場合は、現在ウィンドウに開いているGeanyセッションを指しますが、新しいセッションは開始されません。スピナーを取得し、アプリを実行する代わりに終了します。これを行う方法はありますか?

答え1

.desktopファイルのシェルパラメータと変数は次に展開されます。サポートされていても文書化されていない。一般的な解決策は、(Avlmdが言ったように)シェルスクリプトを生成し、ファイルを実行可能.desktopファイルとして指定することです。

ダッシュボードでアプリケーションを起動するときのgnome-shellデフォルト値は活性化別のインスタンスがすでに実行されている場合は、アプリケーションを起動するのではなく停止します(実際に新しいインスタンスを起動するためにCtrl+を使用しない限り)。click動作はシェル拡張によって変更される可能性があるため、特別な場合には、上書きされた拡張が必要な
gnome-shell​​操作を実行する必要があります。onActivate/usr/share/gnome-shell/js/ui/appDisplay.js

  • 拡張フォルダの作成:

mkdir -p ~/.local/share/gnome-shell/extensions/[email protected]

  • 内部に次の 2 つのファイルを追加します。

metadata.json:

{
    "shell-version": ["3.6.3.1"], 
    "uuid": "[email protected]", 
    "name": "Geany Launcher", 
    "description": "Fire up new window if no instance on current workspace"
}

extension.js:

const Clutter = imports.gi.Clutter;
const Shell = imports.gi.Shell;
const Main = imports.ui.main;
const AppDisplay = imports.ui.appDisplay;

var _onActivateOriginal = null;

function  _onActivate(event) {
        this.emit('launching');
        let modifiers = event.get_state();
        let cTRL = Clutter.ModifierType.CONTROL_MASK;
        let rUN = Shell.AppState.RUNNING;
        let crtW = global.screen.get_active_workspace();
        if (this._onActivateOverride) {
            this._onActivateOverride(event);
        } else {
            if (this.app.get_id() == "geany.desktop") {
                if (this.app.state == rUN && ((modifiers & cTRL) || !this.app.is_on_workspace(crtW))) {
                    this.app.open_new_window(-1);
                } else {
                    this.app.activate();
                    } 
            } else {
                if (modifiers & cTRL && this.app.state == rUN) {
                    this.app.open_new_window(-1);
                } else {
                    this.app.activate();
                    }
                }
            }
        Main.overview.hide();
}

function init() {
  _onActivateOriginal = AppDisplay.AppWellIcon.prototype._onActivate;
}

function enable() {
  AppDisplay.AppWellIcon.prototype._onActivate = _onActivate;
}

function disable() {
  AppDisplay.AppWellIcon.prototype._onActivate = _onActivateOriginal;
}
  • Alt+ F2、、、rを使用してシェルを再起動しますEnter。その後、拡張を有効にしますgnome-tweak-tool(拡張を有効にするにはシェルを再起動する必要があるかもしれません)。

これはうまくいきますgnome-shell-3.6.3.1。他のバージョンがある場合は、シェルバージョンをmetadata.json反映するようにこの行を編集して変更します(以前のシェルバージョン(例:3.4.x)または将来のバージョン(例:3.8.x)で動作するという保証はありません。

"shell-version": ["3.6.3.1"],

拡張機能はシェルの動作のみをオーバーライドします。そのファイルをダブルクリックするとNautilus他のGeanyデスクトップのメインウィンドウが引き続きアクティブになるため、一貫した動作を得るにはシェルスクリプトトリックを使用する必要があります。現在のデスクトップにインスタンスがない場合にのみ新しいウィンドウが表示され、それ以外の場合は既存のウィンドウがアクティブになります。私はそれをインストールしていませんが、xpropこれは私のシステムで動作します。

  • 私の$ PATHのどこかに新しい実行可能ファイルを作成します(例/usr/local/bin/djinni:)。
#!/bin/sh

geany --socket-file /tmp/geany-sock-$(xdotool get_desktop) ${1+"$@"}
  • /usr/share/applications/geany.desktop新しく生成されたスクリプトをランチャー()に割り当てます。

    Exec=djinni %F

答え2

1つの考えられる解決策は、コマンドを〜/ bin / geanyに保存することです。

mkdir -p ~/bin
cat > ~/bin/geany
/usr/bin/geany --socket-file=/tmp/geany-sock-$(xprop -root _NET_CURRENT_DESKTOP | awk '{print $3}') $1
^d
chmod 755 ~/bin/geany

実行可能ファイルを作成し、次のように.desktopランチャーを作成します/home/$USER/bin/geany %F

関連情報