Fish-shell: suporte à expansão do histórico (por exemplo, bash's !!, bang bang e! $, dólar bang, tokens)

Criado em 20 ago. 2012  ·  98Comentários  ·  Fonte: fish-shell/fish-shell

Parece que o double-bang não funciona e é de alguma forma interpretado como um programa que o sudo tenta sem sucesso localizar. Isso ocorre no Ubuntu 12.04 LTS com casca de peixe compilada a partir da fonte.

Etapas para reprodução:

  1. Execute qualquer comando:

    $ ls

  2. Execute o comando anterior como root:

    $ sudo !!
    sudo: !!: comando não encontrado

    Comportamento esperado:

O comando sudo !! executa o comando executado anteriormente ( ls ) como root.

Também verifiquei se o problema não é causado por sudo , seguindo as etapas de reprodução no bash, que se comportaram conforme o esperado.

Além disso, observe que uma versão anterior do fish-shell no Mac OS X 10.7 não tinha esse problema e sudo !! funcionou conforme o esperado.

duplicate

Comentários muito úteis

function sudo
    if test "$argv" = !!
        eval command sudo $history[1]
    else
        command sudo $argv
    end
end

sudo !! para pessoas que ainda usam !! por algum motivo.

Todos 98 comentários

Ele é discutido nas perguntas frequentes da documentação: http://fishshell.com/docs/current/faq.html#faq -history

Obrigado pelo esclarecimento.

Eu entendo a razão para remover personagens da história. No entanto, embora eu entenda a razão para isso e que é possível usar Ce e Ca em vez de End e Home, para muitos usuários, especialmente aqueles acostumados !! e aqueles em um laptop que não tem as teclas Home e End, ainda é muito mais fácil digitar sudo !! do que Up + C-a + sudo.

Você ainda consideraria restaurar a funcionalidade de tokens de substituição de histórico?

Uma vez que é um caso raro onde !! é mais confortável de usar, tente a seguinte função:

function sudo!!
    eval sudo $history[1]
end

que é chamado apenas de "sudo !!".

Ou a outra possibilidade que uso:

function .runsudo --description 'Run current command line as root'
    commandline -C 0
    commandline -i 'sudo '
    commandline -f execute
end
bind \es .runsudo

Em seguida, pressionando MS, executo a linha de comando atual com sudo colocado logo na frente dela.
Ou, modificando este exemplo, você pode fazer uma função que irá colocar a linha de comando anterior na atual e vinculá-la, por exemplo, a '\ e!' Esta abordagem é melhor do que o simples uso de '!!' porque lhe dá a oportunidade de ver e atualizar a linha de comando antes da execução.

Fiz uma ligeira variação do último comando:

  function .runsudo --description 'Run current command line as root'
    set cursor_pos (echo (commandline -C) + 5 | bc)
    commandline -C 0
    commandline -i 'sudo '
    commandline -C "$cursor_pos"
  end
  bind \es ".runsudo"

Ele salva a posição do cursor em vez de executá-la imediatamente.

! $ também seria bom ter

function sudo
    if test "$argv" = !!
        eval command sudo $history[1]
    else
        command sudo $argv
    end
end

sudo !! para pessoas que ainda usam !! por algum motivo.

Obrigado. Há um número muito grande de pessoas que usam sudo !! desde que essa sintaxe seja suportada por muitos outros shells, incluindo bash e zsh. sudo !! é mais fácil de digitar do que usar as teclas inicial e final, pois essas teclas estão mais distantes.

Eu sugeriria que a função acima fosse incluída com a concha de peixe por padrão.

!! é um bom candidato para uma abreviatura (# 731)

Expressando apoio para !! e atalhos relacionados. Não custa nada adicioná-lo e parece que o peixe está apenas empurrando uma filosofia pessoal para seus usuários.

Meu pensamento atual da solução ideal é este !! deve ser uma abreviatura (# 731), e implementamos assinaturas de função (# 478) para oferecer suporte a subcomandos (um comando que recebe um comando, como sudo). Em seguida, as abreviações se expandem nas posições de subcomando, de modo que 'sudo !!' vai expandir.

Me adicionando

Apesar de ser antigo, é um recurso que deveria vir como padrão no Fish. Não há razão para não tê-lo - se você não quiser usar pessoalmente, tudo bem, mas ter um comando extra não faz mal a ninguém - as pessoas gostam de fazer as coisas de maneiras diferentes.

O caminho !! é implementado na maioria dos shells e machuca as pessoas. Por exemplo, considere este comando:

echo fish is great!!

em bash / zsh / tcsh, isso vai fazer algo inesperado e horrível, porque o !! é sintaxe mágica. Esse é o tipo de interação esquisita que os peixes se esforçam ao máximo para evitar.

Minha sugestão foi implementar !! não como sintaxe mágica, mas como um alias. Isso significa que ele só faria algo especial na 'posição de comando' - não expandirá em argumentos. Ele também mantém o conjunto de recursos de peixes baixo, o que é desejável.

Para tornar isso útil, precisaríamos ensinar peixes sobre subcomandos, com sudo sendo o exemplo mais comum, mas também time , strace , etc. peixes então expandem os aliases na "posição do subcomando", que é um recurso interessante e útil por si só.

Sua solução proposta desmorona quando você considera sudo echo fish is great!! . O mesmo argumento pode ser usado para todas as sintaxes: echo I really like fish (the shell)! também não é confuso? Também me preocupa que uma lista de "subcomandos" seja impossível de manter e reduziria a flexibilidade.

Com apelidos, apenas os comandos são expandidos, e fish saberia quais argumentos são (sub) comandos e quais não são. Portanto, sudo echo fish is great!! não executaria a expansão do último comando, mas, em vez disso, passaria um literal "ótimo !!" para sudo (e, portanto, para eco). Afirmo que é o que o usuário esperava. Consulte a discussão sobre abreviações (# 731) e assinaturas de funções (# 478) para o design e a lógica.

SirCmpwn está correto ao dizer que exigir assinaturas de função abrangentes é uma desvantagem da abordagem de alias e também que outros elementos sintáticos são confusos. Os exemplos da vida real incluem o aborrecimento da expansão de chaves com git (# 434) ou curingas (# 967, entre outros). A sintaxe tem um custo alto e tentamos eliminar a sintaxe quando ela é redundante com outros recursos (por exemplo, # 354).

De qualquer forma, esse é o meu argumento para o porquê de apoiar !! como um elemento sintático elementar é proibido. No entanto, estou aberto para apresentá-lo de maneiras que não requeiram a modificação da sintaxe fish.

Acho que a comparação com {} é pobre. Em peixes, os suspensórios funcionam de maneira diferente das outras conchas. As pessoas só tropeçam nisso quando esperam que funcione como bash e amigos. O !! a sintaxe deve funcionar da mesma forma que outros shells comuns. Além disso, !! não é algo que eu esperaria ver em comandos com freqüência suficiente para causar problemas. Na verdade, eu esperaria o número de vezes que as pessoas tentaram e não conseguiram usar !! com peixes supera em muito o número de vezes que alguém usou um literal !! em um comando.

Eu afirmo que ! confunde em outros shells, e seria melhor se não fosse implementado dessa forma. Por exemplo, em http://codegolf.stackexchange.com/a/17776/3103 coloquei simplesmente "Olá, mundo!" programa escrito em shell UNIX que falha por causa de ! (na pergunta sobre erros ridículos em tempo de execução). Ele até obteve sete votos positivos, então posso imaginar que esse recurso possa ser surpreendente quando você não quiser usá-lo.

No entanto, !! por si só deve funcionar, porque com que freqüência o usuário escreverá !! como um token? Então, novamente, adicionar !! encorajaria a adição de outros padrões de substituição de histórico, alguns dos quais podem ser irritantes.

Adicionando-me - acabei de entrar neste meu primeiro fim de semana com peixes. Definitivamente deve ser apoiado.

Adicionando-me - preciso disso.

Para aqueles que desejam isso, a função e as ligações mencionadas anteriormente na discussão me deram um fluxo de trabalho mais fácil para anteceder sudo ou sudoing o último comando do que o típico sudo !! one.

Você deve dar uma chance a eles. Isso me fez revisitar minhas configurações readline e zsh para ter ligações semelhantes.

Ele transforma sete pressionamentos de tecla (dois deles deslocados) em uma única ligação.

Independentemente do que _você_ goste - existe realmente alguma razão para isso !! não ser suportado? Todo mundo tem coisas diferentes que funcionam para eles e, embora algumas pessoas gostem de usar a seta para cima, muitas pessoas gostam de usar !! e, honestamente, por que isso seria uma coisa ruim? Aqueles que não querem, não precisam usar.

Certamente não é tão difícil de implementar? ...

Sim, eu sei que você pode hackear junto com o fish scripting, mas _não_ funciona da mesma maneira que no bash ou em conchas semelhantes, o que era bastante conveniente na maior parte do tempo.

Veja meu comentário acima para minha justificativa de por que não quero apresentar isso da maneira que bash e zsh fazem (como um novo elemento sintático), e minha proposta de uma maneira de fazer isso segue a filosofia dos peixes.

O argumento de "peixe eco é ótimo !!" sendo melhor do que usar '!!' pois a história é um pouco fraca, mas eu entendo o ponto. Parece um simples "set shell_history advanced" ou algo que poderia permitir para pessoas dispostas a arriscar "echo fish is great !!" recebendo uma mensagem de erro.

No entanto, meu caso de uso de '!!' é semelhante, mas poderia ser evitado com algum aprimoramento de recurso, talvez.

Por exemplo, no meu mac com bash:
atualização de $ brew
$ brew desatualizado
$ brew fetch !!

Portanto, uso regularmente a saída do comando anterior para um novo comando.
Com peixes eu posso fazer isso:
$ brew fetch (brew desatualizado)
Agora, em algum ponto, talvez seja uma sugestão que eu possa usar, mas o que realmente preciso é ser capaz de pesquisar o histórico dentro do bloco ().
por exemplo:
$ brew fetch (bre)

Infelizmente, embora fish se orgulhe de usar () para subcomandos em vez de "confundir" crases e tal, ele realmente não os trata como tal até que você pressione enter. Pelo menos é isso que vejo.

Se fish permitir uma pesquisa de histórico após o primeiro '(' (também conhecido como subcomando), acho que seria mais fácil lidar com a ausência de manipulação de histórico.

Se entendi a sugestão, é que quando você pressiona a seta para cima, ele deve realizar a substituição do histórico apenas dentro do subcomando mais interno, em vez de toda a linha de comando.

: -1:

Ainda apoio a simples implementação do estilo bash !! .

Eu prefiro: up_arrow :, Ctrl + pe pesquisa de histórico de comando trabalhando em posições de subcomando em vez de introdução !!

Todo o histórico da API de outros shells é confuso o suficiente para que as pessoas normalmente só se lembrem !! a partir dele.

Correto. Isso seria conveniente e facilmente substituir o '!!' Ou! Uso de palavra-chave.

Realmente gosto da ideia de !! ser uma abreviatura.

Parece que as abreviações nas compilações noturnas mais recentes estão permitindo apenas abreviações na posição de comando, esperançosamente, ele será atualizado para poder ser usado como argumento para casos como este.

Este recurso está superestimado, apenas use sudo cmd ou eval sudo $cmd .

@bucaran Não estou !! é para velocidade, como faço para combinar a velocidade de !! com cmd ?

Você quer dizer fazer uma variável chamada $cmd que é o último comando? Não é uma variável nativa.

Obrigado

@mdsib Sim, acho que me lembro que houve uma discussão em outra edição sobre não permitir abreviações na posição de argumento. Na época, preferiu-se não implementar isso. Isso definitivamente mudaria isso.

Acho que a conclusão deste tópico é que isso não acontecerá tão cedo, e devo cancelar a inscrição neste problema do Github e mudar para zsh. Adios!

Não porque !! não esteja aqui, mas porque um problema do Github para um recurso bastante simples foi aberto por 3 anos sem ser implementado devido a BS filosófica.

É engraçado ver pessoas tentando convencer outras pessoas de que um recurso não é grande coisa. Claro, você não quer, então não liga. É como se você estivesse tentando convencer as pessoas a não gostarem de verde porque você acha que azul é melhor.
No entanto, como um recurso "simples" parece não funcionar, talvez alguém deva apenas fazer um fork do peixe se gostar dos recursos existentes, mas gostaria de adicionar alguns mais. Parece que isso iria chegar a algum lugar mais rápido.

Eu fiz ~ / bin / !! que se parece com isto:

#!/bin/fish
eval $history[1]

A curto prazo, ele me ajuda a contornar o recurso ausente e minha tendência para digitar !!.
Eu também fiz ~ / bin /! Vi:

#!/bin/fish
for f in $history
    echo $f | grep '^vi'
    if test "$status" = "0"
        eval $f
        exit $status
    end
end

Não é ideal, mas o suficiente para que minha concha tenda a fazer o que eu espero com mais frequência agora.

@SirCmpwn Não é óbvio para mim que !! é um recurso simples. Por exemplo, bash oferece suporte para:

ls some_long_file.txt
!!:s/ls -l/cat/

Deve este uso de !! ser suportado ou não? Usuários que dizem "peixes devem apoiar !!" pode ter ideias diferentes sobre o que isso significa.

Você tem uma opinião forte sobre isso, então eu encorajo você (ou qualquer pessoa) a criar uma proposta de como !! funcionaria em peixes (a semântica, não a implementação). Qual sintaxe seria suportada exatamente? Como essa expansão se relacionaria com outros tipos de expansão, como expansão variável ou de processo? Como a divisão do argumento ocorreria na string expandida? Você poderia usar escapes para evitá-lo?

Este é um pedido sincero. Um recurso não é definido por um único caso de uso; precisamos de uma proposta concreta para discutir.

Se você disser "Quero que este caso funcione e não me importa como", então tudo bem e é válido. Mas alguém precisa resolver os detalhes antes que qualquer coisa possa ser implementada.

No curto prazo, um plano concreto é implementar apelidos globais e então fazer !! dentro de um. Uma alternativa é mesclar o trabalho docopt, fornecer uma assinatura de função para sudo e, em seguida, fazer !! em um alias regular. A direção que vamos tomar depende de pensarmos !! deve se expandir em todos os lugares ou apenas na posição de comando.

@ridiculousfish Você está absolutamente certo que um '!!' a solicitação de recurso precisa ser bem detalhada. Nunca usei o exemplo específico que você deu, pois sempre faço algo assim:
$ ls -l some_long_file.txt
$ ^ ls-l ^ cat

Obviamente, isso também não funciona. Isso seria uma solicitação de recurso separada para mim, com a qual não me preocupei desde que comecei a testar peixes recentemente.

"fish: Redirecionamento encontrado quando se esperava um nome de comando. Fish não permite uma operação de redirecionamento antes de um comando."

Parece que seria fácil tratar '^' na posição de comando como uma substituição, uma vez que não está em conflito com a funcionalidade existente. Mas esse é um problema separado, basta mencioná-lo, já que você está certo que deve haver uma definição clara do que '!!' (ou apenas substituição de histórico em geral) significa.

Aqui estão alguns exemplos que uso:

$ !!
$ some command `!!`
$ !keyword 
$ !123

Obrigado @gillham , informações como essa são muito úteis ao projetar um recurso.

Também observo que @nyarly tem uma solução alternativa inteligente para !! e !$ aqui: https://github.com/fish-shell/fish-shell/wiki/Bash-Refugees

Melhor correção # 5:
Fish é tão orientado pela história que, ao esquecer o sudo ou poluir sua história com um comando que não funciona, pode valer a pena (no longo prazo) apagá-lo manualmente da história. Sim, isso abre um novo terminal, exec bash e edita ~ / .config / fish / fish_history. Fish me levou ao comando errado uma e outra vez, quando eu perdi isso.

Quanto ao hábito de mkdir …; cd !$ de @nyarly , estou fazendo mkcd … :

function mkcd --description 'mkdir and cd'
        mkdir $argv[1]
        and cd $argv[1]
end

Observe que apagar da história não requer travessuras do bash:

history --delete --prefix some_command

fish_config history também permite que você faça isso por apontar e clicar.

Esta funcionalidade pode ser replicada muito bem no Fish usando https://github.com/fish-shell/fish-shell/wiki/Bash-Style-History-Substitution- (!! - e -! $) - talvez o problema deve ser fechado?

: -1:: -1: A menos que um modo de compatibilidade bash total seja implementado.

Eu acho que esta é uma ladeira escorregadia. Se isso for implementado em fish, que tal o single! S e os recursos de histórico de ksh? E quanto a $ ()? O peixe é uma concha do tipo csh. Se as pessoas não podem / não querem se adaptar, há zsh ...

O que vislumbrei nesta discussão como um tl; dr para pessoas que acham isso. (mais de 3 anos em)

  1. A equipe não quer desenvolver o recurso, porque não o usa.
  2. Há muitas pessoas que querem o recurso, porque o usam.
  3. A equipe parece não estar disposta a implementar o recurso como ele existe, mas está disposta a fazer algo
    isso funciona da mesma forma se fornecermos dados suficientes.
  4. As pessoas aceitam não ter o recurso, implementam uma solução alternativa que geralmente funciona ou mudam
    para outro projeto.

Eu sou um dos últimos, embora espere que este problema seja resolvido, não posso usar peixes razoavelmente e adicionar essa solução alternativa com o número de máquinas que uso sem uma quantidade considerável de esforço (preciso de diferentes configurações em máquinas diferentes), e eu uso! ! o suficiente onde é um requisito para mim. Então, vou acompanhar essa discussão na esperança de que um dia os peixes atendam ao meu caso de uso.

@ tetra-archos Ninguém apresentou uma proposta concreta ainda, então não temos uma noção firme do que é "o recurso". Já que você obviamente tem uma opinião forte sobre isso, se você tivesse essa inclinação, seria de grande ajuda se você sugerisse qual deveria ser o comportamento, como ponto de partida. Caso contrário, seria útil listar pelo menos os formulários de substituição de histórico que você usa.

Observe que o comportamento de substituição completo do histórico do bash é muito complexo e também configurável, portanto, "apenas faça o que o bash faz" não é necessário.

Ninguém apresentou uma proposta concreta ainda, então não temos uma noção firme do que é "o recurso".

@ tetra-archos: Isso é absolutamente crítico. Até agora, a maior parte disso tem sido 'Queremos "!!" !!' e talvez "! $" (que é "insira o último argumento do último comando"). Mas há muitos detalhes que precisam ser descobertos se ele (ou um substituto) for implementado.

Por exemplo:

  • Qual parte das substituições de histórico você deseja - é apenas "inserir o último comando aqui" ("!!") e "inserir o último argumento do último comando aqui" ("! $"), Ou todas as outras coisas como " !!: s / string1 / string2 "(prefiro adicionar um modo geral de" substituição "como" consulta-substituição "do emacs ou": s / "do vim para que você também possa fazê-lo _antes_ de executar o comando errado)? Que tal "inserir o quinto comando em meu histórico" ("! 5") - o que eu nunca entendi - ou "inserir o quinto último comando" ("! -5")? Que tal " designadores de palavras " e " modificadores "?
  • Você deseja que o comando seja executado imediatamente (ou seja, você insere sudo !! , pressiona enter e tudo executa imediatamente) ou seria correto inseri-lo primeiro para que você possa verificar novamente - é como bash com a opção "histverify" (eu me inclino para a última)?
  • É preciso que seja "!!" e "! $" ou pode ser usado de forma diferente, ou seja, a memória muscular é o seu problema? Se for esse o caso, nunca seremos 100%, e a substituição de histórico _é_ uma parte bem pequena do bash

Se for apenas memória muscular, você também pode colocar o seguinte em seus fish_user_key_bindings:

bind '!!' 'commandline -i "$history[1]"'
bind '!$' 'history-token-search-backward'

(o problema que isso tem, por que provavelmente não devemos considerá-lo nas ligações padrão, é que ele espera depois que você inserir "!" para verificar se há um segundo caractere)

Eu acho que !! é uma má prática

O comando sudo !! não diz a ninguém o que o shell irá realmente executar.
se eu quiser executar o comando p revious com sudo em ' a nfang' eu digito

^p ^a sudo

Eu sugiro adicionar uma mensagem para dizer às pessoas para usarem os comandos de edição de linha ^ p e ^ a em vez de usar a função de histórico.

!!: command not found, try 'Ctrl-p Ctrl-a' to prefix the previous command with 'sudo' or any other  prefix

Eu também odeio !! . Um método mais fácil para fish_vi_mode como alternativa a ^p ^a :

^v k I

O fato de você não gostar de uma maneira de fazer algo não a torna menos válida.
Em 10 de novembro de 2015, às 8h14, "Ivan Tham" [email protected] escreveu:

Eu odeio !! também. Um método mais fácil para fish_vi_mode como uma alternativa para ^ p
^ a:

^ vk I

-
Responda a este e-mail diretamente ou visualize-o no GitHub
https://github.com/fish-shell/fish-shell/issues/288#issuecomment -155416048
.

O inverso também é verdadeiro.

Ambos os lados dessa questão têm necessidades e preocupações legítimas. Acho que o principal obstáculo é encontrar a maneira _certa_ de fazer isso, em vez da maneira rápida e suja

Eu concordo e não tenho nada contra as outras maneiras de fazer isso, elas simplesmente não
atender às minhas necessidades (e obviamente de outras pessoas).
Em 10 de novembro de 2015, 12:19, "Eric Mrak" [email protected] escreveu:

O inverso também é verdadeiro.

Ambos os lados dessa questão têm necessidades e preocupações legítimas. Eu acho que o
principal impedimento é encontrar a maneira _certa_ de fazê-lo, em vez da maneira rápida e
maneira suja

-
Responda a este e-mail diretamente ou visualize-o no GitHub
https://github.com/fish-shell/fish-shell/issues/288#issuecomment -155494929
.

Para reiterar as abordagens mencionadas na discussão inicial e expandi-las um pouco: Eu descobri que os atalhos de teclado funcionam melhor para mim do que "!!".

Eu escrevi esta função que pode ser associada a alguma tecla (^ S para mim, bind \cs 'prepend_command sudo' ). Se a linha de comando tiver conteúdo, ele acrescentará sudo. Se não houver conteúdo, ele adiciona sudo ao último item do histórico. Então sudo !!<Enter> agora se torna ^S<Enter> .

function prepend_command
  set -l prepend $argv[1]
  if test -z "$prepend"
    echo "prepend_command needs one argument."
    return 1
  end

  set -l cmd (commandline)
  if test -z "$cmd"
    commandline -r $history[1]
  end

  set -l old_cursor (commandline -C)
  commandline -C 0
  commandline -i "$prepend "
  commandline -C (math $old_cursor + (echo $prepend | wc -c))
end

Algumas pessoas disseram que configurar algo assim é muito complicado de fazer. Uma possível solução pode ser incluir algo funcionalmente semelhante à minha função em peixes, portanto, a configuração torna-se uma linha, pelo menos.

Claro, isso não atende outras demandas como some_command --with-subshell-param (!!) .

@Ahti Isso é realmente foda, acabou de fazer funcionar, parece que será uma delícia de usar, apresentarei um relatório

Sim, até agora isso supera sudo !! . Estar na metade de um comando e perceber que deveria ser sudo acontece muito comigo. ^s , prefixo sudo instantâneo!

Pessoalmente, eu nunca usei !! em qualquer contexto diferente de sudo !! então isso não me incomoda.

Por coincidência, experimentei o fish_vi_mode e gostei muito. No entanto, no modo Vi ^s não parece mais vincular. Sugestões?

Ok, eu tinha a ligação de chave em config.fish. Encontrei # 2254 e, em seguida, encontrei https://github.com/faho/fish-shell/commit/f7e8ad632a388d5f1c5eb4cfc33f3cdb1f7fd831 e, em seguida, encontrei http://stackoverflow.com/a/16675092/292408 que confirmou que devo colocar minhas ligações em um fish_user_key_bindings função que ainda não existia.

Funcionou e agora, quando estou no modo de comando Vi [N] o prefixo funciona conforme o esperado.

Já temos Alt-P para rodar o pipeline atual no pager; Eu me pergunto se devemos adicionar Alt-S também?

Eu acho que @Ahti 's é uma solução muito elegante para o que todo mundo está procurando. Direcione para um atalho de teclado sem se preocupar com uma expansão aleatória ou casos estranhos de borda. Ele simplesmente coloca um texto para você usar ou cancelar conforme desejar.

Eu gosto tanto @nyarly de substituição e @Ahti 's solução de ligação chave.
Pessoalmente, eu uso !! apenas no contexto de sudo !!

Oi! Este tópico já tem quase quatro anos. Recentemente comprei ǃǃ.com e ǃǃ.net (que o Github não permite que eu crie um hiperlink, aparentemente, copie e cole) se alguém quiser.

Ei! Que legal! @ geoff-codes Como você fez isso?)

Recentemente, eles começaram a permitir nomes de domínio "internacionalizados" .com e .net.
screen shot 2016-05-11 at 4 53 48 am

O suporte para ele ainda é muito problemático no momento. Por exemplo, eles me permitem registrar ⵌⵑ. Com, mas não ⵌ ǃ.com.

Eu não sabia que você podia se registrar !!. Com, isso é loucura.

A lição aprendida com este problema: se você alguma vez escrever um shell Unix, o único recurso que você deve certificar-se de implementar é o sudo !!, porque parece que as pessoas não conseguem viver sem ele.

Sério, tenho notícias de pessoas dizendo que isso está funcionando muito bem:

@bucaran Sim, de fato, parece ser o caso 😆.

Nomes de domínio internacionalizados - IDNs:

https://en.wikipedia.org/wiki/Internationalized_domain_name

editar: muito lento com esta postagem, e também registros como aqueles @ geoff-codes! Deve ser um investimento inteligente. Dois caracteres (sorta) .com!

#!.com teria levado o bolo embora. Existe uma regra que proíbe isso para o TLD com ou algo que eles deveriam resolver?

Na apresentação do bash para Windows, o apresentador digitou algo
como isso:

$> echo olá Windows !!

E espero que todos vocês possam adivinhar o que aconteceu.
Em 11 de maio de 2016, 13h57, "Aaron Gyes" [email protected] escreveu:

Nomes de domínio internacionais - IDNs

Em 11 de maio de 2016 às 4:44:58, Timophey ([email protected]) escreveu:

Ei! Que legal! @ geoff-codes https://github.com/geoff-codes Como fez
vocês
faça isso?)

-
Você está recebendo isto porque está inscrito neste tópico.
Responda a este e-mail diretamente ou visualize-o no GitHub
<
https://github.com/fish-shell/fish-shell/issues/288#issuecomment -218435761

-
Você está recebendo isto porque comentou.
Responda a este e-mail diretamente ou visualize-o no GitHub
https://github.com/fish-shell/fish-shell/issues/288#issuecomment -218438118

Então, devo mudar para o bash?

@ base698 - Acabei lançando um plugin de pescador para suportar os dois casos de uso mais comuns de substituição de histórico: !! para todo o último comando e! $ para o último argumento. Honestamente, eu principalmente quebrei meus próprios hábitos porque a edição de linha de comando de fish é muito boa. Ainda assim, eu realmente gosto de ser capaz de

> which tool
> cat (!!)

para examinar um script, por exemplo

Você pode instalar o plugin com fisher install nyarly/fish-bang-bang assim que tiver o pescador instalado.

por uma questão de integridade (e dando um exemplo correto)
aqui está uma captura de tela do vídeo do youtube que mencionei, esse é um dos grandes recursos do '!!' padrão que agora está disponível no Windows também.
bangpatternbash

https://www.youtube.com/watch?v=2dB0igTfhfg&feature=youtu.be&t=760

Ele quer executar git commit -a -m "Rawr!!"

resulta em git commit -a -m "Rawrclear"

Por mais que eu ame peixes, !! é muito útil. Não tenho certeza sudo !! mas também como uma forma de passar informações anteriores para novos comandos. Por exemplo:

find . -name something | grep "pattern" então eu brincaria com o padrão até conseguir o que desejo.
Então, eu o passaria para algo assim (someCommand !! ). Atualmente, em peixes, isso requer muitas etapas. As soluções alternativas não funcionam bem o suficiente para mim.

zsh se expande !! para que você possa editá-lo. Então vou ter que voltar para zsh.

Se você estiver usando o pescador (o que deveria ser), você pode instalar nyarly/fish-bang-bang e obter a expansão em qualquer lugar no comando de !! e !$

@nyarly Sim, eu tentei isso. Mas eu não gosto de como ele se expande imediatamente após o segundo ! ser digitado. Parecia estranho. zsh se sente melhor porque se expande depois que você insere um espaço ou pressiona Enter.

EDIT: Esqueça, eu não poderia fazer isso. Eu tinha esquecido o quão irritante era definir o ZSH para ser o que eu queria que fosse. o plugin do nyarly terá que servir.

Estou tão feliz que isso não tenha lei de ortogonalidade de Fish e a lei de foco do usuário. A substituição do histórico do Bash requer muito pensamento além de !! e !$ e talvez s^ . É por isso que as pessoas só usam isso. A solução de Fish é mais interativa, o que permite uma substituição mais geral de argumentos. É eficiente o suficiente em termos de número de golpes e igualmente eficiente com !! .

Alguns usuários sentem falta de !! e !$ e não querem aprender uma maneira diferente. Fish deveria implementar apenas esses recursos como casos extremos (consulte a Lei da ortogonalidade)? Ou toda a substituição do histórico do Bash? Ou todos os recursos de outros shells? Todos os recursos em que os usuários podem pensar?

Aqui está uma solução para quem deseja algo para copiar e colar:

coloque isso em ~ / .config / fish / functions / fish_user_key_bindings.fish

function bind_bang
  switch (commandline -t)
  case "!"
    commandline -t $history[1]; commandline -f repaint
  case "*"
    commandline -i !
  end
end

function bind_dollar
  switch (commandline -t)
  case "!"
    commandline -t ""
    commandline -f history-token-search-backward
  case "*"
    commandline -i '$'
  end
end

function fish_user_key_bindings
  bind ! bind_bang
  bind '$' bind_dollar
end

@siteshwar URL vinculado a https://github.com/fish-shell/fish-shell/issues/288#issuecomment -7869918 está corrompido. Você poderia editar seu comentário para corrigi-lo para as pessoas que estão lendo este problema ainda em aberto?

Eu editei seu comentário para apontar onde hospedamos o FAQ agora.

Agora aquele peixe tem && e || (https://github.com/fish-shell/fish-shell/issues/4620) Está tão perto de ser uma substituição completa do bash!

Estou realmente confuso --

Portanto, o shell que declara seu objetivo de design número 1 é:

1. Everything that can be done in other shell languages should be possible to do in fish

... não me permite fazer uma das ações mais comumente usadas em todos os outros shell?

O fish faq diz que os usuários deveriam, em vez

First press Up, then Home, then type "sudo ".

Cara, que extensão. Quantos usuários clicaram no botão 'Home' nos últimos seis meses por algum motivo? Nesse sentido, eu poderia argumentar que a análise automática de comandos da página do manual não é ortogonal o suficiente apenas abrindo o maldito arquivo man e encontrando-o você mesmo.

@andysalerno
a ação que você deseja fazer é executar o comando anterior com sudo prefixado
e fish fornece esta funcionalidade
embora em vez de entrar
First type "sudo ", then press shift+1, then press shift+1
eu faço
ctrl+p, ctrl+a, type "sudo "
isso funciona da mesma maneira no bash
agora que você mencionou o faq, verifiquei novamente e alguém removeu a parte sobre este atalho que está faltando. (criei https://github.com/fish-shell/fish-shell/pull/3879 para corrigir isso)
A razão pela qual este atalho funciona é porque ele segue a biblioteca readline , que é amplamente implementada ou imitada para edição de linha.
Se eu encontrar tempo, criarei uma solicitação pull para adicioná-la ao faq
Eu posso entender sua frustração, usando a tecla Home realmente não é uma opção, já que essa tecla está em um local diferente em muitos teclados (por exemplo, todos os meus 3 teclados).

obrigado por trazer isso à tona novamente. Eu acho que é importante ter uma maneira fácil (apenas modificadoras e teclas alfabéticas, nenhuma tecla home, nenhuma tecla de seta), rápida (não muitos pressionamentos de tecla) e _documentada_ de fazer isso.

incrível, eu não tinha ideia sobre ctrl + p! Eu gosto disso ainda mais do que !!.

editar:
existe alguma outra maneira de reavaliar o comando da última execução? Eu me pego fazendo muito algo assim no bash:

> man -w fish  # prints location of man file for fish
/usr/share/fish/man/man1/fish.1

> less $(!!)

Não é tão conciso, mas você pode fazer isso com eval e a variável de histórico:

> man -w fish
/usr/share/fish/man/man1/fish.1

> less (eval $history[1])

Mas a melhor maneira de fazer isso é usando alt-p. O Fish canalizará as saídas do comando para menos se você pressionar alt-p depois de digitar o comando:

> man fish alt-p > man fish ^&1 |less;

Eu não entendo todas as pessoas anti-bang ... há tantos casos em que o negócio do bang é ridiculamente mais rápido e mais conveniente do que "soluções alternativas" como:
First press Up, then Home, then type "sudo ".

Os comandos de bang são mágicos pra caralho quando você se acostuma com eles. Eu realmente espero que os caras peixes mudem de ideia e os adicionem de volta. PELO MENOS alguns dos bons, como:

!!
!WORD
!WORD:p
!:n
!$
!^
!n:n
!:gs/MISTAKE/FIX
!#
!#^

Peixe é muito bom, continue com o bom trabalho

Existe uma maneira compatível de executar o último comando da história? Não me importo de ter que digitar, porque estou apenas usando uma macro para chamar o comando em minha outra janela do tmux. Mas meu caso de uso é que eu só quero ser capaz de fazer algo assim:

$ echo "hi"
hi
$ x
hi
$ x
hi

Tentei eval $history[1] , mas a segunda chamada explodiu. Essa é a coisa útil sobre o comando !! . A única coisa que realmente não é aceitável é usar as teclas de seta. Existe algum comando em fish que suporte esse caso de uso?

O melhor em que posso pensar agora é usar um espaço principal que evita adicioná-lo à história:

$ function x ; eval $history[1] ; end
$ echo "hi"
hi
$  x    # note leading space
hi
$  x
hi

certamente não é ótimo, eu sei. Neste caso simples, entretanto, a ligação history-search-backward parece ser suficiente? Por padrão, são as teclas de seta, mas você pode adicioná-las ou alterá-las.

Oh! É uma boa ideia, não pensei em usar o espaço principal. Vou ter que tentar isso.

Atualização :
Isso funcionou perfeitamente para o meu caso de uso. $ eval $history[1] #note extra leading space

Esse é provavelmente o motivo pelo qual não posso ficar com Fish. Embora seja elegante e simples, a falta de atalhos padrão para muitas coisas o torna improdutivo:

Primeiro item. Quero repetir o comando anterior com sudo:

sudo !!

1) Aperte o botão para cima
Problema, preciso alcançar o botão Para cima em muitos teclados. Quase um quarto das vezes eu sinto falta e então devo olhar para o teclado para ver exatamente onde ele está e provavelmente consertar o que quer que a falha tenha causado. Então...
2) Pressione Home ou Ctrl-A
Home é outro trecho e está localizado em tantos locais diversos em diferentes teclados que terei que procurá-lo. Ctrl-A vem mais naturalmente para que funcione, eu acho.
3) Digite 'sudo' e pressione Enter.
Ok, são apenas sete pressionamentos de tecla, mas um deles está sujeito a erros e fazendo com que meu fluxo de trabalho seja interrompido em grande parte do tempo.

Próximo item, quero analisar o último argumento anterior:

ls -l /etc/network/iptables
cat !$

Ou com peixes:
1) Digite 'gato'
2) Alt-Up
Ok, novamente isso não é muito natural. Raramente pressiono a tecla Alt e, mais do que freqüentemente, pressiono a tecla Super (Cmd / Windows / qualquer) ao lado dela, o que muda completamente o contexto em que estou.

Os peixes precisam de uma melhor expansão da história, como todos os principais contendores. Sua falta é uma redução na produtividade para usuários finais de alta.

@wrecklass Como não consegui tirar sudo !! dos meus dedos, escrevi https://github.com/nyarly/fish-bang-bang , que vou sugerir a você.

Além disso, IIRC, fish é enviado com Alt-S para "prefixar sudo" que funcionará para a última entrada do histórico se o seu comando estiver vazio, da mesma forma que Alt-P anexará | less .

E só porque continua aparecendo, ("ou seja, por que não !! funciona em peixes da maneira que funciona"), quero relatar: o tratamento especial do caractere ! foi uma das coisas que me levou de bash. Como usuário de peixe de longa data, ficaria muito desapontado se esse comportamento fosse adotado para apaziguar uma minoria vocal.

sudo !! é uma coisa padrão. Eu entendo que o fish está se esforçando muito para se livrar da sintaxe bash antiga, mas, ao afastar recursos legitimamente úteis em favor da filosofia pessoal, acho que interrompemos o progresso.

@ClickSentinel , por isso mesmo parei de usar fish e mantenho-me em bash . :risonho:

Nosso plano atual é implementar abreviações globais, que também podem suportar "!!" et al. Veja # 5003 para isso.

Estou encerrando este problema a favor disso, pois já está em curso.

@tukusejssirs e @ClickSentinel , você tentou adicionar o código em https://github.com/fish-shell/fish-shell/issues/288#issuecomment -306212011 à sua configuração?

Tive uma variante disso por vários anos (modificada a partir de um problema (esse problema, talvez?) Em minha configuração, e é uma das peças de ergonomia de revestimento em que mais confio. (Além disso, especialmente com o case adicional Eu tenho em minha variante para fazer uma pesquisa de token ascendente usando a string anterior a !$ , é uma das coisas que eu mais fico chateado por não ter quando trabalho no bash.)

Minha variante (ou talvez eu tenha roubado a variação ... não me lembro: man_shrugging:):

function bind_bang
    switch (commandline --current-token)[-1]
    case "!"
        # Without the `--`, the functionality can break when completing
        # flags used in the history (since, in certain edge cases
        # `commandline` will assume that *it* should try to interpret
        # the flag)
        commandline --current-token -- $history[1]
        commandline --function repaint
    case "*"
        commandline --insert !
    end
end

function bind_dollar
    switch (commandline --current-token)[-1]
    # This case lets us still type a literal `!$` if we need to (by
    # typing `!\$`). Probably overkill.
    case "*!\\"
        # Without the `--`, the functionality can break when completing
        # flags used in the history (since, in certain edge cases
        # `commandline` will assume that *it* should try to interpret
        # the flag)
        commandline --current-token -- (echo -ns (commandline --current-token)[-1] | head -c '-1')
        commandline --insert '$'
    case "!"
        commandline --current-token ""
        commandline --function history-token-search-backward


    # Main difference from referenced version is this `*!` case
    # =========================================================
    #
    # If the `!$` is preceded by any text, search backward for tokens
    # that contain that text as a substring. E.g., if we'd previously
    # run
    #
    #   git checkout -b a_feature_branch
    #   git checkout master
    #
    # then the `fea!$` in the following would be replaced with
    # `a_feature_branch`
    #
    #   git branch -d fea!$
    #
    # and our command line would look like
    #
    #   git branch -d a_feature_branch
    #
    case "*!"
        # Without the `--`, the functionality can break when completing
        # flags used in the history (since, in certain edge cases
        # `commandline` will assume that *it* should try to interpret
        # the flag)
        commandline --current-token -- (echo -ns (commandline --current-token)[-1] | head -c '-1')
        commandline --function history-token-search-backward
    case "*"
        commandline --insert '$'
    end
end

function fish_user_key_bindings
    bind ! bind_bang
    bind '$' bind_dollar
end

Obrigado @ scooter-dangle, isso funciona ainda melhor do que # 228

Há casos em que Fish fornecerá uma maneira mais idiomática de realizar alguma ação:

LANG=C :
fish: Unsupported use of '='. To run ':' with a modified environment, please use 'env LANG=C :…'

Talvez !! também pudesse, por padrão, gerar tal mensagem, sugerindo uma forma alternativa mais idiomática de fazê-lo?

No entanto, a proposta deve ser igualmente eficiente. Comparar:

  • sudo !!<enter> , tudo a partir da posição básica das mãos no teclado
  • <up><home>sudo <enter> , como sugerido no FAQ de Fish, que parece exigir mais ou menos movimentos de mãos, dependendo de ondeeestão no teclado.
  • <C-p><Ca>sudo <enter> , acessível sem mover as mãos, que também funciona com padrões de Bash, ZSH e talvez mais, para que os usuários possam adotar um novo hábito que é portátil quando precisam lidar com outros shells.

Para !$ , sugerir <alt-.> parece bom, não é?

@psychoslave Por favor, pare de comentar sobre todos os problemas antigos , especialmente os encerrados.

Também bloqueando este. Ela foi respondida cerca de cinquenta vezes.

Esta página foi útil?
0 / 5 - 0 avaliações