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

9

Como posso configurar o Bash, o Zsh ou o 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 fazer com que o Bash / Zsh / Tmux conclua issue547 na CLI com facilidade? Quando eu pressionar a tecla Tab depois que $ git checkout is Git completar proveitosamente para issue , mas eu devo completar os dígitos por mim porque todos os dígitos anteriores combinam ramos Git existentes .

No VIM, pressionar Ctrl + P para omnicomplete será concluído como a correspondência anterior, portanto, neste caso issue547314 será de fato completado. 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). Eu posso atualizar para o mais recente Ubuntu Server LTS (14.04), se necessário.

EDIT : 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 Tab ou Ctrl + P ou algum outro atalho seria bom, mas não Alt + Meta + Super + Deslocamento + א .

    
por dotancohen 14.03.2014 / 12:16

3 respostas

3

Acho que o recurso que o OP está procurando é chamado de dabbrev-expand no mundo do Emacs:

Expand the word in the buffer before point as a dynamic abbrev, by searching in the buffer for words starting with that abbreviation (v-expand).

xterm também tem dabbrev-expand mas é um pouco menos inteligente que o Emacs mas é muito útil para mim e uma foi uma das razões pelas quais eu mudei para xterm . Dentro da janela xterm , pode-se usar uma atadura de tecla personalizada especificada em ~/.Xresources para invocar dabbrev-expand em uma determinada string. Por exemplo, eu 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 janela xterm , posso usar M-/ ( ALT + / ) para invocar dabbrev-expand . xterm procurará todas as cadeias 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-/ now xterm expandiria a_v para a_very_long_string . Infelizmente, como eu disse, xterm não é tão inteligente e seu recurso dabbrev-expand funcionará somente em strings completas. Assim, no seu caso, is seria expandido para issue540 e não issue547314 porque issue547314 é uma parte de origin/issue547314 (pense nisso como \b em expressões regulares, é um pouco semelhante, embora a maioria seja regular mecanismos de expressões detectariam as ocorrências de issue strings em \bissue.+\b ). Mas , você pode digitar or e, em seguida, pres M-/ . xterm primeiro expandirá or para origin/v2.1 , isso não é o que queremos, então pressione M-/ novamente e xterm expandirá para origin/issue547314 . Agora, se você usar o Bash, poderá fazer M-b , C-w e C-e para remover origin/ part. Resumindo, dabbrev-expand inside xterm não é tão bom quanto no Emacs (e Vim, eu acho), mas ainda é mais rápido do que reescrever strings longas manualmente e menos propenso a erros de digitação. E na maioria dos casos, ele se expandirá diretamente para a string desejada sem a necessidade de remover as partes redundantes. Você só precisa se acostumar com isso - veja a string que deseja ter no cursor e veja se ela não é precedida por outra coisa, e se é digitar uma parte anterior e removê-la após a expansão.

Observe que xterm não é compilado com o recurso dabbrev-expand por padrão e você precisa ativá-lo explicitamente. No entanto, a versão de xterm nos repositórios do Ubuntu é compilada com dabbrev-expand e você pode usá-la imediatamente.

    
por 24.06.2014 / 22:35
1

Bash como uma instalação similar chamada completação bash. Você pode usá-lo pressionando a tecla Tab ao fornecer argumentos aos comandos quando os digita.

Exemplo

Se eu começar digitando ls e pressionando Tab duas vezes, você terá o Bash para 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á incluiu uma regra para git :

/etc/bash_completion.d/git

A instalação deste arquivo foi feita quando instalei o pacote git . Eu estou no Fedora 19, mas outras distribuições também deveriam estar fazendo isso.

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

Olhando para o arquivo de regras, ele explica que ele 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
#

Então, isso deve funcionar "apenas" para você.

    
por 14.03.2014 / 14:42
1

Você pode fazer algo assim com extrakto :

  • pressione tmux prefix + tab para iniciar o extrakto
  • fuzzy encontra 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 para editar com $EDITOR
por 15.11.2017 / 15:30