Copiar e marcar no Bash como no Emacs?

16

Eu gostaria de ser capaz de copiar e colar texto na linha de comando no Bash usando as mesmas combinações de teclas que o Emacs utiliza por padrão (ou seja, utilizando C-spacepara set-mark, M-wcopiar o texto, C-y, M-ypara colá-lo, etc.).

A documentação do GNU Bash diz que o Bash vem com algumas dessas ligações de teclas configuradas por padrão.

Por exemplo, yanking ( C-y) funciona por padrão no meu terminal. No entanto, não pode obter o set-marke copycomandos para o trabalho, e eles não parecem ser vinculado a quaisquer chaves por padrão.

Geralmente, a maneira como um usuário pode definir suas próprias associações de teclas é adicioná-las .inputrc. Então, procurei e encontrei as seguintes funções bash na documentação que presumo que podem me ajudar a definir o comportamento semelhante ao Emacs que eu quero (ou seja, set-markcom C-spacee copycom M-w).

copy-region-as-kill ()

Copie o texto da região para o buffer de interrupção, para que ele possa ser arrancado imediatamente. Por padrão, este comando é ilimitado.

e

set-mark (C-@)

Coloque a marca no ponto. Se um argumento numérico for fornecido, a marca é definida para essa posição.

Se bem entendi, o acima significa que copy-region-as-killnão está vinculado a nenhuma sequência de teclado por padrão, enquanto set-markestá vinculado C-@por padrão.

Eu tentei C-@no meu terminal, mas não acho que ele funcione set-markporque não vejo nenhum texto destacado quando movo o cursor. De qualquer forma, tentei adicionar ligações de teclado ( M-we C-) às funções copy-region-as-kille set-markacima no meu .inputrce recarregá-lo com isso C-x C-r, mas isso não funcionou. Eu sei que minhas outras entradas .inputrcfuncionam porque tenho outras combinações de teclas definidas pelo usuário.

Existe algo que estou fazendo de errado? Estou faltando alguma coisa?

Amelio Vazquez-Reina
fonte
Qual versão bashe qual programa do terminal você está usando?
24511 Mikel
Estou usando GNU bash, versão 3.1.17 (1) -release (x86_64-redhat-linux-gnu) no gnome-terminal (também em Terminator)
Amelio Vazquez-Reina

Respostas:

11

Não destaca a seleção, mas, caso contrário, acho que funciona bem.

Tente correr

$ bind -p | grep copy-region-as-kill

para garantir que C-x C-rrealmente funcionou.

Deveria dizer:

"\ew": copy-region-as-kill

Depois disso, deve funcionar bem.

Exemplo:

$ abc<C-Spc><C-a><M-w> def <C-y>

me dá

$ abc def abc

Se você quiser saber onde markestá, apenas faça C-x C-x.

Exemplo:

$ <C-Spc>abc<C-x><C-x>

colocará o cursor de volta no local em que você definiu a marca (o início da linha).

Além disso, acho que você não precisa adicionar a set-markligação. Eu não fiz.

$ bind -p | grep set-mark
"\C-@": set-mark
"\e ": set-mark
# vi-set-mark (not bound)

(observe que a maioria dos terminais envia C-@quando C-Spcé pressionado. Presumo que o seu também seja enviado .)

Se tudo isso falhar:

  • faz Ctrl+ Spacetrabalho emacs -nwno mesmo terminal?
  • outros Alt/ Metaatalhos funcionam no bash?
Mikel
fonte
1
Obrigado! Eu tinha "Mw" em vez de "\ ew" em .inputrc. A falta de destaque também me confundiu. Obrigado pelo ponteiro para o comando bind, a propósito. Agora funciona como um encanto!
Amelio Vazquez-Reina
2
Bem-vinda! Sim, você tem que escrever \eou \M-. Consulte a sintaxe do arquivo init do readline .
24511 Mikel
Que ótima resposta! Obrigado. Este esclarecido problemas semelhantes para mim: D
ephsmith
set-mark e copy-region-as-kill funcionam silenciosamente, posso destacar a região (como no emacs)?
Mosh
4

Também vinculo Cw para kill-region . Aqui está o meu .inputrc:

# Consulte http://lists.gnu.org/archive/html/bug-bash/2009-03/msg00033.html
defina bind-tty-special-chars off

# Defina minhas combinações de teclas favoritas do Emacs.
"\ C- @": marca de ajuste
"\ Cw": região de morte
"\ Mw": copiar região como matar
"\ M- /" dabbrev-expand
gavenkoa
fonte