Como definir novos comandos no gerenciador de arquivos ranger?

1

Eu gostaria da habilidade de definir novos comandos no gerenciador de arquivos ranger digitando algo como:

:newcmd myarg

e execute código arbitrário com ele.

A definição de comando também deve ter acesso ao estado do programa, por exemplo, diretório atual e arquivos selecionados.

Existe uma maneira de fazer isso?

aviso Legal : Eu criei esta pergunta e auto-respondi por causa da falta de boas fontes sobre este assunto. Respostas adicionais são mais que bem-vindas.

Ciro Santilli 新疆改造中心 六四事件 法轮功
fonte
@ fixer1234 obrigado pelo feedback. Adicionado um aviso de isenção de resposta. Mas se for muito amplo, feche-o, não acho que a auto-resposta deva fazer a diferença. O que não entendo é por que é muito amplo, acredito que já vi várias perguntas comparáveis ​​no passado. Eu poderia ter perguntado: como criar um novo comando para fazer X por 3 X diferentes que eu tinha em mente. Mas eu senti que o básico que permite basicamente que qualquer comando seja escrito foi abordável em uma resposta. Se fechar, farei isso.
Ciro Santilli 新疆改造中心 六四事件 法轮功
@ fixer1234 Talvez também tenha a ver com a quantidade de respostas existentes: imagino que exista muita informação sobre o Excel, então qualquer coisa que não seja específica ao laser provavelmente será inútil. Mas o Ranger ainda não está lá :-)
Ciro Santilli 新疆改造中心 六四事件 法轮功
Recebemos muitas perguntas do Excel em que o OP estabelece um requisito e pede que as pessoas entreguem uma solução. Aqueles recebem o tratamento "muito amplo". Aqui, você forneceu sua própria solução, e o aviso deixa isso claro, então não acho que você tenha um problema. Eu estou supondo que quem marcou isso na fila de revisão estava reagindo a isso.
fixer1234

Respostas:

1

Editar ~/.config/ranger/commands.py para conter algo como:

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')

Agora você pode digitar:

:newcmd myarg

para executar o comando definido.

Mais opções podem ser encontradas em: https://github.com/hut/ranger/blob/9c585e48e14525f11d2405ea0bb9b5eba92e63e9/ranger/config/commands.py

Você pode ir além e definir um mapa para ele, por exemplo: adicionar a ~/.config/ranger/rc.conf:

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

E agora você pode simplesmente digitar:

  • ,n escrever newcmd na linha de status e prepare-se para o usuário inserir o primeiro argumento
  • ,m e execute o comando imediatamente com um argumento padrão

Testado no ranger 1.6.1.

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