lessの機能を活かしたままシンタックスハイライトする方法(macOSとRaspbian編)

ログファイルやソースファイルをささっと確認したい時に活躍するlessコマンド。しかしそのままだとモノクロの表示で見にくい。。。

そんな時、source-highlightを入れてシンタックスハイライトするのが一般的な解決法ですが、macOSとかRaspbianの環境ではlessの高度な機能との共存がうまくいかず、、、

そこで、改めて解決方法を模索しました。

結論から言うと、lesspipeを入れて、ちょっとだけ修正すれば解決しました!

やりたいこと

ネットでさらっと見つかる情報を実行しただけでは、シンタックスハイライトとlessの高度な機能(tar.bzとか.bz2など圧縮ファイルの中も見える)がうまく動きませんでした。

なので、lessの高度な機能を活かしたままシンタックスハイライトの機能を追加することが目的です。

実施した環境

  • mac編 … macOS Sierra (version 10.12.6)
    ※Homebrewをインストール済み。
  • ラズパイ編 … Raspbian Jessie (Linux raspberrypi 4.9.35-v7+)

用語

  • source-highlight
    各種プログラムやスクリプトをシンタックスハイライトしてくれる便利なソフト。
  • lesspipe
    中身を簡単に確認できる「less」をさらに便利にしてくれるコマンド。テキスト以外のファイル(.bz2など圧縮されたテキスト)もlessで簡単に見る事ができるようになります!超便利!

macOS編

source-highlight、lesspipeをインストールして設定します。

source-highlightを入れる

macで、管理者権限のあるユーザーでターミナルを開きます。

念のため、source-highlightを探してみます。

$ brew search source-highlight

Xcode licenseにagreeしてねと言われたので、以下を実行。

$ sudo xcodebuild -license accept

改めて、インストール!

$ brew install source-highlight
🍺 /usr/local/Cellar/source-highlight/3.1.8_7

無事に入りました!

 

lesspipeを入れる

次に、lesspipeを入れます。

$ brew install lesspipe

場所を確認しておきます。

$ which lesspipe.sh
/usr/local/bin/lesspipe.sh

そして、ここがミソ!

$ sudo ln -s /usr/local/bin/lesspipe.sh /usr/local/bin/lesspipe

このシンボリックリンクを作ることで、source-highlightが正しく動くようになります(※詳しく知りたい方は後半のおまけを参照)。

source-highlightの設定前に、lesspipeで圧縮ファイルを見てみます。
適当なテキストファイルを圧縮したものを開いてみます。

$ lesspipe hoge.txt.bz2

これで中身が表示されればlesspipeのインストールは完了です。

 

source-highlightの設定

設定は、.bashrcに2行加えるだけです。

$ vim ~/.bashrc

export LESSOPEN="| src-hilite-lesspipe.sh %s"
export LESS='-R'

変更を反映させます。

$ source ~/.bashrc

先ほどlesspipeで表示したファイルをlessで開いてみます

$ less hoge.txt.bz2

無事に表示されたらひとまず完了です。

 

src-hilite-lesspipe.sh の修正(zip対応)

lessで圧縮ファイル(.bz2とか)を開くことはできたのですが、zipファイルが開けないことに気付きました。

原因は、インストールされたsrc-hilite-lesspipe.shzipが指定されていないこと。

ということで、対象となる拡張子にzipを付け加えます。

$ sudo vim /usr/local/bin/src-hilite-lesspipe.sh

以下の部分を探して、

*.tar|*.tgz|*.gz|*.bz2|*.xz)

最後に*.zipをパイプでつなげます。

*.tar|*.tgz|*.gz|*.bz2|*.xz|*.zip)

read onlyなので、書き込む際に!をつけて「w!」とすれば書き込めます。

そうすると、*.zipファイルの中身が見えるようになります。

※ここでは省略しますが、lesspipe.sh の中でも同じような記載があり、各種コマンドに渡しています。

自分の環境では unzip -avpになっていましたが、これをzipinfo にしてもいいかもしれません。(見え方が変わります)

 

おまけ(lesspipe.shのシンボリックリンク)

source-highlightの設定で、lesspipe.shのシンボリックリンクlesspipeを作成しました。

/usr/local/bin/src-hilite-lesspipe.sh
の編集の時に気付かれたかもしれませんが、このなかでlesspipeが参照されています。

*.tar|*.tgz|*.gz|*.bz2|*.xz|*.zip)
lesspipe "$source" ;;

なので、「〜.sh」だと見つからずに失敗していたコマンドが、シンボリックリンクを作成する事でうまく動くようになるということでした!

 

さらに、おまけ!

~/.bashrcにsrc-hilite-lesspipe.shを指定していました。
ということは、自分で作成したスクリプトを指定してあげれば、もっと自由にできる!

たとば、src-hilite-lesspipe.sh~/bin/my-lesspipe.sh にコピーして、~/.bashrc

LESSOPEN="|${HOME}/bin/my-lesspipe.sh %s"
と指定すれば、自分用の設定を自由にできちゃいます。

ルート権限が使えない環境でこの方法が役に立つと思います。

 

ラズパイ編

macOS編で細かく説明したので、ラズパイでは簡単にまとめます。

インストール!

$ sudo apt-get install source-highlight

ここに入りました

/usr/share/source-highlight/src-hilite-lesspipe.sh

ターミナル起動時に読み込まれるように~/.bash_aliases に環境変数を設定します。

$ vim ~/.bash_aliases
export LESSOPEN="| /usr/share/source-highlight/src-hilite-lesspipe.sh %s"
export LESS='-R'

そして、

$ source ~/.bashrc

を実行したら、lessでシンタックスハイライトされるようになります!

macOS編と同様に、圧縮ファイル(.bz2とか)を見るためにはlesspipeが必要です。おそらく最初から入っていると思うのですが、入っていなければapt-getで入れましょう。

本来であれば、

less hoge.bz2
など圧縮ファイルを指定すると自動で展開して表示してくれるはずなのですが、src-highliteのバージョンによっては上記のように環境変数を指定すると展開できなくなってしまいます。

※version3.1.8と3.1.7に違いがあるかもしれません。

原因はsrc-hilite-lesspipe.shの中身でした。圧縮ファイルに対する処理が書いてない!!

簡単に解決するために、macで上手くいっているshスクリプトを持って来ます。

#! /bin/sh

for source in "$@"; do
case $source in
*ChangeLog|*changelog)
source-highlight --failsafe -f esc --lang-def=changelog.lang --style-file=esc.style -i "$source" ;;
*Makefile|*makefile)
source-highlight --failsafe -f esc --lang-def=makefile.lang --style-file=esc.style -i "$source" ;;
*.tar|*.tgz|*.gz|*.bz2|*.xz)
lesspipe "$source" ;;
*) source-highlight --failsafe --infer-lang -f esc --style-file=esc.style -i "$source" ;;
esac
done

これを、もとのファイルと置き換えます。まず、現在のファイルをバックアップしておきます。

$ cd /usr/share/source-highlight/
sudo cp src-hilite-lesspipe.sh src-hilite-lesspipe.sh.org

スクリプトを編集して、上記のスクリプトをコピペして保存します。

vim src-hilite-lesspipe.sh

ここでも同じように lesspipe.shのシンボリックリンクlesspipeを作成しておきます。

これで圧縮したファイルもlessで表示できるようになりました!

 

できなかったこと

*.bz2ファイルは展開した後にシンタックスハイライトされて表示されたのですが、*.zipファイルはうまくハイライトされませんでした。どこか設定に抜けがあるのかもしれません。

 

まとめ

macOSやRaspbian環境で、便利なlessコマンドの機能を活かしたままシンタックスハイライトを行う方法を紹介しました。

やったことは、

  • source-highlightを入れる
  • lesspipeを入れる
  • lesspipe.shのシンボリックリンクlesspipeを作る
  • src-hilite-lesspipe.sh をカスタマイズする

これでまた一つコマンドライン生活が楽しくなりました♪