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拡張を取得できることを願っています。キーボードショートカットの使用をクリックし、ファイルシステムでファイルの親フォルダを開きます(ファイルが選択されている場合)。 」

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

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

答え2

これは、オペレーティングシステムやデスクトップ環境の機能ではなく、アプリケーションが使用するGUIツールキットを介して提供できるアプリケーションの機能です。 CinnamonでMintを使用している場合は、おそらく主にGnomeアプリケーションを使用します。

ほとんどのGnomeアプリケーションではドワーフ≤3.36(Ubuntu 20.04でテスト済み)次のキーシーケンスが機能します。Ctrl+O Alt+Up Shift+F10 Return

  1. Ctrl+O「開く」コマンドの一般的なGnomeキーボードショートカットです。これにより、Gtkファイルを開くダイアログボックスが開きます。以下の内容はすべて、このファイルを使用してダイアログを開くすべてのアプリケーションに適用されます。現在のファイルを含むディレクトリでダイアログボックスが開きます。
  2. Alt+Up現在のディレクトリの親ディレクトリに移動します。興味のある以前のディレクトリを選択してください。
  3. Shift+F10状況に合ったメニューを呼び出します。
  4. Returnコンテキストメニューで、最初の項目「ファイルマネージャとして開く」を選択します。

マウスを使用すると、次のようになります。

  1. 「ファイルを開く」コマンドを選択します。 (「別名で保存」も機能します。)
  2. 現在のディレクトリのパスが上部に表示され、各ディレクトリは別々のボックスに表示されます。現在のディレクトリの親ディレクトリである右側の2番目のボックスをクリックします。
  3. 選択した項目(つまり、興味のあるディレクトリ)を右クリックすると、コンテキストメニューが表示されます。
  4. コンテキストメニューから「ファイルマネージャで開く」を選択します。

私はGNOMEの専門家ではありません。たぶん、より便利な方法があるかもしれません。

そしてドワーフ≥3.38残念ながら、ファイルを開くダイアログボックスにはデフォルトで「最近」のリストが表示されるため、これはさらに問題になります。現在のファイルを含むディレクトリを表示するには、左側のタブのディレクトリに移動する必要があります(キーボードの使用:F6 Down Down...)。その後、Alt+Upまたはトップバーを使用して親ディレクトリに移動できます。

そしてケイト(19.12.3 でテスト) タブヘッダーのファイル名を右クリックし、「フォルダから開く」を選択します。

関連情報