Rangerの世界: macOSとキーボードで開かれる新しい道（その４）

## はじめに

[前回までの記事（下記ご参照）](#一連の記事)で、Vimライクなキーボード操作がたのしいファイルマネジャー、Rangerについて掘り下げてきました。

- その１：Rangerの魅力的なリソースをウェブからピックアップ
- その２：「終われない問題」への対処法
- その３：標準機能の中から、特に便利な機能の紹介

今回の記事では、Rangerをさらに使いやすくするカスタマイズの方法に焦点を当てます。特にmacOSユーザには、役立つ情報が盛り沢山となっています。


## カスタマイズの準備

`ranger`は高いカスタマイズ性をもつファイルマネージャーです。カスタマイズを始める前に、デフォルトの設定ファイルをユーザのホームディレクトリへコピーします。

```bash
ranger --copy-config=all
```

これで、`~/.config/ranger/`にデフォルトの設定ファイルがコピーされます。

- **rc.conf**：メインの設定ファイル。キーバインドや動作に関するオプションをカスタマイズします。
- **scope.sh**：ファイルのプレビュー機能に関連する設定です。
- **rifle.conf**：`rifle`は`ranger`のファイルランチャーで、どのアプリで特定のファイルタイプを開くかを定義します。
- **commands.py**：`ranger`のコマンドをカスタマイズするためのファイルです。

これらの設定ファイルを編集し、rangerを再起動することで変更が反映されます。


## 📁 `gf`でFinderを開く

> **📌 背景と利点**：
> `ranger`を使用する際、時々GUIベースのファイルマネージャーであるFinderが必要になる場面があります。このカスタマイズを適用することで、`ranger`から直接Finderを開くことができ、作業の効率が向上します。


`ranger`は高機能なファイルマネジャーですが、macOSのFinderに特有の機能を使いたくなることも時折あります。とくに`ranger`への移行段階で、Finderの機能を使いたくなることがしばしばあります。

そこで、現在選択しているファイルやディレクトリをFinderで開く機能の追加方法を紹介します。

`commands.py`の末尾に以下のコードを追加します。

```python
class show_files_in_finder(Command):
    """
    :show_files_in_finder

    Present selected files in finder
    """

    def execute(self):
        self.fm.run('open .', flags='f')
```

次に、`rc.conf`に以下の`map gf`の行を追加します。

```conf
map gR eval fm.cd(ranger.RANGERDIR)
map g/ cd /
map g? cd /usr/share/doc/ranger
map gf show_files_in_finder # この行を追加
```

`ranger`を再起動し、`gf`とタイプすると、Finderが開きます。

> **📝 まとめ**：  
> このカスタマイズにより、`ranger`から簡単にFinderを起動できるようになり、ファイルの管理や操作がより柔軟になります。

👉　次に、ファイルの安全な削除に関するカスタマイズを見ていきましょう。


## 🗑️ `dT`でゴミ箱にファイルを移動

> **📌 背景と利点**：  
> ファイルを完全に削除する代わりにゴミ箱に一時的に移動することで、誤ってファイルを削除した場合のリスクを低減します。このカスタマイズにより、そのような安全な削除操作を`ranger`内で簡単に行うことができます。

`ranger`でのファイル削除コマンド`dD`は、ゴミ箱を経由せずにファイルを即座に削除します。従って、誤ってファイルを削除した場合の復旧が難しくなります。

もうひとつの削除コマンド、キーバインド`dT`は`console trash`に割り当てられていますが、macOSの「ゴミ箱に入れる」機能として動作しません。この動作を機能させるために、まず`trash`ツールをインストールし、次に`ranger`のキーバインドを設定します。

ターミナルを開き、`trash`をインストールします：

```
brew install trash
```

続いて、`rc.conf`に以下の行を追加します。

```conf
map dD console delete
# map dT console trash　# これがデフォルトの設定です
map dT shell trash %s # この行を新たに追加
```

`ranger`を再起動後、任意のファイルやフォルダを選択し、`dT`をタイプすることで、選択したアイテムをゴミ箱に移動できます。

> **📝 まとめ**：  
> `dT`コマンドの導入により、ファイルの安全な削除が`ranger`内で手軽に実現できるようになります。

👉　macOSには「クイックルック」という便利な機能があります。次のセクションでは、この機能を`ranger`でどのように活用できるかを探ります。


## 🔍 `ranger`でクイックルック

> **📌 背景と利点**：  
> macOSのクイックルック機能は、ファイルの内容を迅速に確認するのに非常に便利です。このカスタマイズを導入することで、`ranger`内からもこの機能を利用できるようになります。

macOSのFinderのクイックルック機能（スペースバーでのプレビュー）は、多くのユーザーにとって非常に便利です。この機能を`ranger`で利用できれば、さらに快適なファイル操作が実現できます。

macOSには、このクイックルックを行うためのコマンド`qlmanage`がデフォルトで含まれています。このコマンドを`rc.conf`に追加すると、キー操作でクイックルックを利用できます

```conf
map W display_log
map w taskview_open
map S shell $SHELL
map x shell qlmanage -p %s # この行を追加
```

:::note
利用可能な未使用のキーを調べる場合、次のコマンドが役立ちます。
```bash
ranger --list-unused-keys
```
:::

:::note
スペースキーを使用してクイックルックを起動したい場合は、以下のように設定すると良いでしょう。
```conf
map <Space> shell qlmanage -p %s
map x       mark_files toggle=True
```
:::

> **📝 まとめ**：  
> クイックルックのカスタマイズにより、`ranger`内でのファイルの高速プレビューが可能となり、作業の効率が大幅に向上します。

👉 次に、PDFという普及しているフォーマットのドキュメントのテキスト情報をどのように効率的にプレビューできるかについて詳しく見ていきましょう。


## 📄 PDF書類のテキストをプレビュー表示

> 📌 **背景と利点**：  
> PDFのビジュアルプレビューの代わりにテキストベースのプレビューを使用すると便利です。このカスタマイズにより、`ranger`でPDFのテキスト内容を直接プレビューできるようになります。

`ranger`は、ファイルを選択すると右側のペインにプレビューを表示します。このプレビュー機能は、画像などのビジュアルなコンテンツに特に役立ちます。しかし、この画像プレビューは不安定で、時折バックグランドタスクが残存することがあります。また、多くの場合、テキストコンテンツの直接的なプレビューが役立ちます。

前のセクションで、クイックルックを活用してPDFのビジュアルプレビューを得られるよう設定しました。このセクションでは、テキストベースのプレビューを取得する方法に焦点を当てます。

まず、画像のプレビュー機能をオフにして、コンテンツのテキストを中心にしたプレビューを優先します。`rc.conf`で以下の設定を確認してください。デフォルトでは`false`に設定されています。

```conf
set preview_images false
```

次に、PDFのテキスト内容を取得するために`mutool`をインストールします。

```bash
brew install mupdf-tools
```

:::note
`pdftotxt`もテキスト抽出ツールとして使用可能ですが、多様なエンコーディングに対応している点で`mutool`が優れているため、ここでは`mutool`を採用します。
:::

最後に、`scope.sh`のPDFプレビュー部分を以下のように書き換えます。

```sh
## PDF                                                   
pdf)
    ## Preview as text conversion                        
    mutool draw -F txt -i -- "${FILE_PATH}" 1-10 | \     
      fmt -w "${PV_WIDTH}" | \                           
      awk '/^$/{if (p) next };1 {p=1} {print}' && exit 5 
    pdftotext -l 10 -nopgbrk -q -- "${FILE_PATH}" - | \  
      fmt -w "${PV_WIDTH}" && exit 5                     
    exiftool "${FILE_PATH}" && exit 5                    
    exit 1;;                                             
```

この設定では:
- `mutool`を`pdftotext`よりも優先的に使用します。
- パラグラフ間の不要な空白行を`awk`コマンドで削除して、コンテンツを簡潔に表示します。

これで、`ranger`内でPDFファイルを選択した際に、そのテキスト内容のプレビューを取得することができます。さらに、`i`キーを押すとプレビューテキストを全画面で表示できます。

![SS 2023-08-12 11.59.57_mos.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184128/e59041a2-af34-08b5-7bd2-166a2414154b.png)

※サンプルのPDFファイルは、[目次、内閣府の位置付け、内閣府の組織の概要](https://www.cao.go.jp/about/doc/1.pdf)を利用させていただきました。

:::note
`ranger'内で`zm`コマンドを使用して`set mouse_enabled!`を実行すると、マウス操作が有効になります。これにより、プレビューで表示されているテキストをマウスで選択し、コピーすることができるようになります。
:::

> **📝 まとめ**：  
> このカスタマイズにより、`ranger`内でPDFのテキスト内容を直接プレビュー表示できるようになります。

👉 さらに、画像からのテキスト抽出という、OCR技術を利用したカスタマイズについても詳しく見ていきましょう。


## 📸 画像内のテキストをプレビュー表示

> 📌 **背景と利点**：  
> 画像ファイルにはテキスト情報が埋め込まれていることが多く、これらのテキストを素早く確認することが求められる場面があります。このカスタマイズを適用することで、`ranger`内から画像に含まれるテキストを直接抽出してプレビュー表示することができ、情報へのアクセスが迅速になります。

`ranger`のプレビュー機能の強力なところは、異なるファイル形式に対する柔軟性です。このセクションでは、画像ファイルからテキストを抽出し、プレビューとして表示する方法に焦点を当てます。

macOS Venturaは、ビルトインのOCR機能を搭載しており、日本語のテキスト抽出も高精度に行えます。これを利用し、スクリーンショットなどの画像ファイルもテキスト・プレビューを表示できます。

まず、OCRを実行するためのスクリプト`ocr.sh`を取得します。[doraTeX氏のGitHubリポジトリ](https://gist.github.com/doraTeX/da9a1a26dffbf3fe5d6ec12a9c79267c)からこのスクリプトをダウンロードし、`~/bin`などのパスの通ったディレクトリに配置してください。スクリプトの詳しい説明は、doraTeX氏の[ブログ記事](https://doratex.hatenablog.jp/entry/20230629/1687977178)で確認できます。

次に、`scope.sh`に`ocr.sh`を使用する設定を追加します。

```sh
## Image
image/*)
    ## Preview as text conversion
    # img2txt --gamma=0.6 --width="${PV_WIDTH}" -- "${FILE_PATH}" && exit 4
    ocr.sh "${FILE_PATH}" | fmt -w "${PV_WIDTH}" && exit 5 # この行を追加
    exiftool "${FILE_PATH}" && exit 6
    exit 1;;
```

この設定により、`ranger`で画像ファイルを選択したときにテキストベースのプレビューを直接表示できます。さらに、`i`キーを押すと、プレビューテキストを全画面で確認できます。この機能は、スクリーンショットからテキスト情報を取得するなど、多岐にわたる用途で利用できます。

![SS 2023-08-12 12.31.24_mos.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184128/2b9dfa59-4eff-7fe2-0c6e-6c617a6b8206.png)


:::note
`ranger'内で`zm`コマンドを使用して`set mouse_enabled!`を実行すると、マウス操作が有効になります。これにより、プレビューで表示されているテキストをマウスで選択し、コピーすることができるようになります。
:::

> **📝 まとめ**：  
> このカスタマイズにより、`ranger`を使用して画像からテキストを直接抽出し、その内容をプレビューとして表示できるようになります。これにより、画像に埋め込まれた情報へのアクセスが大幅に効率化されます。

👉　次に、広く利用されているフォーマットである、マイクロソフト・オフィス書類に関するプレビューのカスタマイズについて紹介します。


## 📊 オフィス書類のプレビュー表示

> 📌 **背景と利点**：  
> ビジネスの場で頻繁に使用されるマイクロソフトのオフィス書類（Word、Excel、PowerPointなど）は、`ranger`内でのプレビューできると非常に便利です。このカスタマイズを導入することで、これらのファイルの内容を`ranger`から迅速に確認できるようになります。

マイクロソフト・オフィスの書類、特にWord、Excel、PowerPointのプレビューがあると役立ちます。ここでは、Office書類をテキストプレビューする設定を説明します。

:::note
対象とする拡張子は`docx`、`xlsx`、`pptx`です。
:::

### Wordの設定

`pandoc`を使用してテキスト抽出を行います。まだインストールしていない場合は次のコマンドでインストールします。

```bash
brew install pandoc
```

`scope.sh`はデフォルトで`pandoc`によるテキストプレビュー設定が含まれているので、追加の設定は不要です。

### Excelの設定

Excelのテキスト抽出には`in2csv`を利用します。必要なツールをインストールします。

```bash
brew install csvkit
```

次に、`scope.sh`の設定を追加します。

```sh
## XLSX
xlsx)
    ## Preview as csv conversion
    ## Uses: https://github.com/dilshod/xlsx2csv
    # xlsx2csv -- "${FILE_PATH}" && exit 5 # デフォルトの設定
    in2csv -- "${FILE_PATH}" | sed -e 's/,\{2,\}/ /g' -e 's/^,//' && exit 5 # この行を追加
    exit 1;;
```

:::note
多数のカンマを除去するために、`sed`コマンドを利用しています。
:::

### PowerPointの設定

PowerPointのテキスト抽出には`pptx2txt.sh`を使用します。[welcheb氏のリポジトリ](https://github.com/welcheb/pptx2txt.sh)からスクリプトをダウンロードし、適切なディレクトリに配置してください。

そして、`scope.sh`に以下の設定を追加します。

```shell
## XLSX
xlsx)
    ## Preview as csv conversion
    （途中は省略）

## PPTX
pptx)
    ## preview as text conversion
    pptx2txt.sh  "${FILE_PATH}" | fmt -w "${PV_WIDTH}" && exit 5
    exit 1;;
```

これで、マイクロソフト・オフィスの主要な書類をテキストプレビューする設定が完了しました。マウス選択してコピーができますので、オフィス書類からプレーンテキストを迅速に取得するのにも適しています。

:::note
`ranger`内で`zm`コマンドを実行すると、マウス操作が有効になります。これにより、プレビュー表示のテキストをマウスで選択・コピーすることができます。
:::

> **📝 まとめ**：  
> このカスタマイズにより、マイクロソフト・オフィス書類のテキストコンテンツを`ranger`内で直接プレビューすることができ、作業の効率と生産性が向上します。

👉　最後に、PDFやオフィス書類のテキスト情報をエディタ開く方法を、詳しく見ていきましょう。


## 📝 PDFやオフィス書類をエディタで開く

> 📌 **背景と利点**：  
> PDFやオフィス書類は情報を取り扱う際の主要なフォーマットですが、これらの内容を高機能なエディタで素早く検索したり、必要なテキスト部分を簡単にコピーしたりするのは一般的には難しいです。このカスタマイズを適用することで、`ranger`と統合されたエディタの全ての機能を利用して、これらのドキュメントのテキスト情報を効率的に扱うことができるようになります。

前セクションで、PDFやマイクロソフト・オフィス書類をテキストプレビューする設定を導入しました。さらにこれをエディタで開き、テキスト情報を効率よく取得・編集する方法を紹介します。

### PDFの場合

前回の設定を応用して、`rifle.conf`に以下の行を追加します。

```conf
#-------------------------------------------
# Documents
#-------------------------------------------
ext pdf, has open,     X, flag f = open "$@"
ext pdf = mutool draw -F txt -i "$1" | fmt -w 80 | awk '/^$/{if (p) next };1 {p=1} {print}' > /tmp/temp_preview.txt && $EDITOR /tmp/temp_preview.txt && rm /tmp/temp_preview.txt # この行を追加
ext pdf, has llpp,     X, flag f = llpp "$@"
```

こちらの設定により、PDFのテキスト情報を`mutool`を使用して一時ファイルに抽出し、その後エディタで開きます。

:::note info
`r`キーを押すと、`rifle.conf`の設定を順に読み込み、利用可能なツールを選択して表示します。テキストとして`$EDITOR`でPDFを開くオプションを優先させるため、設定は上部に配置しています。
:::

### PowerPointの場合

前セクションと同様のテキスト抽出方法を使用します。`rifle.conf`に以下の行を追加します。

```conf
ext pptx = pptx2txt.sh "$1" | fmt -w 80 > /tmp/temp_preview.txt && $EDITOR /tmp/temp_preview.txt && rm /tmp/temp_preview.txt
```

これにより、PowerPointの内容を`pptx2txt`を使用してテキストとして抽出し、エディタで開くことができます。

### WordやExcelの場合

PDFやPowerPointと同様の方法で、テキスト情報の抽出とエディタでの表示が可能です。具体的なコードは前セクションを参考にしてください。

この設定により、PDFやMS Officeの書類をエディタで直接開くことができるようになりました。エディタの高機能な検索や編集機能を利用して、オフィス書類からの情報取得や編集が簡単に行なえます。

:::note 　warn
設定内のテキストフォーマットの幅は80文字に固定しています。必要に応じてこの数値を変更してください。
:::

> **📝 まとめ**：  
> このカスタマイズにより、`ranger`を使用してPDFやオフィス書類のテキスト情報をエディタで開き、高度な検索やテキストのコピーなどのエディタの機能をフルに活用することができるようになります。

👌 これで、`ranger`の主要なカスタマイズ方法についての紹介は終了です。最後に、これらのカスタマイズの全体的な利点やまとめを振り返りましょう。


## おわりに

本記事を通じて、`ranger`の強力なカスタマイズ方法を多方面にわたって紹介しました。macOSのFinderの開き方、ゴミ箱へのファイル移動、そしてクイックルックの活用方法まで、便利なテクニックを示しました。また、PDFやマイクロソフト・オフィス書類のテキスト・プレビューや、それらをエディタで効率的に編集する方法は、強力なツールとして日常業務の役に立つでしょう。

多くのユーザーが日々取り扱うファイル形式や業務に関わる操作を中心に、`ranger`のカスタマイズの可能性を最大限に引き出す方法をご紹介しました。この情報が、皆様の作業効率の向上や、より快適なファイル操作の実現に役立つことを心から願っています。

次の記事では「おまけ編」として、`iTerms2`と`ranger`のカラースキームの調整をご紹介します。見た目のやさしさに加え、rangerで複数ペインを並べたとき、どれがアクティブかわかりにくい問題を解決します。

それでは、ハッピー`ranger`ライフを！


## ご参考

### 紹介ツールのリンク

- `ocr.sh`： 画像ファイルからテキスト情報を抽出
    - doraTeX氏のブログ記事　[macOS のデフォルト状態でコマンドラインからOCR処理を行う](https://doratex.hatenablog.jp/entry/20230629/1687977178)
    - [doraTeX氏のGitHubリポジトリ](https://gist.github.com/doraTeX/da9a1a26dffbf3fe5d6ec12a9c79267c)
- `pptx2txt.sh`：　PowerPoint書類からテキスト情報を抽出
    - [welcheb氏のリポジトリ](https://github.com/welcheb/pptx2txt.sh)


### 一連の記事

- その１：Rangerの魅力的なリソースをウェブからピックアップ
- その２：「終われない問題」への対処法
- その３：標準機能の中から、特に便利な機能の紹介
- その4：カスタマイズして便利な機能の紹介
- おまけ：カラースキームのオススメの組み合わせ

https://qiita.com/hann-solo/items/4279eb7211fdba680535

https://qiita.com/hann-solo/items/691cb695be5bba80f6ea

https://qiita.com/hann-solo/items/7bb85d89afadb3b7e940

https://qiita.com/hann-solo/items/aebb2de23bfe33ec2153

https://qiita.com/hann-solo/items/7e0d18ba0a6fd6ed9f61


### 環境

- ranger 1.9.3
- Python 3.11.4
- iTerm Build 3.4.19
- macOS Ventura 13.5
- MacBook Pro (14-inch, 2021)