ファイラrangerでパス文字列を取得するコマンドを作る
フルパス、ファイル名、拡張子のみ、拡張子を除くファイル名、の4種類。
問題
rangerはspace
キーで複数ファイル選択できるし、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つだけ)
動作確認
yn
をyp
にすると、フルパスが取得できる。
開発環境
前回
- http://ytyaru.hatenablog.com/entry/2019/02/21/000000
- http://ytyaru.hatenablog.com/entry/2019/02/22/000000
- http://ytyaru.hatenablog.com/entry/2019/02/26/000000
- http://ytyaru.hatenablog.com/entry/2019/03/12/000000
- http://ytyaru.hatenablog.com/entry/2019/03/13/000000
- http://ytyaru.hatenablog.com/entry/2019/03/14/000000
- http://ytyaru.hatenablog.com/entry/2019/03/15/000000