Abre arquivos de texto automaticamente no editor em vez de tentar executá-los?

4

Quando acidentalmente digito o nome de um arquivo de texto sem algum tipo de comando do editor, e o arquivo de texto não é um shell script, recebo um erro de "permissão negada" *, já que o arquivo não é executável e o primeiro token na linha de comando é considerado o comando a ser executado.

No entanto, invariavelmente isso apenas significa que inadvertidamente me esqueci de digitar meu comando editor, portanto, seria conveniente se o shell pudesse de alguma forma reconhecer que o primeiro token é um arquivo de texto existente sem o bit de "execução" definido e automaticamente abra-o com $EDITOR ou $VISUAL .

Existe uma maneira de fazer isso no Bash ou no Zsh? (Eu uso o Bash, mas estou pensando em mudar mesmo assim.) Seria um pouco como a opção autocd do Bash, que detecta automaticamente se o primeiro token é um diretório e tenta cd em vez de fornecer o padrão "Is a diretório "erro.

Idealmente, se eu der uma lista de arquivos (por exemplo, com um glob) ou qualquer outro conjunto de argumentos, todos desses argumentos seriam passados para o comando editor.

* É claro que também posso obter um erro "comando não encontrado" se estou especificando um arquivo no diretório atual sem ./ .

    
por Kyle Strand 29.03.2016 / 19:34

1 resposta

5

Em zsh , desde que seus arquivos de texto tenham uma extensão de nome de arquivo ( file.ext ), você pode trabalhar com aliases de sufixo . Eles são definidos por alias -s name=value e são executados como value text.name sempre que a primeira palavra na linha de comando corresponder a text.name , em que text é qualquer sequência não vazia.

Por exemplo:

Se você definir

alias -s txt=vim

em seguida, digite

$ foo.txt

na linha de comando será executado

vim foo.txt

Isso funciona para qualquer coisa que corresponda a ?*.txt , mesmo palavras com curingas:

$ *.txt

será executado

vim *.txt

Ele também verifica apenas a primeira palavra do comando, mas passará a linha de comando inteira como argumento, mesmo que haja aliases de sufixo para as outras palavras:

$ foo.txt bar.c baz.vim

será executado

vim foo.txt bar.c baz.vim

Importante : isso também afeta qualquer comando com uma extensão correspondente, incluindo aqueles em PATH . Você deve, por exemplo, definir

alias -s sh=vim

e você tem um comando chamado something.sh e você quer rodar

something.sh -p1 -p2 arg1 arg2

ele seria executado

vim something.sh -p1 -p2 arg1 arg2

Para desativar esse recurso para um comando, basta adicionar o command builtin:

command something.sh -p1 -p2 arg1 arg2

As desvantagens óbvias são:

  • funciona apenas em arquivos com uma extensão de nome de arquivo
  • você precisa definir o alias explicitamente para cada extensão

No lado positivo:

  • funciona apenas em arquivos com uma extensão de nome de arquivo, portanto, a maioria dos executáveis em /bin e /usr/bin não precisa ser substituída por um alias.
  • você pode definir um alias (diferente) para qualquer extensão, portanto, *.jpg ou *.o arquivos não serão abertos de repente com vim
por 30.03.2016 / 00:41

Tags