Conclusão de palavras na tela como no VIM (Bash ou Tmux)


10

Como posso configurar o Bash, Zsh ou Tmux para concluir o último identificador correspondente na tela ? Considere este cenário comum:

$ git fetch
remote: Counting objects: 16, done.
remote: Compressing objects: 100% (9/9), done.
remote: Total 9 (delta 4), reused 0 (delta 0)
Unpacking objects: 100% (9/9), done.
From /opt/git/thunder
 * [new branch]      issue540   -> origin/issue547314
   e9204cf..4d42c3f  v2.1       -> origin/v2.1

Como posso concluir issue547com facilidade o Bash / Zsh / Tmux na CLI? Quando pressiono Tabapós o $ git checkout isGit ser útil para issue, mas devo completar os dígitos sozinho, porque todos os dígitos anteriores realmente correspondem aos ramos existentes do Git .

No VIM, pressionar Ctrl+ Ppara omnicomplete será concluído como a correspondência anterior, portanto, nesse caso, issue547314será realmente concluído. Como posso obter esse comportamento no Bash, no Zsh ou no Tmux ?

Atualmente, estou usando o Bash 4.2 e o Tmux 1.10 no Ubuntu Server (geralmente 12.04 LTS). Posso atualizar para o Ubuntu Server LTS mais recente (14.04), se necessário.

Edição : Eu não me importaria com qualquer solução que usa Bash, Zsh ou Tmux, desde que não seja difícil de usar. Então, Tabou Ctrl+ Pou algum outro tal atalho seria bom, mas não Alt+ Meta+ Super+ Shift+ א.


Certamente isso exigiria uma revisão bastante grande da fonte do bash.
Kevin

@ Kevin: Eu imaginei isso, mas espero que o incrível zsh possa lidar com isso, ou talvez o tmux.
dotancohen

Respostas:


4

Eu acho que o recurso que o OP está procurando é chamado dabbrev-expand no mundo Emacs:

Expanda a palavra no buffer antes do ponto como uma abreviação dinâmica, pesquisando no buffer as palavras que começam com essa abreviação (v-expand).

xtermtambém possui dabbrev-expandrecurso, mas é um pouco menos inteligente do que o equivalente do Emacs, mas é muito útil para mim e um dos motivos pelos quais mudei xterm. Dentro da xtermjanela, pode-se usar uma combinação de teclas personalizada especificada ~/.Xresourcespara chamar dabbrev-expanduma determinada sequência. Por exemplo, tenho a seguinte entrada no meu ~/.Xresources(eu uso uxterm, uma versão Unicode do xterm):

UXTerm*VT100.Translations: #override \n\
     Meta <Key>/:dabbrev-expand() \n\

Dentro da xtermjanela, posso usar M-/( ALT + /) para chamar dabbrev-expand. xtermprocurará todas as strings visíveis na tela que começam com as letras que eu digitei. Exemplo:

$ echo a_very_long_string bye by
$ a_v

Se eu pressionasse M-/agora xtermexpandiria a_vpara a_very_long_string. Infelizmente, como eu disse, xtermnão é tão inteligente e seu dabbrev-expandrecurso funcionará apenas em strings completas. Portanto, no seu caso, isseria expandido para issue540e não issue547314porque issue547314é parte dele origin/issue547314(pense nisso como \bem expressões regulares, é um pouco semelhante, embora a maioria dos mecanismos de expressões regulares capte as duas ocorrências de issuestrings \bissue.+\b). Mas , você pode digitar ore depois pres M-/. xtermserá expandido primeiro orpara origin/v2.1, não é isso que queremos, então pressione M-/novamente e xtermo expanda para origin/issue547314. Agora, se você usa o Bash, pode fazer M-b,C-we C-epara remover a origin/peça. Resumindo, o dabbrev-expandinterior xtermnão é tão bom quanto no Emacs (e no Vim eu acho), mas ainda é mais rápido do que reescrever longas seqüências de caracteres manualmente e menos propenso a erros de digitação. E, na maioria dos casos, ele será expandido diretamente para a sequência desejada, sem a necessidade de remover partes redundantes. Você só precisa se acostumar com isso - observe a string que deseja ter no cursor e veja se ela não é precedida por outra coisa, e se é o tipo de uma peça anterior e remova-a após a expansão.

Observe que xtermnão é compilado com o dabbrev-expandrecurso por padrão e você deve habilitá-lo explicitamente. No entanto, a versão dos xtermrepositórios do Ubuntu é compilada dabbrev-expande você pode usá-la imediatamente.


Obrigado Arkadiusz, isso parece estar perto o suficiente do que eu preciso. Note que não consigo fazê-lo funcionar! Talvez meu xterme uxtermnão seja compilado para dabbrev-expand, não encontrei nenhuma menção ao recurso -help. Como posso ver os sinalizadores de compilação (como com vim --version)? Note que eu também tentou a linha de configuração em ~/.Xresourcescomo Meta <KeyPress> /: dabbrev-expand() \n\ como encontrado aqui , mas isso não ajudou, tampouco.
dotancohen

Pode ser que o seu xterm tenha sido compilado sem o dabbrev-expand. Como você instalou o xterm? Depois de modificar ~ / .Xresources, faça xrdb -merge .Xresourcesno xterm.
Arkadiusz Drabczyk 01/07/19

Isso certamente aconteceu, Arkadiusz! Obrigado!
dotancohen

Vou fazer a pergunta mais algumas horas até que o período de recompensa termine, mas tenho certeza de que você é um sapato. O único problema é o requisito para o xterm, o que é terrível! Mas agora que sei o nome adequado para o recurso, posso pesquisá-lo no Google para outros aplicativos . Obrigado!
dotancohen

Obrigado Arkadiusz! Embora eu não esteja usando a solução xterm, você certamente me indicou a direção certa. Aparentemente zsh, tem essa facilidade.
dotancohen

1

Bash como um recurso semelhante chamado conclusão do bash. Você pode usá-lo pressionando a Tabtecla ao fornecer argumentos para os comandos ao digitá-los.

Exemplo

Se eu começar digitando lse pressionando Tabduas vezes, o Bash fornecerá uma lista de arquivos correspondentes (e opções de linha de comando) para qualquer comando que você esteja tentando usar:

$ ls <---- hit Tab x 2
Display all 232 possibilities? (y or n)

E aqui está o exemplo com switches:

$ ls -- <---- hit Tab x 2
--all                 --format=                                  --quote-name
--almost-all          --group-directories-first
....
....

Configuração?

Minha instalação já incluía uma regra para git:

/etc/bash_completion.d/git

A instalação deste arquivo foi feita quando eu instalei o gitpacote. Estou no Fedora 19, mas outras distros devem estar fazendo isso também.

$ rpm -qf /etc/bash_completion.d/git
git-1.8.3.1-1.fc19.x86_64

Observando o arquivo de regras, ele explica que facilitará o preenchimento automático nas seguintes situações:

# The contained completion routines provide support for completing:
#
#    *) local and remote branch names
#    *) local and remote tag names
#    *) .git/remotes file names
#    *) git 'subcommands'
#    *) tree paths within 'ref:path/to/file' expressions
#    *) file paths within current working directory and index
#    *) common --long-options
#

Portanto, isso deve "apenas funcionar" para você.


2
Trabalho de conclusão do Bash e conclusão do Git (como mencionei no OP). A alteração que eu gostaria de realizar é concluí-la na primeira guia e pressionar o último valor legal mostrado na tela. É assim que a Omnicompletion do VIM funciona.
dotancohen

@dotancohen - não vejo agora que seria possível além do que descrevi.
slm

1

Você pode fazer algo assim com extrakto :

  • pressione tmux prefix + tabpara iniciar extrakto
  • difuso encontre o texto / caminho / url
  • pressione
    • tab para inseri-lo no painel atual,
    • enter para copiá-lo para a área de transferência,
    • ctrl-o para abrir o caminho / URL ou
    • ctrl-e editar com $EDITOR
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.