2016年9月23日金曜日

隠しメニューのカスタマイズ


PPc下部にある情報行に注目しよう。



情報行にマウスカーソルをあわせると



このように隠し項目が表示される。これが隠しメニューだ。現れた各項目をクリックすると、何らかのコマンドを実行する。

同様の隠しメニューは、PPvにも存在する。



今回は、この隠しメニューをカスタマイズする方法について。

カスタマイズのポイント


  • HM_ppcを編集することにより、PPcの隠しメニューを。HM_ppvを編集することにより、PPvの隠しメニューをカスタマイズすることができる。ツールバーメニューのように、新規に作って登録する、ということはできないようだ。
  • PPcだと隠しメニューは二段表示になる。前半にある項目が上段、後半にある項目が下段になる。
  • 表示する文字には、4文字のアルファベットの他にも、2文字の漢字を利用することもできる。視認性を高めるには、漢字にしてみてもいいかも?

カスタマイザーを使う場合


ボタンタブを開き、種類からHM_ppcを選択すればいい。PPvの場合はHM_ppvだ。



①が表示名で、②が実行するコマンド。①の右にある「文字色」と「背景色」で、色を変更する。項目の設定が終わったら、忘れずに「設定」を押そう。
新しい項目を追加したい場合は、右上から新規を選択。不要な項目は「削除」で削除する。

CFGを直接編集する場合


デフォルトは以下。カスタマイザーよりは、CFGを直接編集する方がやりやすいかも。
HM_ppc = { ; PPc(前半が上段、後半が下段
Root , _CYA,_AUTO = @'\'
allM , _AUTO,_AUTO = @HOME
Driv , _AUTO,_AUTO = @\L
Copy , _AUTO,_AUTO = @C
Edit , _AUTO,_AUTO = E
Pack , _AUTO,_AUTO = P
Ren  , _AUTO,_AUTO = @R
Sort , _AUTO,_AUTO = @S
MkDr , _AUTO,_AUTO = @K
Tree , _AUTO,_AUTO = @\T
Exec , _AUTO,_AUTO = @X
Shel , _AUTO,_AUTO = @H
Up   , _CYA,_AUTO = @BS
revM , _AUTO,_AUTO = @\HOME
Pjmp , _AUTO,_AUTO = @0
Move , _AUTO,_AUTO = @M
View , _AUTO,_AUTO = @N
Unpk , _AUTO,_AUTO = @U
Del  , _AUTO,_AUTO = @D
Writ , _AUTO,_AUTO = @W
Wid  , _AUTO,_AUTO = @';'
Attr , _AUTO,_AUTO = @A
Find , _AUTO,_AUTO = @F
}
HM_ppv = { ; PPv
disp , _AUTO,_AUTO = @':'
code , _AUTO,_AUTO = @'@'
Find , _AUTO,_DBLU = @F
F ^  , _AUTO,_DBLU = @'['
F v  , _AUTO,_DBLU = @']'
}

2016年9月21日水曜日

最近のコピー(移動/解凍)先フォルダをメニュー表示

最近、ファイルのコピー(移動/解凍)先にしたパスをメニュー表示。それを選択すればコピー(移動/解凍)できるようにする。


 

準備


以下をScriptフォルダに保存。

stackalias.js

//!*script
// 第一引数 : エイリアスのベースネーム
// 第二引数 : 登録内容

// 「第一引数+連番」のエイリアスに、第二引数を登録する
// 第一引数がhogehogeであれば、最初はhogehoge0、次はhogehoge1という具合
// 第二引数が既に登録済みであれば、それがhogehoge0になるよう順番を入れ替える

// 引数がなければ終了
if (PPx.Arguments.Length < 2){
  PPx.SetPopLineMessage("引数が正しくありません。");
  PPx.Quit(-1);
}

MAX_CMD = 5; // 連番の最大値

var cmd = PPx.Arguments.Item(0);
var macro = PPx.Arguments.Item(1);

// 既に登録されているかチェック。登録されていれば末尾の数値を取得
for (var i = 0; i <= MAX_CMD; i++) {
  if (PPx.Extract("%'"+cmd + i + "'") == PPx.Extract(macro)){
    var i2 = i;
    break;
  }
}

// パスを登録する。パスが登録済みかどうかで分岐
if (i2==null) { // パスが未登録なら登録
  for (var i = MAX_CMD; i > 0; i--) {
    PPx.Execute("*alias "+cmd+i+" = %'"+cmd+(i-1)+"'");
  }
  PPx.Execute("*alias "+cmd+0+" = "+macro);
} else if (i2!=0) { // パスが登録済みかつ末尾が0以外の時は、登録内容の順番を入れ替える
  for (var i = i2; i > 0; i--) {
    PPx.Execute("*alias "+cmd+i+" = %'"+cmd+(i-1)+"'");
  }
  PPx.Execute("*alias "+cmd+0+" = "+macro);
}

以下を編集して取込。解凍に使っているwrap_7zG.jsについては、


を参照。

-|M_CopyDestDir =
-|M_MoveDestDir =
-|M_UnpackDestDir =

KC_main = { ; PPcメイン窓
C ,*ppcfile copy /compcmd *script %0\Script\stackalias.js,copy_dest,%%hd0
M ,*ppcfile move /compcmd *script %0\Script\stackalias.js,move_dest,%%hd0
U ,*set hoge=%"解凍先"%eRd%!2 %: *script %0\Script\wrap_7zG.js,"%a8FDC",%'hoge' %: *script %0\Script\stackalias.js,unpack_dest,%'hoge'
}
M_CopyDestDir = { ** comment **
&A %'copy_dest0' = *ppcfile !copy /dest:%*name(DC,%'copy_dest0')
&B %'copy_dest1' = *ppcfile !copy /dest:%*name(DC,%'copy_dest1') /compcmd *script %%0\Script\stackalias.js,copy_dest,%%'copy_dest1'
&C %'copy_dest2' = *ppcfile !copy /dest:%*name(DC,%'copy_dest2') /compcmd *script %%0\Script\stackalias.js,copy_dest,%%'copy_dest2'
&D %'copy_dest3' = *ppcfile !copy /dest:%*name(DC,%'copy_dest3') /compcmd *script %%0\Script\stackalias.js,copy_dest,%%'copy_dest3'
&E %'copy_dest4' = *ppcfile !copy /dest:%*name(DC,%'copy_dest4') /compcmd *script %%0\Script\stackalias.js,copy_dest,%%'copy_dest4'
}

M_MoveDestDir = { ** comment **
&A %'move_dest0' = *ppcfile !move /dest:%*name(DC,%'move_dest0')
&B %'move_dest1' = *ppcfile !move /dest:%*name(DC,%'move_dest1') /compcmd *script %%0\Script\stackalias.js,move_dest,%%'move_dest1'
&C %'move_dest2' = *ppcfile !move /dest:%*name(DC,%'move_dest2') /compcmd *script %%0\Script\stackalias.js,move_dest,%%'move_dest2'
&D %'move_dest3' = *ppcfile !move /dest:%*name(DC,%'move_dest3') /compcmd *script %%0\Script\stackalias.js,move_dest,%%'move_dest3'
&E %'move_dest4' = *ppcfile !move /dest:%*name(DC,%'move_dest4') /compcmd *script %%0\Script\stackalias.js,move_dest,%%'move_dest4'
}
M_UnpackDestDir = { ** comment **
&A %'unpack_dest0' = *script %0\Script\wrap_7zG.js,"%a8FDC",%'unpack_dest0'
&B %'unpack_dest1' = *script %0\Script\wrap_7zG.js,"%a8FDC",%'unpack_dest1' %: *script %0\Script\stackalias.js,unpack_dest,%'unpack_dest1'
&C %'unpack_dest2' = *script %0\Script\wrap_7zG.js,"%a8FDC",%'unpack_dest2' %: *script %0\Script\stackalias.js,unpack_dest,%'unpack_dest2'
&D %'unpack_dest3' = *script %0\Script\wrap_7zG.js,"%a8FDC",%'unpack_dest3' %: *script %0\Script\stackalias.js,unpack_dest,%'unpack_dest3'
&E %'unpack_dest4' = *script %0\Script\wrap_7zG.js,"%a8FDC",%'unpack_dest4' %: *script %0\Script\stackalias.js,unpack_dest,%'unpack_dest4'
}

やり方


Cを押してファイルをコピー。



すると、コピー先のパスがエイリアスcopy_dest0に保存される。



次にファイルをコピーすると、そのコピー先パスはcopy_dest1に登録される。さらにその次のコピー先パスはcopy_dest2に……。

移動(M)のときは

move_dest0
move_dest1
move_dest2
move_dest3


解凍(U)のときは

unpack_dest0
unpack_dest1
unpack_dest2
unpack_dest3

の順番で処理先のパスが登録される。

パスは5つまで登録でき、新しく実行したものは自動でメニューの上の方に来るようにする。ちなみに、記憶数を変えたいときはstackalias.jsのMAX_CMD = 5;の数値をいじる。

蓄積したメニューは


%M_CopyDestDir
%M_MoveDestDir
%M_UnpackDestDir

を実行すれば表示される。適当なキー等に登録しよう。僕は右クリックメニューに登録している。



追記 2016/09/25


ファイル名に空白があると書庫の展開がうまくいかない場合があったので、一部修正。"%a8FCDN"を"%a8FDC"にした。

2016年9月16日金曜日

タブの色をパスで分岐


パスで条件分岐し、タブに色を付けてみる。



以下を編集して取込。
KC_main = { ; PPcメイン窓
LOADEVENT ,*ifmatch "/C:\\Users\\tukasa\\Dropbox/",%1 %: *pane color ,_BLA,H507fff %: *stop
 *ifmatch "/D:\\bin/",%1 %: *pane color ,_BLA,He0feff %: *stop
 *ifmatch "/D:\\Data/",%1 %: *pane color ,_BLA,H7aa0ff %: *stop
 *ifmatch "/D:\\Download/",%1 %: *pane color ,_BLA,Heeeeaf %: *stop
 *ifmatch "/D:\\Temp/",%1 %: *pane color ,_BLA,H98fb98 %: *stop
 *ifmatch "/D:\\Work/",%1 %: *pane color ,_BLA,Hcce5ff %: *stop
 *pane color ,_AUTO,_AUTO
FIRSTEVENT ,*ifmatch "/C:\\Users\\tukasa\\Dropbox/",%1 %: *pane color ,_BLA,H507fff %: *stop
 *ifmatch "/D:\\bin/",%1 %: *pane color ,_BLA,He0feff %: *stop
 *ifmatch "/D:\\Data/",%1 %: *pane color ,_BLA,H7aa0ff %: *stop
 *ifmatch "/D:\\Download/",%1 %: *pane color ,_BLA,Heeeeaf %: *stop
 *ifmatch "/D:\\Temp/",%1 %: *pane color ,_BLA,H98fb98 %: *stop
 *ifmatch "/D:\\Work/",%1 %: *pane color ,_BLA,Hcce5ff %: *stop
 *pane color ,_AUTO,_AUTO
}

解説


LOADEVENTとFIRSTEVENTを使い、ディレクトリ読み込み時のイベントと、窓を開いた時のイベントを捉えている。

*ifmatchで条件分岐。この例では、

  • C:\Users\tukasa\Dropbox
  • D:\bin
  • D:\Data
  • D:\Download
  • D:\Temp
  • D:\Work

がパスに含まれているかどうかで分岐させているわけだ。各自の環境にあわせ、パスは置き換えよう。

タブの色は、

*pane color [ID][,[text color][,back color]]

で変えている。text color と back color の箇所を好きな色に変えればよい。色の指定は、

文字形式:
_BLA : 黒 _BLU : 青 _RED : 赤 _MAG : 紫
_GRE : 緑 _CYA : 明水色 _BRO : 黄色 _WHI : 白
_DBLA: 暗灰 _DBLU: 暗青 _DRED: 暗赤/茶 _DMAG: 暗紫
_DGRE: 暗緑 _DCYA: 暗水 _DBRO: 暗黄 _DWHI: 灰
_MGRE: 明緑 _SBLU: 水色/空 _CREM: 暗白 _GRAY: 明灰
_AUTO: 既定の色を使います。使用する色は項目毎に異なります。
※_MGRE,_SBLU,_CREM は 256色で正しく表示できません。

数値形式:
基本色以外は、Hbbggrr と、16進数で指定する。

とのこと。

2016年9月14日水曜日

PPxでツールバーのカスタマイズ

挨拶


つかさです。
今回はツールバーのカスタマイズについて。


今まではキーボード操作が基本でほとんど手を出してこなかったが、マウスを使うようになって、やっぱここもいじっといた方がいいよなと思うようになった。


ボタン用アイコンの準備


使用したいアイコン画像を、横並びに連結した画像ファイルを用意する。使用できる画像形式はbmpだが、各種プラグインがあれば他の形式でもいいみたいだ。



カスタマイザーでメニューを作成


カスタマイザーを開き、ボタンタブを選択する。
「種類」に表示されているのは登録済みのメニュー。B_から始まるのがツールバーメニューで、HM_から始まるのが隠しメニューだ。

まずは、「PPc標準ツールバー /B_cdf」を選択してみよう。



青い線で囲った箇所に、メニュー名「B_cdef」が入力されている。これを消して、新規メニュー名を入力する。ここでは「B_test」とする。


参照をクリックし、先に準備した画像を選択する。これでアイコン一覧が表示される。


  1. 利用したいアイコンをクリック
  2. 項目名に、ツールチップに表示する文字列を記述
  3. 登録内容詳細に、実行する内容を記述
  4. 設定をクリック


すると、新たにツールバーメニューB_testが作成され、そこに先に登録した項目が登録される。



次いで、2つ目の項目を登録する。

  1. 「種類」からB_testを選択
  2. 右上から新規を選択
  3. 利用したいアイコンをクリック
  4. 項目名に、ツールチップに表示する文字列を記述
  5. 登録内容詳細に、実行する内容を記述
  6. 設定をクリック



これで、二つ目の項目が登録される。 同様にして、項目を追加していく。
区切り線を挿入したい場合は、「線S」をクリックして、区切り線を挿入する。


項目を全て追加したら、適用をクリックしよう。

作成したツールバーを登録


「メニューバー - 表示 - レイアウト - 上部ドック」から、先に作成したツールバー(ここではB_test)を選択する。




 これで、B_testが登録される。


2016年9月10日土曜日

PPxをタブ型一画面で使う


挨拶


つかさです。
PPxをタブ型一画面で使ってみる。




こんなのです。僕は今までタブを活用したことがあまりなかったのだが、マウスを中心にするのならタブも悪くはないのではないかと思うようになった。

タブ型一画面にする


以下を編集して取込。

X_mpane = 1,1 ; 一体化時の最大同時表示ペイン数,起動時のペイン数
X_combo = 1 ; 複数 PPc を一体化 0:しない 1:する

これで

  • 一体型
  • ペイン数を1で固定

となる。

マウスジェスチャーを使えるようにする


マウスジェスチャーを利用し、Webブラウザのようにタブを扱えるようにする。

以下を編集して取込。

XC_Gest = 2 ; 右ボタンでジェスチャーを 0:しない 1:する 2:する+D&D可
MC_click = { ; PPc メイン窓
RG_DU ,%K"@BS"
RG_LR ,*pane newtab
RG_DR ,*pane closetab
RG_L ,*pane select h-1
RG_R ,*pane select h+1
}

これで

↓↑:親フォルダへ
←→:新しいタブを開く
↓→:タブを閉じる
←:左のタブへ
→:右のタブへ

という挙動になる。


2016年9月5日月曜日

PPxでマウスジェスチャー

あいさつ


いつの間にかPPvでもマウスジェスチャーができるようになっていた(俺が気づいてなかっただけだけど)。
これで、俺がいつか遠い昔に目指していた「片方の手だけで画像ファイル等をダラダラ閲覧する」ことが可能になる。そう、ブラウザでマウスジェスチャーだけで適当なサイトをダラダラ閲覧するように!
          ∧_∧         ⊂(´・ω・`)つ-、       ///   /_/:::::/        |:::|/⊂ヽノ|:::| /」     / ̄ ̄旦 ̄ ̄ ̄/|   /______/ | |   | |-----------| |
参考:片方の手だけでだらだらキーボード打ちたい

準備


以下を編集して取込。

XC_Gest = 2 ; 右ボタンでジェスチャーを 0:しない 1:する 2:する+D&D可
XV_drag = 0,1,3,2 ; ドラッグ開始ボタン スクロール,選択,窓移動,ジェスチャ(右のみ)
  ; 0:使用しない 1:左 2:右 3:中/ホイール 4:左右同時 5:第4 6:第5
MC_click = {
RG_L = @^LEFT
RG_R = @^RIGHT
RG_DU    ,%K"@BS"
RG_DR ,%K"@&F4"
}
MV_click = {
RG_L    ,*execute C,*cursor 6, -1 %: %KC"@N"
RG_R    ,*execute C,*cursor 6, 1 %: %KC"@N"
RG_U    ,%KC "@UP @N"
RG_D    ,%KC "@DOWN @N"
RG_DU ,%K-C"@BS@N"
RG_DR ,%K"@&F4"
LD_SPC ,*ifmatch attribute:d,%*extract(C"%%FCDN") %: %K-C"@Enter @N" %: *stop
 %K-C"@BS@N"
}


使い方


マウスジェスチャーは右クリックから行う。

PPc

→:履歴を進む
←:履歴を戻る
↓↑:上の階層へ
↓→:閉じる

PPv

→:右のファイルへ
←:左のファイルへ
↑:上のファイルへ
↓:下のファイルへ
↓↑:上の階層へ
↓→:閉じる
左ダブルクリック:フォルダ上なら下層移動。ファイル上なら上の階層へ


マウスジェスチャーは情報行に表示される。


右クリックから↓のマウスジェスチャーをすると下のファイルを表示する。



 PPvを閉じたい時は右クリックから↓→のマウスジェスチャー。


2016年8月7日日曜日

Linux Mint Xfceインストール時のメモ

Acer Aspire E11のHDDをSSDに換装した後、Linux Mint Xfceを入れてみた。その後にすることのメモ。

日本語化


$ sudo apt update
$ sudo apt dist-upgrade

としてパッケージを最新状態にした後、Fcitx-Mozc をインストールし、有効に。

$ sudo apt install fcitx-mozc --install-recommends
$ im-config -n fcitx

参考: 人気の「Linux Mint 17.2」/早速日本語入力を試す - ハルさんの電脳メモ 


輝度の調整



xbacklightをインストール。

$ sudo aptitude install xbacklight


次に、「セッションと起動」から「自動開始アプリケーション」を選んで「Add」。

名前:ディスプレイ輝度
説明:xbacklightで暗くする
コマンド:xbacklight -set 30

参考:LinuxMint17でのディスプレイ輝度の調整 - Raspi-Linux ガジェットベース


タッチパッドを無効化




僕のPCでは、タッチパッドを有効にしてると、なぜかたまにマウスカーソルが画面上を飛び回る愉快な状態になるので、無効化する。
スタートボタンをクリックし、「設定→マウスとタッチパッド」から無効化。


電池残量をタスクトレイに表示




タスクトレイを右クリックし、「パネル→新しいアイテムの追加」から「電源管理プラグイン」を追加。

Chrome


公式サイトからダウンロードし、インスコする。


Emacs


$ sudo apt install emacs

でインストール。次に、「.emacs」を編集し、以下を追加。

;;起動時の画面を消す
(setq inhibit-startup-message t)

;;アイコンを消す
(tool-bar-mode -1)

; 行番号表示
(require 'linum)
(global-linum-mode)

;; メッセージを消す
(setq initial-scratch-message "")

;; beep音を消す
(setq visible-bell t)
(setq ring-bell-function 'ignore)

;; *.~ とかのバックアップファイルを作らない
(setq make-backup-files nil)

;; .#* とかのバックアップファイルを作らない
(setq auto-save-default nil)

;; .emacs.dにパスを通す
(add-to-list 'load-path "~/.emacs.d")

;; howm-create2dir読み込み
(require 'howm-create2dir)

;; howmファイルをhowm2dirモードで開く
(setq auto-mode-alist
      (cons (cons "\\.howm$" 'howm-create2dir-mode) auto-mode-alist))

;; 文字コードをshift-jisに
(set-language-environment "Japanese")
(prefer-coding-system 'shift_jis)

次に、homeに「.emacs.d」フォルダを作成し、そこに以下のスクリプトを入れる(以前作ったやつをすっごく適当に改変したものなのでそのうち見直したい)。これで、Emacs起動後ミニバッファで「make-howm-create2dir-file」と入力すると、DropboxフォルダのTempフォルダにhowmを作成できる。
makehowm2dir.el 

;;; howmファイルを作成
(defun make-howm-create2dir-file (&optional howm-dir)
  (interactive)
  (let* ((filename (format-time-string "%Y-%m-%d-%H%M%S.howm"))
  (filepath
   (if howm-dir
       (concat (file-name-as-directory howm-dir) (format-time-string "%Y-%m-%d-%H%M%S.howm"))
     (format-time-string "Dropbox/Temp/%Y-%m-%d-%H%M%S.howm"))))
;;;     (format-time-string "%Y-%m-%d-%H%M%S.howm"))))
    (find-file filepath)
    (if (eq (point-max) (point-min))
 (progn
   (insert (format-time-string "= \n\n[%Y-%m-%d %H:%M]\n"))
   (goto-char (+ (point-min) 2))))
    ))

;;; howmファイルを作成2
(defun make-howm-create2dir-file2 ()
  (interactive)
  (let* ((filename (format-time-string "%Y-%m-%d-%H%M%S.howm"))
  (filepath (format-time-string "%Y-%m-%d-%H%M%S.howm")))
    (find-file filepath)
    (if (eq (point-max) (point-min))
 (progn
   (insert (format-time-string "= \n\n[%Y-%m-%d %H:%M]\n"))
   (goto-char (+ (point-min) 2))))
    ))


;;; 本体
(defun howm-create2dir (arg)
  (if (file-directory-p arg)
      (progn
 (make-howm-create2dir-file arg)
 (howm-create2dir-mode))))

;;; メジャーモード
(define-derived-mode howm-create2dir-mode nil "howm2dir"
       "homu mode"
       (define-key howm-create2dir-mode-map "\C-c,c" 'make-howm-create2dir-file2)
       (define-key howm-create2dir-mode-map (kbd "C-:") 'hateda-heading)
       (define-key howm-create2dir-mode-map (kbd "C-]") 'hateda-heading2)
       (font-lock-add-keywords
        nil
        '(("^\\*\\*\\*.*\n" . my-face-b-1)
   ("^\\*\\*.*\n" . my-face-b-2))))

;;; フェイス
(defface my-face-b-1 '((t (:foreground "white" :background "SteelBlue"))) nil)
(defface my-face-b-2 '((t (:foreground "white" :background "blue"))) nil)
(defvar my-face-b-1 'my-face-b-1)
(defvar my-face-b-2 'my-face-b-2)

;;; 行頭に見出しをつける
(defun hateda-heading ()
  (interactive "*")
  (save-excursion
    (beginning-of-line)
    (insert "**")))

(defun hateda-heading2 ()
  (interactive "*")
  (save-excursion
    (beginning-of-line)
    (insert "*")))

(provide 'howm-create2dir)
(provide 'howm-create2dir-mode)

Guake-terminal




F12を押すと上から降りてきて、もう一度F12を押すと戻っていくターミナル。

$ sudo apt-get install guake -y

でインストール。
次に、スタートボタンをクリックし、

「設定→設定マネージャー→セッションと起動→自動開始アプリケーション→追加」から、名前にguake、コマンドに「bash -c 'sleep 5s; guake'」と入力して、システム起動時に起動するようにする。


参考:Linuxmintでguake - 鶏口牛後

DropBox



公式サイトに行ってダウンロードし、インストールする。ついで、

$ dropbox start -i

とコマンドを打つと起動する。


Atom


Markdownをやるためにインスコする。


$ sudo add-apt-repository ppa:webupd8team/atom
$ sudo apt-get update
$ sudo apt-get install atom

参考:Ubuntu 15.04 LinuxMint 17 に Atomをインストールする - VariedTasteFinder

ranger




ターミナルで起動するファイラ。

まずは、ranger本体と必要なパッケージをインストールする。

$ sudo apt-get install ranger nkf w3m lynx highlight atool mediainfo xpdf caca-utils ranger --copy-config=all

次に、設定ファイルを作成する。

$ ranger --copy-config=all

scope.shを編集。テキストファイルが文字化けしないようにし、かつ枠の幅で折り返すようにする。nkfというコマンドとfoldというコマンドを使えばよさそう

#!/usr/bin/env sh
# ranger supports enhanced previews.  If the option "use_preview_script"
# is set to True and this file exists, this script will be called and its
# output is displayed in ranger.  ANSI color codes are supported.

# NOTES: This script is considered a configuration file.  If you upgrade
# ranger, it will be left untouched. (You must update it yourself.)
# Also, ranger disables STDIN here, so interactive scripts won't work properly

# Meanings of exit codes:
# code | meaning    | action of ranger
# -----+------------+-------------------------------------------
# 0    | success    | success. display stdout as preview
# 1    | no preview | failure. display no preview at all
# 2    | plain text | display the plain content of the file
# 3    | fix width  | success. Don't reload when width changes
# 4    | fix height | success. Don't reload when height changes
# 5    | fix both   | success. Don't ever reload

# Meaningful aliases for arguments:
path="$1"    # Full path of the selected file
width="$2"   # Width of the preview pane (number of fitting characters)
height="$3"  # Height of the preview pane (number of fitting characters)

maxln=200    # Stop after $maxln lines.  Can be used like ls | head -n $maxln

# Find out something about the file:
mimetype=$(file --mime-type -Lb "$path")
extension=${path##*.}

# Functions:
# runs a command and saves its output into $output.  Useful if you need
# the return value AND want to use the output in a pipe
try() { output=$(eval '"$@"'); }

# writes the output of the previouosly used "try" command
dump() { echo "$output"; }

# a common post-processing function used after most commands
trim() { head -n "$maxln"; }

# wraps highlight to treat exit code 141 (killed by SIGPIPE) as success
highlight() { command highlight "$@"; test $? = 0 -o $? = 141; }

case "$extension" in
    # Archive extensions:
    7z|a|ace|alz|arc|arj|bz|bz2|cab|cpio|deb|gz|jar|lha|lz|lzh|lzma|lzo|\
    rpm|rz|t7z|tar|tbz|tbz2|tgz|tlz|txz|tZ|tzo|war|xpi|xz|Z|zip)
        try als "$path" && { dump | trim; exit 0; }
        try acat "$path" && { dump | trim; exit 3; }
        try bsdtar -lf "$path" && { dump | trim; exit 0; }
        exit 1;;
    rar)
        try unrar -p- lt "$path" && { dump | trim; exit 0; } || exit 1;;
    # PDF documents:
    pdf)
        try pdftotext -l 10 -nopgbrk -q "$path" - && \
            { dump | trim | fmt -s -w $width; exit 0; } || exit 1;;
    # BitTorrent Files
    torrent)
        try transmission-show "$path" && { dump | trim; exit 5; } || exit 1;;
    # HTML Pages:
    htm|html|xhtml)
        try w3m    -dump "$path" && { dump | trim | fmt -s -w $width; exit 4; }
        try lynx   -dump "$path" && { dump | trim | fmt -s -w $width; exit 4; }
        try elinks -dump "$path" && { dump | trim | fmt -s -w $width; exit 4; }
        ;; # fall back to highlight/cat if the text browsers fail
esac

case "$mimetype" in
    # Syntax highlight for text files:
    text/* | */xml)
        try nkf "$path" && { dump | trim | fold -b -w $width; exit 5; } || exit 2;;
    # Ascii-previews of images:
    image/*)
        img2txt --gamma=0.6 --width="$width" "$path" && exit 4 || exit 1;;
    # Display information about media files:
    video/* | audio/*)
        exiftool "$path" && exit 5
        # Use sed to remove spaces so the output fits into the narrow window
        try mediainfo "$path" && { dump | trim | sed 's/  \+:/: /;';  exit 5; } || exit 1;;
esac

exit 1

参考