Selecione o texto no terminal urxvt usando Shift + Seta ou Ctrl + Shift + Seta

2

Estou usando o zsh + rxvt-unicode como um simulador de terminal no Archlinux. Configurei com sucesso a navegação no terminal usando Ctrl + Teclas de seta , mas não consigo configurar o terminal para poder selecionar o texto ao pressionar Shift + Seta (ou Ctrl + Shift + Seta para selecionar a palavra inteira). Depois de vários dias procurando por solução, não consegui encontrar um. A ativação de keyboard-select em .Xresources não funcionou. Então, estou interessado no que devo fazer para poder selecionar o texto no console sem usar o mouse exatamente como é feito em todos os editores de texto?

    
por roman 14.01.2013 / 01:18

1 resposta

2

Esta é em três etapas como fiz isso funcionar para mim:

Etapa 1. Como a meta-chave funciona:

Coloque URxvt*altSendsEscape: true em ~/.Xresources e, em seguida, xrdb ~/.Xresources em ~/.xinitrc .

Para o xterm, em ~/.Xresources , coloque xterm*metaSendsEscape: true .

Para o rxvt, minha intuição me diz que parece idêntico ou muito similar.

Etapa 2. Corrigindo o movimento do cursor

Isso lhe dará a meta-chave do Emacs, para que você não precise procurar o Escape. Eu configurei isso ao usar o bash, e consegui que funcionasse, e então mudei para o zsh; ainda funcionou, mas, quanto à movimentação de palavras com os atalhos de teclado do Emacs, parece que o zsh e o bash são um pouco diferentes: quanto mais me aproximei do comportamento do Emacs, obtive com este patch . Se você está acostumado com o Emacs, é muito útil ter o mesmo movimento do cursor no shell.

Agora, por exemplo, defina a marca com C-SPC, marque a palavra anteriormente digitada com Mb, mate-a com Cw (ou, sem apagá-la, com Mw), insira-a com Cy e assim por diante.

OK, eu sei que você queria Ctrl-Left e assim por diante, mas isso é um downtrade enorme : dessa forma, você precisa alcançar para cada movimento do cursor alcance para retomar a digitação. Há um grande aborrecimento e queda de produtividade! Os atalhos "novos" (mas melhores) são rígidos no começo, mas eu aconselho a qualquer um, apenas force-se a usá-los, em nenhum momento (enquanto você digita o tempo todo!), Eles virão naturalmente.

Passo 3. Para copiar para a área de transferência do X, eu configuro isso (em ~/.zshrc ):

# clipboard
X_CLIPBOARD='xclip -d ":0" -selection clipboard'
alias xi="$X_CLIPBOARD"    # '-i' (or '-in') is default 
alias xo="$X_CLIPBOARD -o"

Agora, você pode canalizar a saída para xi e colá-la em qualquer lugar (funciona mesmo em um X não-tty por causa do -d , se o X estiver sendo executado); para usá-lo em um comando shell, apenas backtick xo .

Para usá-lo no Emacs (rodando em um tty), eu tive que fazer um script duplicando a funcionalidade do xo alias acima:

#!/bin/zsh
xclip -d ":0" -o -selection clipboard

E, em ~/.emacs :

(defun pst ()
  "Inserts the X clipboard (xclip -d ':0' -o -selection clipboard)
   at point. 'M-1' (the '(1)) to insert in the current buffer."
  (interactive)
  (shell-command "pst" '(1))
  (end-of-line) )

A razão para isso é que não consegui encontrar uma maneira de ligar o Emacs a um alias de zsh, embora eu suspeite que isso seja possível. De qualquer forma, invoque com M-x pst .

EDITAR

Eu adicionei essa solução alternativa para tornar o Emacs forward-char tantos caracteres quanto você acabou de inserir. (A primeira parte do código abaixo é o script - veja acima - que também mudou.) Eu uso um arquivo intermediário para fazer isso - embora, como programador, isso vá contra minha intuição (como um mau hábito), mas, bem, parece funcionar. Obviamente, o end-of-line (na minha primeira resposta) não era bom, pois às vezes você quer inserir uma única palavra no meio de uma frase.

#!/bin/zsh

CLIP='xclip -d ":0" -o -selection clipboard'
CLIP_LEN='echo -n $CLIP | wc -c'
echo "(set-variable '*clip-len* $CLIP_LEN)" > ~/.clip_len
echo -n $CLIP


(setq *clip-len* 0)

(defun pst ()
  "Inserts the X clipboard (xclip -d ':0' -o -selection clipboard)
at point. 'M-1' (the '(1)) to insert in the current buffer."
  (interactive)
  (shell-command "pst" '(1))
  (load-file "~/.clip_len")
  (forward-char *clip-len*) )
    
por 14.01.2013 / 20:36

Tags