zsh copia e incolla come emacs


10

Ho notato che zsh ha molte cose che vedo in emacs. Posso effettuare una selezione con ctrl + spazio e selezionando una regione. Posso fare copie proprio come in emacs mentre resto dentro zsh. In emacs sono in grado di usare i miei appunti di sistema (in precedenza con qualche configurazione aggiuntiva necessaria ma ora funziona in emacs). In zsh non riesco a incollare dai miei appunti usando Cy e la copia da zsh al mio computer di sistema ha lo stesso problema. C'è un modo per aggirare questo?

Risposte:


11

Zsh's ha un blocco per appunti incorporato che non comunica con altre applicazioni. Dal momento che è molto script, puoi farlo comunicare con poche righe nel tuo ~/.zshrc. Avrai bisogno di xclip o xsel . Vedi Incollare dagli appunti su zsh o bash shell abilitati per vi per una bozza di concetto in modalità vi. Ecco il codice corrispondente per la modalità emacs (probabilmente vorrai fare qualcosa di simile ad altri kill-*widget).

x-copy-region-as-kill () {
  zle copy-region-as-kill
  print -rn $CUTBUFFER | xsel -i -b
}
zle -N x-copy-region-as-kill
x-kill-region () {
  zle kill-region
  print -rn $CUTBUFFER | xsel -i -b
}
zle -N x-kill-region
x-yank () {
  CUTBUFFER=$(xsel -o -b </dev/null)
  zle yank
}
zle -N x-yank
bindkey -e '\ew' x-copy-region-as-kill
bindkey -e '^W' x-kill-region
bindkey -e '^Y' x-yank

Questo utilizza gli Appunti X11 (generalmente accessibili con Ctrl+ C/ Ctrl+ V); rimuovere invece l' -bopzione per utilizzare la selezione primaria X11 (copia automatica su selezione e incollare con il pulsante centrale del mouse).


Se si utilizza la modalità vi, è sufficiente sostituire kill-regioncon vi-deletee yankcon vi-put-afterecc. Allo stesso modo avvolgere vi-yanke altri. (Non ho trovato un modo per farlo più centralmente)
olejorgenb

4

Volevo integrare il buffer di taglio di Zsh con gli appunti di X. Ho provato il suddetto http://stchaz.free.fr/mouse.zsh ma ho scoperto che non mi piaceva che tutte le mie operazioni Zsh popolassero gli appunti. Ad esempio, a volte copiavo qualcosa in un browser, quindi andavo in una shell e modificavo la riga di comando e poi incollavo. Ma spesso la modifica della riga di comando, ad esempio l'eliminazione di una parola, modifica il buffer di taglio Zsh. Nel bene o nel male, X ha solo degli appunti, non un kill ring, quindi quando un'operazione di modifica di Zsh sovrascrive gli appunti, la cosa che volevo incollare è persa - non posso strapparlo (Cy My) come potrei fare in Zsh o Emacs.

Quindi quello che ho fatto invece è creare nuove combinazioni di tasti speciali per interagire con gli Appunti X tramite zsh. Si scopre che "^ Xw" e "^ Xy" non sono utilizzati in Emacs e Zsh, quindi posso ottenere un'interfaccia coerente collegandoli in entrambe le applicazioni. In questo modo le normali operazioni di modifica, tagliabuffer e kill ring vengono lasciati soli. Se voglio copiare qualcosa negli appunti, imposto la regione e faccio "^ Xw" (o se l'ho già ucciso e la regione è inattiva, posso semplicemente fare "^ Xw" per copiare il buffer di taglio). L'incollaggio dagli Appunti viene eseguito con "^ Xy".

# define commands to copy and paste x clipboard

# ^Xw - copy region, or cut buffer
# ^Xy - paste x clipboard

# in both cases, modifies CUTBUFFER

copy-to-xclip() {
    [[ "$REGION_ACTIVE" -ne 0 ]] && zle copy-region-as-kill
    print -rn -- $CUTBUFFER | xclip -selection clipboard -i
}

zle -N copy-to-xclip
bindkey "^Xw" copy-to-xclip

paste-xclip() {
    killring=("$CUTBUFFER" "${(@)killring[1,-2]}")
    CUTBUFFER=$(xclip -selection clipboard -o)
    zle yank
}

zle -N paste-xclip
bindkey "^Xy" paste-xclip

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.