【誰得！？】Linux mintで右クリックメニューを追加する方法

## やること
今回はHEIC/HEIFという拡張子がついた写真を右クリックしたら、png写真に変換するメニューを追加します。
（この記事通りにする場合は```heif-convert```をインストールしてください。）

例えばsample.HEICが選択された場合、```heif-convert sample.HEIC sample.png```を実行するようにします。(最終的にファイルはフルパスで指定しました。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116042/e6187139-ada1-cb92-7015-948b496d20fa.png)

サンプルは記事の最後にあります。

## 方法
### 設定ファイルを作成
```~/.local/share/nemo/actions/```をエクスプローラーで開くと、
以下のようなメッセージが出るので、右に表示されている「詳細」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116042/73fe7555-758d-7fb2-2c05-c07eccc83bdf.png)
テンプレートファイルが表示されます。
<details><summary>表示されない場合以下コピー</summary>

```config
[Nemo Action]

#############################################
#### DEBUGGING:
####
#### Run Nemo in debug mode using with
###  NEMO_DEBUG set to include 'Actions'
####
#### i.e.    $ nemo --quit
####         $ NEMO_DEBUG=Actions nemo --debug
#############################################

# Whether this action is active.  For troubleshooting.
# Optional - if this field is omitted, the action will be active
Active=false

# Standard tokens that can be used in the Name, Comment (tooltip) and Exec fields:
#
# %U - insert URI list of selection
# %F - insert path list of selection
# %P - insert path of parent (current) directory
# %f or %N (deprecated) - insert display name of first selected file
# %p - insert display name of parent directory
# %D - insert device path of file (i.e. /dev/sdb1)
# %e - insert display name of first selected file with the extension stripped
# %% - insert a literal percent sign, don't treat the next character as a token
# %X - insert the XID for the NemoWindow this action is being activated in.

# The name to show in the menu, locale supported with standard desktop spec.
# **** REQUIRED ****
Name=Test Custom Action applied to %N

# Tool tip, locale supported (Appears in the status bar)
Comment=This is a test for Nemo actions.  Action will be applied to %N

# What to run.  Enclose in < > to run an executable that resides in the actions folder.
# **** REQUIRED ****
#Exec=gedit %F
Exec=<myaction.py -r -g %P %F %U>

# Icon name to use in the menu - must be a theme icon name
Icon-Name=folder

# Gtk Stock ID to use for the icon.  Note if both Icon-name and Stock-Id are
# defined, the Stock-Id takes precedence.
#Stock-Id=gtk-cdrom

# What type selection: [s]ingle, [m]ultiple, any, notnone, none (background click), or
# a number representing how many files must be selected to display.
# ****** REQUIRED *******
Selection=m

# What extensions to display on - this is an array, end with a semicolon
# Single entry options, ending in a semicolon:
#     "dir" for directory selection
#     "none" for no extension.
#     "nodirs" for any selection, but not including directories.
#     "any" for any file type, including directories.
# Individual specific extensions can be a semicolon-terminated list
# Extensions are NOT case sensitive.  jpg will match JPG, jPg, jpg, etc..
# **** EITHER EXTENSIONS OR MIMETYPES IS REQUIRED *****
Extensions=any;

# What mime-types to display on - this is an array, end with a semicolon
# **** EITHER EXTENSIONS OR MIMETYPES IS REQUIRED *****
#Mimetypes=text/plain;

# Separator to use (if any) - add a string to insert between path/url entries
# in the exec line.  Optional - if you leave this out, a space is inserted.
# Note you can have trailing spaces here.
#Separator=, 

# Quote type to use (if any) - enclose paths/urls with quotes.  Optional - defaults
# to no quotes.  
# Can be:  single, double, backtick
#Quote=double

# Dependencies - program executables required for this action to work.  Nemo will
# Search in the path for these program(s) and not display the action if any are missing.
# You can also supply an absolute path to a file (i.e. /usr/lib/gvfs/gvfsd-archive) to check
# instead of or in addition to an executable in the path.
# This is an array, separate entries with semi-colon, and terminate with a semicolon.
#
# v3.0: Reverse dependencies: Prefixing a program with '!' will reverse the logic - if
# the program exists, the check will FAIL.
#Dependencies=xed;!gedit;

# Conditions - semicolon-separated array of special conditions:
#     "desktop" current (parent) folder is desktop
#     "removable" target (first selection) is removable
#     "gsettings <schema> <boolean key>"  is true
#     "gsettings <schema> <key> <key-type> <[eq|ne|gt|lt]> <value>"
#     "dbus <name>" exists
#     "exec <program>" run program and check its exit code (0 is pass, non-0 is fail).
#                      Enclose in < > if the program resides in the action's folder.

#Conditions=desktop;

# Escape Spaces (deprecated)
#
# This field is deprecated and does nothing - paths with spaces, as well as other special
# shell characters, will now be passed on correctly no matter what, even when Quote is not set.
#
# Optional - by default this is false

#EscapeSpaces=true

# Run in terminal - set to true to execute the Exec line in a spawned terminal window.
#
# Generally if you use this you should not have Quotes defined, as that will be taken care
# of during converting the expanded command string into an arg vector.
#
# Optional - by default this is false

#Terminal=false

# Uri scheme - provide a uri scheme that the current location's scheme must match
# For example:
# ...
# UriScheme=sftp
# ...
# sftp://joe@10.0.0.200/ matches
# file:///home/joe/.bashrc does not

#UriScheme=file
```
</details>

- テンプレートファイルの中身をすべてコピーします
- 同フォルダ内に```<適当な名前>.nemo_action```ファイルを作成し、貼り付けて保存します。

### 設定ファイルを編集
以下の項目を見つけて、それぞれ修正します。
```config
Active=true # trueにして設定を有効化します（多分）
Name=pngに変換する # 右クリックしたときの名前を変更します 
Comment=HEIC/HEIFをpngに変換する # メニューにカーゾルがのったときに下にでるコメント
Exec=heif-convert %F %P/%e.png # コメントアウトを外して、実行するコマンドを入力
# Exec=<myaction.py -r -g %P %F %U> # コメントアウトする⇛今回は自作コマンドではないので
Icon-Name=convert # iconsフォルダ※に入っている画像の名前（拡張子無）を入力
Selection=s # メニューを表示するファイルの選択数※
Extensions=HEIC;HEIF; # 拡張子（セミコロン区切りで大文字小文字区別はなし）
```
#### 選択しているファイルの名前を取得・使用するには（google翻訳）
```%F``` ```%e```辺りが使えると思います。
```
# %U - 選択した URI リストを挿入します
# %F - 選択範囲のパスリストを挿入します
# %P - 親 (現在の) ディレクトリのパスを挿入します
# %f or %N (非推奨) - 最初に選択したファイルの表示名を挿入します
# %p - 親ディレクトリの表示名を挿入します
# %D - ファイルのデバイス パスを挿入します (例: /dev/sdb1)
# %e - 最初に選択したファイルの表示名を拡張子を除いて挿入します
# %% - リテラルのパーセント記号を挿入します。次の文字をトークンとして扱いません
# %X - このアクションがアクティブ化されている NemoWindow の XID を挿入します。
```
#### 注意点
- 自作コマンドを使用するときは<コマンド>にするみたいです。
- アイコンは```~/.icons```内に配置（今回はconvert.svg）
- ```[s]ingle, [m]ultiple, any, notnone, none (background click), 数```から選択
- ファイルを指定する場合、一応フルパスでコマンドを実行するようにしたほうがいいと思います。（sample.png⇛/home/ubuntu/sample.png）その為に```heif-convert %F %P/%e.png```のようにしました。

#### デバックモードの実行
ファイルを保存して、デバックモードで実行したらフォルダが開き、動作を確認できます。
```
NEMO_DEBUG=Actions nemo --debug
```
何故か新しくエクスプローラーを開いても反映されてました。

#### 画像ファイル
以下からもらいました
[convet svg](https://www.iconpacks.net/free-icon/convert-3209.html)

## 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116042/29056797-4589-0ecb-5718-acb18d1dad29.png)

## サンプル
### webpを選択した時に「pngに変換する」
```
[Nemo Action]
Active=true
Name=pngに変換する
Comment=WEBPをpngに変換する
Exec=dwebp %F -o %P/%e.png
Icon-Name=convert # 自分の環境に合わせて変更してください。
Selection=s
Extensions=WEBP;
```
### ファイル・フォルダを選択したときに「vscodeで開く」
```
[Nemo Action]
Active=true
Name=vscodeで開く
Comment=「%e」をvscodeで開く
Exec=code %F
Icon-Name=folder
Selection=s
Extensions=any;
```