Copie e defina no Bash como no Emacs?

16

Eu gostaria de poder copiar e colar texto na linha de comando no Bash usando as mesmas vinculações de teclado que o Emacs usa por padrão (ou seja, usando C-space para set-mark , M-w para copiar texto, C-y , M-y para colá-lo, etc.).

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

Por exemplo, o yanking ( C-y ) funciona por padrão no meu terminal. No entanto, não consigo fazer com que os comandos set-mark e copy funcionem, e eles não parecem estar vinculados a nenhuma tecla por padrão.

Normalmente, o modo como um usuário pode definir suas próprias associações de teclas é adicioná-las a .inputrc . Então eu olhei e encontrei as seguintes funções bash na documentação que eu presumo que pode me ajudar a definir o comportamento do tipo Emacs que eu quero (por exemplo, set-mark com C-space e copy com M-w ).

copy-region-as-kill ()

Copy the text in the region to the kill buffer, so it can be yanked right away. By default, this command is unbound.

e

set-mark (C-@)

Set the mark to the point. If a numeric argument is supplied, the mark is set to that position.

Se eu entendi corretamente, o acima significa que copy-region-as-kill não está vinculado a nenhuma sequência de teclado por padrão, enquanto set-mark está vinculado a C-@ por padrão.

Eu tentei C-@ no meu terminal, mas não acho que ele execute set-mark porque não vejo nenhum texto destacado quando movo meu cursor. De qualquer forma, tentei adicionar ligações de teclado ( M-w e C- ) às funções copy-region-as-kill e set-mark acima no meu .inputrc e, em seguida, recarregá-lo com C-x C-r , mas isso não funcionou. Eu sei que minhas outras entradas em .inputrc funcionam porque eu tenho outros atalhos definidos pelo usuário definidos nele.

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

    
por Amelio Vazquez-Reina 24.04.2011 / 21:34

2 respostas

11

Não destaca a seleção, mas acho que funciona bem.

Tente executar

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

para garantir que C-x C-r realmente 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 mark é, basta fazer C-x C-x .

Exemplo:

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

colocará o cursor de volta ao local onde você marcou (o início da linha).

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

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

(note que a maioria dos terminais envia C-@ quando C-Spc é pressionado. Eu suponho que o seu também.)

Se tudo isso falhar:

  • o Ctrl + Espaço funciona em emacs -nw no mesmo terminal?
  • os outros atalhos Alt / Meta funcionam no bash?
por 24.04.2011 / 23:19
2

Eu também ligo a C-w para kill-region . Aqui meu .inputrc:

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

# Define my favorite Emacs key bindings.
"\C-@": set-mark
"\C-w": kill-region
"\M-w": copy-region-as-kill
"\M-/" dabbrev-expand
    
por 01.08.2011 / 13:32