2009-06-15 5 views
12

Nel mio .zshrc, utilizzo il seguente snippet per integrare gli appunti della shell e gli appunti X11 principali. Grazie a questa integrazione, posso tagliare e incollare il testo da e verso emacs, firefox e il terminale senza dover usare il mouse.Integrare l'kill-ring di readline e gli appunti X11

kill-line() { zle .kill-line ; echo -n $CUTBUFFER | xclip -i } 
zle -N kill-line # bound on C-k 

yank() { LBUFFER=$LBUFFER$(xclip -o) } 
zle -N yank # bound on C-y 

Nota: Io uso questo trucco su Mac OS X, come pure (con pbcopy/pbpaste invece di XRITAGLIA) e grazie ai Synergy miei due computer condividono un unico clipboard. Neat. Ma non funziona con readline. E mi trovo a usare readline abbastanza spesso, ad esempio in (i) python, in gdb, in ncftp ...

Quindi ecco la mia domanda: c'è un modo per integrare gli appunti di readline con il resto di -il mondo ?

Naturalmente, sto pensando a qualche stregoneria .inputrc qui, ma qualsiasi intuizione/idee sarebbe gradita.

+0

io non sono sicuro di quello che voglio davvero qui ma ho trovato un altro strumento come xclip XSEL - http://www.vergenet.net/~conrad/software/xsel/ che sembra più potente – jitter

+0

Grazie per la condivisione. In realtà, quello che sto cercando è un modo per chiamare automaticamente un programma come XSEL dai programmi readline (ad esempio bash) quando premo Ctrl-K/Ctrl-Y. Immagino che questo dipenda dal comando shell vincolante per leggere combinazioni di tasti ... – Gyom

+0

Ti suggerirei di cambiare 'echo -n' in' print -rn --' (o 'printf% s') sopra –

risposta

5

Personalmente, eseguo tutto all'interno di GNU screen. Questo mi dà un sacco di funzionalità su tutti i programmi basati su terminale, non solo su quelli basati sulla lettura. Ha il proprio buffer (s) di pasta, che sono condivisi tra tutte le schermate della sessione corrente, e può leggere/scrivere un file di scambio (configurabile con bufferfile).

  • Una lista schermo è fatto con Ctrl +A, [, < movimento >, Spazio, < movimento >;
  • copiato nel buffer di incolla con Immettere;
  • incollato con Ctrl +A, ];
  • sostituito dal contenuto del file di scambio con Ctrl +A, <;
  • e scritto verso il file di scambio con Ctrl +A, >.

Quindi tutto ciò che serve sono piccoli aiutanti per sincronizzare /tmp/screen-exchange e la selezione X. Qualcosa di così semplice funzionerebbe.

# ~/.screenrc (or entered at C-a : command prompt) 
bind '{' exec sh -c 'xclip -o>~/.screen_exchange' 
bind '}' exec sh -c 'xclip -i ~/.screen_exchange' 

Naturalmente alcuni attacchi e le macro belli renderebbe la vita più facile (questo richiede C-a { C-a < C-a ] per incollare X selezione al terminale), ma è completamente a voi.

11

Bash 4.0 introduce alcune nuove funzionalità:

NEWS

Il comando assegnato ad una sequenza di tasti con ` bind -x 'ora definisce due nuove variabili nell'ambiente del comando eseguito: READLINE_LINE_BUFFER e READLINE_POINT. Il comando può modificare la riga di linea attuale e la posizione del cursore modificando rispettivamente READLINE_LINE_BUFFER e READLINE_POINT, .

Il file NEWS sembra essere impreciso; READLINE_LINE (no _BUFFER) è ciò che è documentato altrove e funziona davvero.

Di seguito vi simulare il comportamento di Bash del esistenti Ctrl + (U | K | Y), ma che interessano la selezione X, anche se io uso Meta/Esc perché ho don' Mi piace sovrascrivere la funzionalità esistente.

_xdiscard() { 
    echo -n "${READLINE_LINE:0:$READLINE_POINT}" | xclip 
    READLINE_LINE="${READLINE_LINE:$READLINE_POINT}" 
    READLINE_POINT=0 
} 
_xkill() { 
    echo -n "${READLINE_LINE:$READLINE_POINT}" | xclip 
    READLINE_LINE="${READLINE_LINE:0:$READLINE_POINT}" 
} 
_xyank() { 
    READLINE_LINE="${READLINE_LINE:0:$READLINE_POINT}$(xclip -o)${READLINE_LINE:$READLINE_POINT}" 
} 
bind -m emacs -x '"\eu": _xdiscard' 
bind -m emacs -x '"\ek": _xkill' 
bind -m emacs -x '"\ey": _xyank' 

mi piace ancora screen di più, ma questo meglio risponde alla tua domanda — fintanto che l'unica applicazione readline vi interessa è Bash.

+0

grazie; questo è davvero il tipo di cose che volevo.Sfortunatamente sto usando zsh come shell, quindi quando uso readline è spesso con programmi _other_ che bash :-) Credo che dovrò abituarmi allo screen. – Gyom

+1

questo non funziona per me sotto bash 4.2.37. Quelle variabili in realtà non contengono alcun valore. – Forethinker

4

vorrei proporre la seguente funzione _xyank() in base alla risposta del ephemient:

_xyank() { 
    CLIP=$(xclip -o) 
    COUNT=$(echo -n "$CLIP" | wc -c) 
    READLINE_LINE="${READLINE_LINE:0:$READLINE_POINT}${CLIP}${READLINE_LINE:$READLINE_POINT}" 
    READLINE_POINT=$(($READLINE_POINT + $COUNT)) 
} 

Quello che fa è quello di spostare il cursore alla fine del testo recuperato, il che rende più coerente con altri built-in comandi.

+0

anche grazie, ma ancora una volta, la mia domanda era per le applicazioni di lettura non bash :-) – Gyom

0

Come ho scritto here, ho trovato che può essere più bello avere combinazioni di tasti separate per popolare gli Appunti X, questo perché spesso uso "kill" per la manipolazione del testo in Readline e non voglio che questo si cancella gli appunti ogni volta.

Quando Readline ottiene la possibilità di avere associazioni di tasti che attivano le interazioni con X, consiglio di associare^Xw e^Xy a copia e incolla.

So che questo non fornisce una soluzione alla tua domanda, ma non ho abbastanza rep per dirlo in un commento.

Per quanto riguarda l'estensione Readline con la capacità di legare le chiavi per i comandi, ho portato sulla mailing list Readline, vedremo cosa dice Chet:

https://lists.gnu.org/archive/html/bug-readline/2016-05/msg00002.html