やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

rangerの設定(ファイル編集するとき新しいタブで開く)

 rangerはTUIファイラ。

ファイルを編集するとき新しいタブで開く

タブを開く方法を調べる

 ターミナルのタブを開く方法。

  1. 起動引数
  2. ショートカットキー
  3. xdotoolで無理やり

A. 起動引数

 ターミナルlxterminalの起動引数を調べる。(lxterminal --help)

  • lxterminalのアクティブウインドウに新しいタブを作成する引数はなかった(新しいプロセスとして起動してしまう)
  • lxterminalのアクティブウインドウのアクティブタブの名前を変更する引数はなかった(新しいプロセスとして起動してしまう)

 xdotoolでショートカットキー操作をすることにより自動化するしかなさそう。

B. ショートカットキー

ショートカットキー 内容
Ctrl+Shift+T 新しいタブを開く
Ctrl+Shift+I タブの名前を変更するダイアログ表示

 残念なバグがある。タブをマウスオーバーするとタブ名がポップアップするのだが、これはCtrl+Shift+Iで変更できず変更前のまま……。lxterminal --tabs=A,Bで新しいプロセスとして起動したときはポップアップが出ない……。

 だれかIssue提案して。私は英語できないので無理。できればプルリクエストして。私はGTKコードよくわからんので無理。たぶんこの辺が関わってそうな気がするけど、どうすればいいのかわからん。こういうのできたらかっこいいのにな。そういう人に私はなりたい。

 脱線したが戻る。起動引数で既存プロセスに新規タブ追加はできない。

C. xdotoolで無理やり

 lxterminalのショートカットキーをxdotoolで実行させる方法。

 イメージスクリプトが以下。Ctrl+Shift+Tでタブを開いてvim パスコマンドを実行する。

Run() {
    xdotool key ctrl+shift+t
    xdotool sleep 1
    xdotool type ${VISUAL:-${EDITOR:-sensible-editor}}' '$@ 
    xdotool sleep 1 
    xdotool key Return"
}
Run

 さらにltterminalのタブ名変更を加えると以下。

Run() {
    xdotool key ctrl+shift+t
    xdotool sleep 1
    xdotool key ctrl+shift+i 
    xdotool sleep 1 
    xdotool type $@ 
    xdotool sleep 1 
    xdotool key Return 
    xdotool sleep 1 
    xdotool type ${VISUAL:-${EDITOR:-sensible-editor}}' '$@ 
    xdotool sleep 1 
    xdotool key Return"
}
Run

 これを1行コマンドにする。ついでに変数箇所を設定ファイルと同じにすると以下。({cmd; cmd;}の形式では動かなかったのでcmd && cmdの形式にした)

bash -c "xdotool key ctrl+shift+t && xdotool sleep 1 && xdotool key ctrl+shift+i && xdotool sleep 1 && xdotool type $@ && xdotool sleep 1 && xdotool key Return && xdotool sleep 1 && xdotool type ${VISUAL:-${EDITOR:-sensible-editor}}' '$@ && xdotool sleep 1 && xdotool key Return"

 テキストエディタで開く設定箇所を探す。

~/.config/ranger/rc.conf

mime ^text,  label editor = ${VISUAL:-${EDITOR:-sensible-editor}} -- "$@"

 コマンド部分(=以降)を変える。

mime ^text,  label editor = bash -c "xdotool key ctrl+shift+t && xdotool sleep 1 && xdotool key ctrl+shift+i && xdotool sleep 1 && xdotool type $@ && xdotool sleep 1 && xdotool key Return && xdotool sleep 1 && xdotool type ${VISUAL:-${EDITOR:-sensible-editor}}' '$@ && xdotool sleep 1 && xdotool key Return"

 ところでタブ名がひどい。表示領域が小さすぎて親ディレクトリ名しか見えない。これでは判別できず意味がない。

 ファイル名のみなら以下。

basename /tmp/work/a.txt
basename "$@"

 パスの順序を逆にするなら以下。

echo "/tmp/work/a.txt"| sed -e 's/\//\n/g' | grep -v -e '^\s*$' | tac | tr '\n' '/'
echo "$@" | sed -e 's/\//\n/g' | grep -v -e '^\s*$' | tac | tr '\n' '/'

 しかしこれを先述のコマンド群につけると非常に長くなってしまう。そこで外部スクリプトファイルにする。

path.sh

# パスを逆順にする。('/'区切り)
# $1: パス
# /tmp/a.txt --> a.txt/tmp/
ReversePath() { echo "$1" | sed -e 's/\//\n/g' | grep -v -e '^\s*$' | tac | tr '\n' '/'; }

launch_editor.sh

#!/bin/bash
set -Ceu
#-----------------------------------------------------------------------------
# launch_editor.sh
# ~/.config/ranger/rifle.conf から呼び出される。
# テキストファイルを起動するときの処理。
# * lxterminalターミナル上にてvimで開く
# * Ctrl+Shift+Tで新しいタブを開く
# * Ctrl+Shift+Iでタブの名前をつける
# * タブ名はパスを逆順にしたもの
# 作成日時: 2019-03-25 15:06:58
#-----------------------------------------------------------------------------
# エディタで起動する
# $1: 起動するファイル
Launch() {
 . ~/root/sys/workflow/script/sh/definalble/path/path.sh
    xdotool key ctrl+shift+t
    xdotool sleep 1
    xdotool key ctrl+shift+i
    xdotool sleep 1
    xdotool type "$(ReversePath "$1")"
    xdotool sleep 1
    xdotool key Return
    xdotool sleep 1
    xdotool type "${VISUAL:-${EDITOR:-sensible-editor}} $1"
    xdotool sleep 1
    xdotool key Return
}
# 指定ファイルリストをすべて起動する
# $@: ファイルパスリスト
Run() {  export -f Launch; echo "$@" | xargs -I@ bash -c "Launch @"; }
Run "$@"

 設定ファイルがシンプルになった。

~/.config/ranger/rifle.conf

mime ^text,  label editor = bash ~/root/sys/workflow/script/sh/runnable/called/ranger/launch_editor.sh "$@"

 これでOK。タブ名には/tmp/a.txta.txt/tmp/と表示される。

 ここまでが限界か。以下はできなかった。

  • UIのフォントを等幅にできれば良かったのに……
  • タブの色分け・グループ分けがしたかった……

対象環境

  • Raspbierry pi 3 Model B+
  • Raspbian stretch 9.0 2018-11-13
  • bash 4.4.12
  • python 2.7.13, pip 9.0.1
  • python3 3.5.3, pip3 9.0.1
  • ranger 1.9.2
$ uname -a
Linux raspberrypi 4.14.98-v7+ #1200 SMP Tue Feb 12 20:27:48 GMT 2019 armv7l GNU/Linux