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]

  • 내부에 다음 두 파일을 추가하십시오.

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

한 가지 가능한 해결 방법은 명령을 ~/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.

관련 정보