쿠분투: KDE Dolphin 사용자 메뉴(Custom Services)

원래 이글루스에 있던 글.


Nautilus 에는 Actions 가 있고, Nemo 에도 Actions 가 있다. Thunar 에도 같은 것이 있다.
그런데 KDE Dolphin 에선, 이것을 Action 도, Script 도 아닌, ‘Service’ 라고 부르고 있다.
Service 라길래 시스템 서비스(Daemon 이라고도 부르는)를 말하는 건가 했지만, 그게 아닌, 그냥 사용자가 정의한 명령어를 말하고 있었다.

먼저, KDE5 환경에서 Custom Service 파일이 어디에 있는지 알아야 한다.

$ kf5-config --path services
/home/userX/.local/share/kservices5/:/usr/share/kservices5/

위 내용처럼, ~/.local/share/kservices5/ 가 서비스파일이 들어갈 위치가 되겠다. 이 기능을 도와주는 다른 편집기등이 있는 지는 모르겠고, 파일을 직접 생성/편집해줘야만 하는 것 같다.

참고로, 다른 파일관리자들은 이런 방식들을 사용한다.

  • Nemo : ~/.local/share/nemo/actions/ 에 nemo_action 이라는 확장자를 가진 파일로 생성/설정.
  • Nautilus : 디렉토리가 아닌, dconf 에 저장하는 방식.
  • Thunar : ~/.config/Thunar/uca.xml에 저장됨. 설정은 Thunar 자체 메뉴로 가능.

이런 Action 들을 만들기에 가장 편한 건 아무래도 Thunar 겠고, 가장 어려운 것은 Nautilus 라고 할 수 있다. Dolphin 도 쉽지는 않은데.. 제대로된 설명서가 없다는 것도 한 몫한다.


일단, 그나마 쓸만한 설명서는 다음에서 찾을 수 있다.

서비스 파일은 Gnome/KDE 실행환경파일(?)과 동일한 .desktop 확장자를 가져야하고, 내용도 다른 desktop 파일과 비슷하다.

가장 다른점은, Actions 필드가 꼭 필요하단 점이다. 일반 desktop 파일엔 Actions(또는 이와 유사한, 하위 메뉴를 만드는 기능/필드)가 있을 수도, 없을 수도 있다.

desktop 파일엔 다음 내용이 ‘반드시’ 들어가야 한다.

[Desktop Entry]
Type=Service
ServiceTypes=KonqPopupMenu/Plugin
MimeType=image/png;image/jpeg;
Actions=setAsWallpaper
X-KDE-Submenu=새 메뉴
X-KDE-Priority=TopLevel
  • Type : Service. 기본값이고, 다른값을 넣으면 안된다.
  • ServiceTypes : KonqPopupMenu/Plugin. 이것도 마찬가지로 기본값. Konq 는 (King)Kong 이 아니고, Konq(ueror)인데, Dolphin을 사용할 때도 이렇게 넣어줘야 한다.
  • MimeType : 이건 어떤 MimeType/File 에 적용할 것인지에 따라 달라진다. 만약 audio 파일이라면 audio/* 등이 필요하다. /etc/mime.types 참고. MimeType 이 2개 이상이라면 ; 으로 분리하여 넣는다. 이 설정에 따라 특정 파일에만 작용하는 메뉴, 디렉토리 전체에 적용하는 메뉴등이 결정된다.
  • Actions : 여기엔, 다음에 나올 Actions 에 필요한 ‘메뉴 이름’들을 넣어준다. 만약 2개 이상이라면 aaa;bbb 등으로 구분한다.
  • X-KDE-Submenu=Zip 풀기 : 이 항목이 아예 없다면, 컨텍스트 메뉴는 ‘동작’ 항목 아래에 나타나게 된다. 이 항목을 주면 해당 메뉴가 만들어지고, 그 안에 명령어가 위치하게 된다. 메뉴의 위치는 X-KDE-Priority 에 의해 결정된다.
  • X-KDE-Priority=TopLevel : 메뉴(또는 명령)을 컨텍스트 어디에 위치시킬 것인지. 이 항목에서 TopLevel 말고 다른 값이 사용되는지 여부는 한참 찾아봤는데도 나오질 않는다.

다음은 실제 명령어를 입력할 부분.
위에서 Actions 이름을 setAsWallpaper 라고 줬으므로, 여기에도 같은 이름을 사용해야 한다.

[Desktop Action setAsWallpaper]
Name=Use As Wallpaper
Icon=background
Exec=dcop kdesktop KBackgroundIface setWallpaper %U 6
  • [Desktop Action setAsWallpaper] : 위에서 Actions 에 setWallpaper 라고 이름을 표기하였으므로, 여기에도 같은 이름을 줘야 한다. 만약 Actions 항목이 여러 개라면, 이 [Desktop Action XXX] 도 그와 동일하게 여러 개로 구성되어야 하며, 각각 Name, Icon, Exec 등을 포함해야 한다.
  • Name : Dolphin 에 표시될 이름. 적절히 아무거나 주면 된다.
  • Icon : Dolphin 에 표시될 아이콘. 절대경로로 주거나, icon path(/usr/share/icons, ~/.local/share/icons)에 있는 것들은 확장자를 제외한 파일명만 입력해줘도 된다.
  • Exec : 실제 명령어. 역시 절대경로로 주거나, 실행 Path 에 잡혀있는 것들은 명령어만 넣어줘도 된다.

여기에서, Exec 에는 몇가지 주의할 점이 있다.
Exec 는 복잡한 명령(명령을 두가지 내린다든가.. 기타 등등)을 내릴 경우 오작동을 할 가능성이 있으므로, 이런 경우는 실행 스크립트를 만들어놓고(Wrapper), 그것을 실행하게하는 편이 좋다.

위에도 언급했지만, 만약 어떤 명령을 ‘동작’ 메뉴 안에 넣지 않고, 컨텍스트 메뉴 최상위에 위치하게 하고 싶다면, Submenu 를 주지 말고 X-KDE-Priority=TopLevel 만 주면 된다.

또, 위 Exec 행 중, 맨 뒤에 있는 %U 는 desktop 파일에서 사용하는 매개변수이다.
이렇게 %U 로 사용되기 때문에, 만약 Exec 행 중간에 % 가 들어가는 경우가 있다면, %% 로 이스케이핑 해줘야 한다. (웹주소등을 넘길 때 % 가 들어가는 경우가 있는데, 이때 꼭 %% 로 넣어줘야 한다.)

주로 사용하는 것은 %f (단일 파일), %F (복수 파일)이다. 아래에 연결해 놓은, freedesktop.org 문서에는 ‘디렉토리 경로명’를 뜻하는 %d, %D 가 더 이상 사용되지 않는다(deprecated)고 나와있지만, 적어도 쿠분투 17.04 환경에선 %d, %D 를 사용할 수 있다.

그런데, 꼭 %f (%F) 인수를 사용하지 않아도 자동으로 선택한 파일명이 넘어간다. 즉, %f 나 %F 를 명시하지 않아도 선택한 파일명들이 자동으로 넘어가고, Working Directory 는 알아서 현재 디렉토리로 설정된다.

다시 말해서, Exec=ls-all, mime 은 text/* 이라고 설정하고, ls-all 스크립트는 다음과 같다고 한다.

#!/bin/bash

echo "$1" >> /home/userX/test1.txt
ls * >> /home/userX/test2.txt

이 상태에서, 돌핀에서 /home/userX/다운로드/abcd.txt 로 이동한 뒤, 해당 명령을 내리면, 아무런 인수를 주지 않았음에도 불구하고 test1.txt 에는 /home/userX/다운로드/abcd.txt 가 출력되고, test2.txt 에는 ls /home/userX/다운로드 결과가 출력된다.

mime 을 디렉토리(inode/directory)로 했을 경우엔 어떻게 될런지 모르겠지만, 적어도 ‘파일’인 경우, %f, %F 등을 주지 않아도 알아서 경로포함 파일명이 넘어간다.…
여기에 사용되는 모든 매개변수는 다음에서 찾을 수 있다.

이렇게 만든 메뉴는 돌핀 – 우클릭 – 동작 메뉴로 실행할 수 있다.

안녕하세요. 글 남겨주셔서 고맙습니다.