Как определить новые команды в файловом менеджере рейнджера?

645
Ciro Santilli 新疆改造中心 六四事件 法轮功

Я хотел бы иметь возможность определять новые команды в файловом менеджере Ranger, набрав что-то вроде:

:newcmd myarg 

и запустить произвольный код с ним.

Определение команды также должно иметь доступ к состоянию программы, например, к текущему каталогу и выбранным файлам.

Есть способ сделать это?

Отказ от ответственности : я создал этот вопрос и самостоятельно ответил на него из-за отсутствия хороших источников по этому вопросу. Дополнительные ответы приветствуются.

1
@ fixer1234 спасибо за отзыв. Добавлен ответ об отказе от самостоятельного ответа. Но если оно слишком широкое, закройте его, я не думаю, что автоответчик должен иметь значение. Чего я не понимаю, так это почему он слишком широкий, я думаю, что видел несколько сопоставимых вопросов в прошлом. Я мог бы спросить: как создать новую команду для выполнения X для 3 различных X, которые я имел в виду. Но я чувствовал, что основы, позволяющие написать практически любую команду, были легко поддаются ответу. Если он закроется, я сделаю это. Ciro Santilli 新疆改造中心 六四事件 法轮功 8 лет назад 0
@ fixer1234 Возможно, это также связано с количеством существующих ответов: я думаю, что уже есть тонна информации об Excel, поэтому все, что не относится к лазеру, вероятно, бесполезно. Но Рейнджер еще не там :-) Ciro Santilli 新疆改造中心 六四事件 法轮功 8 лет назад 0
Мы получаем множество вопросов по Excel, в которых ОП формулирует требование и просит людей передать им решение. Те получают "слишком широкое" лечение. Здесь вы предоставили свое собственное решение, и отказ от ответственности ясно дает понять, поэтому я не думаю, что у вас есть проблема. Я предполагаю, что тот, кто пометил это в очереди на проверку, отреагировал на это. fixer1234 8 лет назад 0

1 ответ на вопрос

1
Ciro Santilli 新疆改造中心 六四事件 法轮功

Edit ~/.config/ranger/commands.py to contain something like:

from ranger.api.commands import * class newcmd(Command): def execute(self): if not self.arg(1): self.fm.notify('Wrong number of arguments', bad=True) return # First argument. 0 is the command name. self.fm.notify(self.arg(1)) # Current directory to status line. self.fm.notify(self.fm.thisdir) # Run a shell command. self.fm.run(['touch', 'newfile') 

Now you can type:

:newcmd myarg 

to run the defined command.

More options can be found at: https://github.com/hut/ranger/blob/9c585e48e14525f11d2405ea0bb9b5eba92e63e9/ranger/config/commands.py

You can then go one step further and define a map for it, e.g.: add to ~/.config/ranger/rc.conf:

map ,n console newcmd map ,m newcmd default-arg 

And now you can just type:

  • ,n to write newcmd on the status line, and get ready for the user to input the first argument
  • ,m and run the command immediately with a default argument

Tested on ranger 1.6.1.