やってみる

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

ファイラrangerでパス文字列を取得するコマンドを作る

フルパス、ファイル名、拡張子のみ、拡張子を除くファイル名、の4種類。

問題

rangerspaceキーで複数ファイル選択できるし、ynでファイル名をコピーできる。なのに、複数ファイル選択してynすると、ひとつのファイル名しかコピーされない。

選択した全ファイルの名前をコピーしたい。いっそ以下全部ほしい。

  • フルパス
  • ファイル名
  • 拡張子のみ
  • 拡張子を除くファイル名

解決

コマンドをPythonで実装する。

ソースコード

~/.config/ranger/commands.py

以下を追記する。

# 選択したファイルのパスを取得する
class copy_path(Command):
    def execute(self):
        from subprocess import run
        from io import StringIO
        with StringIO() as buf:
            if 1 < len(self.args) and self.arg(1).lower() == 'dir_base':
                buf.write(self.fm.thisdir+'\\n')
            buf.write('\\n'.join([self.__AddSepalator(f, self.__GetValue(f)) for f in self.fm.thistab.get_selection()]))
            run('echo "{}" | xsel -b'.format(buf.getvalue()), shell=True)

    def __AddSepalator(self, f, value):
        from os import sep
        if f.is_directory: return value + sep
        else: return value

    def __GetValue(self, f):
        from os.path import splitext
        if 1 < len(self.args): a1 = self.arg(1).lower()
        else: a1 = None

        if len(self.args) < 2: return f.path
        else:
            if a1 in ['full', 'fullname', 'fullpath', 'absolute']: return f.path
            elif a1 in ['dir_base', 'name', 'base', 'basename', 'relative']: return f.basename
            elif a1 in ['ext', 'extension', 'suffix']: return splitext(f.basename)[1]
            elif a1 in ['stem', '!ext', 'withoutext', 'withoutextension', 'without_ext', 'without_extension']: return splitext(f.basename)[0]
            else: return f.path

copy_pathコマンドは引数を渡すとさまざまなパス値を取得できる。

コマンド 取得値
copy_path フルパス
copy_path name basename (ディレクトリパスを除いたファイル名)
copy_path dir_base 1行目にディレクトリパス、2行目以降にbasename
copy_path ext 拡張子
copy_path stem 拡張子を除いたbasename

~/.config/ranger/rc.conf

yp, ynコマンドをコメントアウトする。

#map yp shell -f echo -n %d/%f | xsel -i; xsel -o | xsel -i -b
#map yn shell -f echo -n %f    | xsel -i; xsel -o | xsel -i -b

代わりに実装したコマンドを割り当てる。

map yp copy_path
map yn copy_path name

(ふだん欲しいのは上記2つだけ)

動作確認

  1. rangerを起動
  2. spaceキーでファイルやディレクトリを適当にいくつか選択する
  3. ynと入力する
  4. テキストエディタにペーストする
  5. 選択したファイルの名前が1行ずつ出力された!

ynypにすると、フルパスが取得できる。

開発環境

前回