저는 MacOS에서 왔으며 한 가지 특정 기능에 집착합니다. 즉, (거의) 모든 응용 프로그램에서 (거의) 모든 파일로 작업할 때 파일을 표시하는 창의 제목 표시줄을 클릭한 다음 파일을 열 수 있습니다. 시스템에 있는 이 파일의 상위 폴더입니다.
MacOS에서 이는 거의 모든 응용 프로그램에서 사용할 수 있는 기능이며 운영 체제와 해당 운영 체제용으로 작성된 (대부분) 응용 프로그램 간의 상호 작용을 기반으로 합니다.
저는 Linux 시스템에서 비슷한 것을 갖고 싶습니다(저는 Cinnamon 데스크톱 환경에서 Mint를 사용합니다).
스크립트를 작성해야 할 수도 있고 솔루션의 일부가 설명될 수도 있음을 알고 있습니다.이 U&L 질문/답변에서. 아직 부족한 것은 파일 경로를 얻는 방법입니다.
따라서 필요한 최소한의 기능은 문서 창이 열려 있는 GUI 응용 프로그램을 사용하는 동안 시각화 중인 문서의 파일 경로를 (빠르게) 가져오는 것입니다.
통찰력을 가져 주셔서 감사합니다.
답변1
확인하시기 바랍니다다른 응용 프로그램에서 연 파일에서 파일 탐색기 열기. 저는 이 질문의 OP입니다.메뉴 답변허용됩니다. 여기있어완벽한 솔루션. 그러나 작동 방식을 이해하려면 참조 게시물을 철저하게 읽어야 합니다.
Super key + O다음 스크립트를 생성하고(적절한 권한 부여) 스크립트 이름이 이라고 가정하고 키보드 단축키(바인딩한)에 바인딩합니다 open-file-path.sh
. 이제 evince(단일 창을 가진 단일 프로세스가 있고 파일 경로는 명령을 통해 찾을 수 있음 ps
)와 같은 GUI 응용 프로그램에서 키보드 단축키를 사용하고 일부 파일을 열면 파일이 다음 위치에서 발견될 가능성이 높습니다. 파일 리소스 관리자에서 엽니다.
#!/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.conf
mpv 실행 파일에 대한 래퍼를 만들어야 합니다. 데스크탑 애플리케이션의 경우 이 파일을 사용합니다 .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이 친절하게 한 개의 데이터(windowID)를 노출하고 한 개의 데이터(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
이 두 가지 문제가 해결되면 "(거의) 모든 응용 프로그램에서 (거의) 모든 파일을 작업할 때 사용할 수 있는 gnome 확장을 얻을 수 있기를 바랍니다.키보드 단축키 사용을 클릭한 다음 파일 시스템에서 파일의 상위 폴더를 엽니다(파일이 선택된 경우). "
현재 저는 해킹된 솔루션을 개발하고 싶지 않으며 위에서 언급한 현재 솔루션으로 대부분의 문제가 해결되었습니다.
따라서 이러한 문제가 해결되면 알려 주시기 바랍니다. 작업을 완료할 수 있기를 바랍니다.
답변2
이는 운영 체제나 데스크탑 환경의 기능이 아니라 애플리케이션에서 사용하는 GUI 툴킷을 통해 제공될 수 있는 애플리케이션의 기능일 수 있습니다. Cinnamon과 함께 Mint를 사용하고 계시다면 아마도 주로 Gnome 애플리케이션을 사용하실 것입니다.
대부분의 Gnome 애플리케이션에서는드워프 ≤3.36(Ubuntu 20.04에서 테스트됨) 다음 키 시퀀스가 작동합니다.Ctrl+O Alt+Up Shift+F10 Return
- Ctrl+O"열기" 명령에 대한 일반적인 Gnome 키보드 단축키입니다. 그러면 Gtk 파일 열기 대화 상자가 열립니다. 다음의 모든 내용은 이 파일을 사용하여 대화 상자를 여는 모든 응용 프로그램에 적용됩니다. 현재 파일이 포함된 디렉터리에서 대화 상자가 열립니다.
- Alt+Up현재 디렉터리의 상위 디렉터리로 이동합니다. 관심 있는 이전 디렉터리를 선택합니다.
- Shift+F10상황에 맞는 메뉴를 불러옵니다.
- Return상황에 맞는 메뉴에서 첫 번째 항목인 "파일 관리자로 열기"를 선택합니다.
마우스를 사용하면 다음과 같습니다.
- "파일 열기" 명령을 선택하십시오. ("다른 이름으로 저장"도 작동합니다.)
- 현재 디렉터리의 경로가 상단에 표시되며 각 디렉터리는 별도의 상자에 표시됩니다. 현재 디렉터리의 상위 디렉터리인 오른쪽의 두 번째 상자를 클릭합니다.
- 선택한 항목(즉, 관심 있는 디렉터리)을 마우스 오른쪽 버튼으로 클릭하면 상황에 맞는 메뉴가 표시됩니다.
- 상황에 맞는 메뉴에서 "파일 관리자로 열기"를 선택하십시오.
나는 그놈 전문가가 아닙니다. 어쩌면 더 편리한 방법이 있을 수도 있습니다.
그리고드워프≥3.38, 불행히도 파일 열기 대화 상자에는 기본적으로 "최근" 목록이 표시되기 때문에 이는 더욱 문제가 됩니다. 현재 파일이 포함된 디렉터리를 보려면 왼쪽 탭의 디렉터리로 이동해야 합니다(키보드 사용: F6 Down Down...). 그런 다음 Alt+Up또는 상단 표시줄을 사용하여 상위 디렉터리로 이동할 수 있습니다 .
그리고케이트(19.12.3에서 테스트) 탭 헤더의 파일 이름을 마우스 오른쪽 버튼으로 클릭하고 "폴더에서 열기"를 선택합니다.