GUIアプリケーションでファイルを操作するときに、ファイルブラウザでファイルの親ディレクトリをどのようにすばやく開くことができますか?

GUIアプリケーションでファイルを操作するときに、ファイルブラウザでファイルの親ディレクトリをどのようにすばやく開くことができますか?

私はMacOSから来て、1つの特定の機能にこだわります。つまり、(ほぼ)すべてのアプリケーションで(ほぼ)すべてのファイルで作業しているときにファイルを表示するウィンドウのタイトルバーをクリックしてからファイルを開くことができます。システム上のこのファイルの親フォルダーです。

MacOSでは、これはほとんどすべてのアプリケーションで利用可能な機能であり、オペレーティングシステムとそのオペレーティングシステム用に作成された(ほとんどの)アプリケーション間の対話に基づいています。

タイトルを右クリックすると、文書の親フォルダにアクセスできます。

2回クリックすると、ファイル自体がハイライトされたファイルを含むフォルダウィンドウが表示されます。

私はLinuxシステムで同様のことをしたいと思います(私はCinnamonデスクトップ環境でMintを使用しています)。

スクリプトを書く必要があるかもしれませんし、ソリューションの一部が説明されるかもしれません。このU&Lの質問/回答から。まだ不足しているのは、ファイルパスを取得する方法です。

したがって、必要な最小限の機能は、ドキュメントウィンドウが開いているGUIアプリケーションの使用中に可視化されているドキュメントのファイルパスを(すばやく)取得することです。

洞察力をありがとうございます。

ベストアンサー1

確認してください別のアプリケーションで開いたファイルからファイルエクスプローラを開く。私はこの質問のOPです。メニューの回答許可されます。ここにいる完璧なソリューション。ただし、どのように機能するかを理解するには、参照記事をよく読んでください。

Super key + O次のスクリプトを作成し(適切な許可)、スクリプト名が仮定し、キーボードショートカット(バインド)にバインドしますopen-file-path.sh。 evinceなどのpsGUIアプリケーションでキーボードショートカットを使用して一部のファイルを開くと、ファイルが次の場所に見つかる可能性が高くなります。ファイルリソースマネージャで開きます。

#!/bin/bash

WINDOW_ID=$(xdotool getactivewindow)

PID_OF_ACTIVE_WINDOW=$(xdotool getwindowpid $WINDOW_ID)

CLASS_NAME=$(xprop -id $WINDOW_ID | rg WM_CLASS | cut -d '"' -f2)

if [ "$CLASS_NAME" = "com.github.johnfactotum.Foliate" ]; then
    log=$HOME/.myfoliate.log
    # nemo "$(awk -v var="$WINDOW_ID" '$1 == var {print}' $log | cut -d" " -f3-)"
    nemo "$(grep -oP "$WINDOW_ID $PID_OF_ACTIVE_WINDOW \K.*" $log)"
    exit 1
fi

if [ "$CLASS_NAME" = "libreoffice" ]; then
    log=$HOME/.mylibreoffice.log
    # nemo "$(awk -v var="$WINDOW_ID" '$1 == var {print}' $log | cut -d" " -f3-)"
    nemo "$(grep -oP "$WINDOW_ID $PID_OF_ACTIVE_WINDOW \K.*" $log)"
    exit 1
fi

if [[ "$CLASS_NAME" == @(gl) ]] ; then
    nemo "$(echo '{ "command": ["get_property", "path"] }' | socat - /tmp/mpv-socket | jq -r ".data")"
    exit 1
fi

MY_COMMAND_PATH=$(ps -p $PID_OF_ACTIVE_WINDOW -o command)

# https://stackoverflow.com/q/76028252/1772898
if printf -- '%s\n' "$MY_COMMAND_PATH" | grep -qoP '(file://)?(?<!\w)/(?!usr/).*?\.\w{3,4}+'; then
    nemo "$(printf -- '%s\n' "$MY_COMMAND_PATH" | grep -oP '(file://)?(?<!\w)/(?!usr/).*?\.\w{3,4}+')"
fi

明確に言えば、標準は次のとおりです。

  • 単一プロセスは単一ウィンドウに対応します。
  • psファイルパスは次のコマンドで見つけることができます。

他の互換性のないアプリケーション(libreoffice、foliateなど)の場合は、いくつかの追加手順があります。追加の措置を講じた後も、いくつかの問題が発生する可能性があります。使用する場合ファイル>開くアプリケーションのオプションです。ファイルを開くにはダブルクリックする必要があります。これらのアプリケーションがファイルパスを提供するために一部の内部APIを公開している場合(mpvの場合は内部APIを使用するなど)、この問題を解決できます。

まず、mpvについて議論しましょう。デフォルトでは動作します。基準を満たしています。

  • 単一プロセスは単一ウィンドウに対応します。
  • psファイルパスは次のコマンドで見つけることができます。

君はただ削除すればいい

if [[ "$CLASS_NAME" == @(gl) ]] ; then
    nemo "$(echo '{ "command": ["get_property", "path"] }' | socat - /tmp/mpv-socket | jq -r ".data")"
    exit 1
fi

からopen-file-path.sh

しかし、私の場合は、常にウィンドウがあるようにいくつかの変更を加えましたが、これがまさにこの回避策が必要な理由です。

私の場合、mpvに対してソケットを作成する必要があります。サインアップしてinput-ipc-server=/tmp/mpv-socketから$HOME/.config/mpv/mpv.confmpv実行可能ファイルのラッパーを作成する必要があります。デスクトップアプリケーションの場合は、このファイルを使用してください.desktop。 mpvの場合はそうです/usr/share/applications/mpv.desktop。私たちはそれを編集する必要があるので、コピーを配置して$HOME/.local/share/applications/mpv.desktopからそのコピーを編集するのが好きです。$HOME/.local/share/applicationsに優先します/usr/share/applications

cp /usr/share/applications/mpv.desktop $HOME/.local/share/applications/mpv.desktop

次に、次の行を変更します。$HOME/.local/share/applications/mpv.desktop

TryExec=mpv
Exec=mpv --player-operation-mode=pseudo-gui -- %U

そして

TryExec=/home/ismail/.dotfiles/.resources/bash-scripts/mpv.sh
Exec=/home/ismail/.dotfiles/.resources/bash-scripts/mpv.sh %U

ファイル/home/ismail/.dotfiles/.resources/bash-scripts/mpv.shは次のとおりです。

#!/bin/bash

socat_to_mpv() {
    socat - "/tmp/mpv-socket"
}

if pgrep -x mpv >/dev/null ; then
    wmctrl -x -R gl.mpv
    echo "{ \"command\": [\"loadfile\", \"$1\", \"replace\"] }" | socat_to_mpv
else
    mpv "$1"
fi

これは包装紙パスワード。 mpvを起動する前後にいくつかのコードを実行します。

Foliateの場合は、ファイル(mpvなど$HOME/.local/share/applications/com.github.johnfactotum.Foliate.desktopでコピーしたファイル)で次のように置き換えます。/usr/share/applications/Exec

Exec=/home/ismail/.dotfiles/.resources/bash-scripts/foliate.sh %U

ファイルfoliate.shは次のとおりです。

#!/bin/bash

log=$HOME/.myfoliate.log

file=$1

com.github.johnfactotum.Foliate "$1" &
sleep 2

for id in $(xdotool search --onlyvisible --class 'com.github.johnfactotum.Foliate')
do
    winpid=$(xdotool getwindowpid $id)
    winname=$(xdotool getwindowname $id)
    grep -q "^$id $winpid .*" $log || echo "$id $winpid $file" >> $log
done

pid_of_foliate=$(xdotool search --name 'com.github.johnfactotum.Foliate' getwindowpid)

if [ -n "$pid_of_foliate" ]
then
    awk -i inplace -v var="$pid_of_foliate" '$2 == var {print}' $log
fi

libreofficeの場合は、次のファイル(/usr/share/applications/mpvのようにからコピーしたファイル)にあります。

$HOME/.local/share/applications/libreoffice-calc.desktop
$HOME/.local/share/applications/libreoffice-draw.desktop
$HOME/.local/share/applications/libreoffice-impress.desktop
$HOME/.local/share/applications/libreoffice-writer.desktop

使用。 。 。交換Exec:

Exec=/home/ismail/.dotfiles/.resources/bash-scripts/libreoffice.sh --calc %U
Exec=/home/ismail/.dotfiles/.resources/bash-scripts/libreoffice.sh --draw %U
Exec=/home/ismail/.dotfiles/.resources/bash-scripts/libreoffice.sh --impress %U
Exec=/home/ismail/.dotfiles/.resources/bash-scripts/libreoffice.sh --writer %U

それぞれ。

ファイルlibreoffice.shは次のとおりです。

#!/bin/bash

log=$HOME/.mylibreoffice.log

file=$2

libreoffice "$1" "$2" &
sleep 2

for id in $(xdotool search --onlyvisible --class 'libreoffice')
do
    winpid=$(xdotool getwindowpid $id)
    winname=$(xdotool getwindowname $id)
    grep -q "^$id $winpid .*" $log || echo "$id $winpid $file" >> $log
done

pid_of_libreoffice=$(xdotool search --class 'libreoffice' getwindowpid)

if [ -n "$pid_of_libreoffice" ]
then
    awk -i inplace -v var="$pid_of_libreoffice" '$2 == var {print}' $log
fi

アイデアは、私たちが多くのアプリを使用していないということです。私たちが使用するアプリケーションには、少なくとも予想される動作に近づく方法があります。

メモ:スクリプトの依存関係が存在しない場合はインストールしてください。特にインストールする必要があるかもしれませんxdotool

メモ:ファイルを開くために使用しますnemoが、別のファイルエクスプローラを使用している場合は、それに応じてスクリプトを変更する必要があります。または同様のものと交換するnemoと、おそらく動作します。nautilus

改善分野:

このソリューションは、vscodeなどの一部のアプリケーションでは機能しません。しかし、彼らは右クリック > 埋め込みフォルダを開くオプション。

アップデート1:

私は一つのことをしてきました。GNOME拡張より良い経験を作りましょう。この問題を解決するにはいくつかの問題があります。 gnomeが親切に1つのデータ(windowID)を公開し、1つのデータ(PID)を変更した場合は、より良い解決策になります。今この瞬間これはハッキングになるだろう。

私が経験している問題は以下のリンクにあります。

https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/6705

https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/6708

https://gitlab.gnome.org/GNOME/glib/-/issues/3016

この2つの問題が解決したら、「(ほとんどの)すべてのアプリケーションで(ほとんどの)すべてのファイルを操作するときに使用できるgnome拡張を取得できることを願っています。キーボードショートカットの使用をクリックし、ファイルシステムでファイルの親フォルダを開きます(ファイルが選択されている場合)。 」

現在、私はハッキングされたソリューションを開発したくないので、上記の現在のソリューションでほとんどの問題を解決しました。

したがって、これらの問題が解決した場合はお知らせください。仕事を完了できることを願っています。

おすすめ記事