Copia e imposta in Bash come in Emacs?


16

Vorrei essere in grado di copiare e incollare il testo nella riga di comando in Bash utilizzando gli stessi collegamenti da tastiera che Emacs utilizza per impostazione predefinita (ovvero utilizzando C-spaceper set-mark, M-wper copiare testo C-y, M-yper incollarlo, ecc.).

La documentazione GNU Bash afferma che Bash viene fornito con alcuni di questi collegamenti chiave impostati di default.

Ad esempio, yanking ( C-y) funziona per impostazione predefinita sul mio terminale. Tuttavia, non riesco a far funzionare i comandi set-marke copy, e per impostazione predefinita non sembrano essere associati a nessuna chiave.

Di solito, il modo in cui un utente può definire i propri collegamenti chiave è aggiungerli .inputrc. Quindi ho cercato e trovato le seguenti funzioni bash nella documentazione che presumo possa aiutarmi a definire il comportamento simile a Emacs che desidero (cioè set-markcon C-spacee copycon M-w).

copy-region-as-kill ()

Copia il testo nella regione nel kill buffer, in modo che possa essere immediatamente strappato. Per impostazione predefinita, questo comando non è associato.

e

set-mark (C-@)

Impostare il segno sul punto. Se viene fornito un argomento numerico, il segno viene impostato su quella posizione.

Se ho capito bene, quanto sopra significa che copy-region-as-killnon è associato a nessuna sequenza di tastiera per impostazione predefinita, mentre set-markè associato per C-@impostazione predefinita.

Ho provato C-@sul mio terminale, ma non credo che funzioni set-markperché non vedo alcun testo evidenziato quando muovo il cursore. In ogni caso, ho provato ad aggiungere le associazioni di tastiera ( M-we C-) alle funzioni copy-region-as-kille set-marksopra nel mio .inputrce quindi ricaricarlo con C-x C-r, ma questo non ha funzionato. So che le mie altre voci .inputrcfunzionano perché ho altre combinazioni di tasti definite dall'utente.

C'è qualcosa che sto facendo di sbagliato? Mi sto perdendo qualcosa?


Quale versione bashe quale programma terminale stai usando?
Mikel,

Sto usando GNU bash, versione 3.1.17 (1) -release (x86_64-redhat-linux-gnu) su gnome-terminal (anche su Terminator)
Amelio Vazquez-Reina

Risposte:


11

Non evidenzia la selezione, ma per il resto penso che funzioni bene.

Prova a correre

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

per assicurarsi che C-x C-rfunzionasse davvero.

Dovrebbe dire:

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

Dopodiché, dovrebbe funzionare bene.

Esempio:

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

mi da

$ abc def abc

Se mai vuoi sapere dove si marktrova, fallo e basta C-x C-x.

Esempio:

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

riporterà il cursore nel punto in cui è stato impostato il segno (l'inizio della linea).

Inoltre, non penso che sia necessario aggiungere l' set-markassociazione. Non l'ho fatto

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

(nota che la maggior parte dei terminali invia C-@quando C-Spcviene premuto. Presumo anche il tuo.)

Se tutto ciò non riesce:

  • fa Ctrl+ Spacelavoro emacs -nwsullo stesso terminale?
  • fare altro Alt/ Metalavoro scorciatoie in bash?

1
Grazie! Ho avuto "Mw" invece di "\ ew" in .inputrc. Anche la mancanza di evidenziazione mi ha confuso. A proposito, grazie per il puntatore al comando bind. Ora funziona come un incantesimo!
Amelio Vazquez-Reina,

2
Benvenuto! Sì, devi scrivere \eo \M-. Vedi la sintassi del file init readline .
Mikel,

Che grande risposta! Grazie. Ciò ha chiarito problemi simili per me: D
ephsmith

set-mark e copy-region-as-kill funzionano silenziosamente, posso evidenziare la regione (come in emacs)?
mosh

4

Lego anche Cw per kill-region . Ecco il mio .inputrc:

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

# Definisci le mie combinazioni di tasti Emacs preferite.
"\ C- @": set-mark
"\ Cw": kill-region
"\ Mw": copia-regione-come-uccidi
"\ M- /" dabbrev-expand
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.