Perché non posso evidenziare il testo in un emulatore di terminale Linux con i tasti maiusc + freccia?


19

Queste sono le scorciatoie da tastiera standard per l'editing del testo che uso costantemente ogni volta che modifico il testo in qualsiasi applicazione Linux diversa dagli emulatori di terminali:

  • frecce sinistra + destra per spostarsi a sinistra + destra
  • ctrl + freccia per spostare un'intera parola
  • home / end per spostarsi all'inizio / alla fine della riga
  • ctrl + c / ctrl + v per copiare / incollare [alcuni terminali possono usare maiusc-ctrl-C / maiusc-ctrl-V; questo è un buon sostituto]
  • MAIUSC + freccia per evidenziare il testo
  • Maiusc + Ctrl + Freccia per evidenziare un'intera parola

Non ho mai trovato una combinazione di shell plus emulatore di terminale che consenta gli ultimi due elementi in questo elenco e mi fa impazzire. Ovviamente gli emulatori di terminale supportano l'evidenziazione (il mouse può farlo) e supportano l'uso dei tasti ctrl e maiusc come modificatori (possono essere usati per spostare il cursore di un'intera parola e per rendere maiuscole le lettere, rispettivamente; [modifica:] possono anche essere usati insieme per copiare / incollare con shift-ctrl-C e shift-ctrl-V), quindi qual è il problema che impedisce questa funzionalità? Ho diverse domande:

  • È un problema con il mio emulatore di terminale o con la mia shell (bash, anche se sono disposto a cambiare)?
  • Perché gli emulatori / shell terminali non sono conformi a questo standard altrimenti universale?
  • Se c'è una vera ragione, è antica e obsoleta o è ancora rilevante per un numero significativo di utenti desktop Linux?
  • C'è qualche tipo di soluzione?
  • C'è qualche oscuro programma che posso usare per supportare questo?
  • È possibile modificare la fonte di, diciamo, gnome-terminal per supportare questo?

So che il testo può essere copiato / incollato con il mouse, non è quello che sto chiedendo. Sto chiedendo perché non posso fare queste cose con la tastiera in un emulatore di terminale.


Si noti che la selezione del testo con il mouse non modifica la posizione del cursore. Se mescolassi nella selezione del testo con l'inserimento di comandi regolari sulla tastiera, sarebbe davvero confuso oltre i confini del comando che hai appena digitato e non ancora eseguito. Sei in grado di selezionare il testo oltre i limiti della casella di testo in una pagina Web con la tastiera? Si noti inoltre che esistono programmi come lo schermo che consentono di accedere a una modalità diversa con selezione del testo per l'intero terminale, ma ovviamente non consentono più l'immissione dei comandi.
Daniel Beck

1
Daniel: la console Matlab, ad esempio, è una CLI che consente l'evidenziazione del testo con la tastiera. Funziona perfettamente nella mia esperienza; consente la selezione oltre l'attuale comando non ancora eseguito, se lo si desidera, personalmente non ne uso molto.
Monguin,


Risposte:


5

Penso che sarebbe molto utile se lo prendessi un pezzo alla volta. Il problema generale è: a chi è destinata la pressione dei tasti? Il terminale o il programma in esecuzione all'interno del terminale?

Ad esempio, "schermo", che è una specie di terminale, usa Ctrl+ Acome prefisso per i suoi comandi, per distinguerli dalle cose che vanno al programma in esecuzione stesso. (E fornisce un modo per inviare Ctrl+ A.)

gnome-terminal ha diverse chiavi che acquisisce per fare varie cose, tra cui alcune delle quali ti chiedi.

Ricordare inoltre che l '"evidenziazione" di un terminale è separato dalla posizione del cursore del terminale . Alcuni terminali non hanno alcuna possibilità di evidenziare affatto.

Ora, prendendo queste combinazioni di tasti alla volta:

frecce sinistra + destra per spostare sinistra + destra ctrl + freccia per spostare un'intera parola home / end per spostarsi all'inizio / fine della riga

Sposta cosa a destra e a sinistra? Bash può essere configurato per fare questo, e in genere è di default. In genere, questi spostano la posizione del cursore.

ctrl + c / ctrl + v per copiare / incollare

Primo: copia / incolla ha persino senso? Se sei in un VT, non hai davvero degli appunti, specialmente se X non è in esecuzione.

Alcuni terminali possono copiare il testo nell'output e alcuni "incollano" anche simulando la digitazione del contenuto degli appunti. Ctrl+ Shift+ V, ad esempio, è incolla gnome-terminal, che può aiutare. (E Ctrl+ Shift+ Cè copia.) Come discusso in precedenza, il grosso problema con Ctrl+ Ce Ctrl+ Vè che si sovrappongono ai comandi comuni di terminale / programma. ( Ctrl+ Cè send interrupt (SIGINT) e Ctrl+ Vè letteralmente.)

Alcuni terminali supportano anche due modalità di copia dei dati: una "copia solo" più normale e ciò che è noto come "selezione blocco" o "copia blocco". (Tieni premuto Ctrl, quindi trascina mentre sei dentro gnome-terminalper esempio.)

Inoltre, xsel -bpuò essere utilizzato per reindirizzare il contenuto degli appunti. Dipende dall'esatta situtazione se xsella versione di incolla del terminale è più utile. Vedere man xsel.

Maiusc + freccia per evidenziare Maiusc + ctrl + freccia per evidenziare un'intera parola

L'evidenziazione del terminale (se ha questa capacità) è separata dalla posizione del cursore. Ancora una volta, la mancanza di combinazioni chiave disponibili è probabilmente un fattore. Tieni presente che un momento saliente ha due posizioni: l'inizio e la fine o gli angoli in alto a sinistra e in basso a destra. Come gestite entrambi?

Infine, nota che molti terminali della GUI, facendo doppio clic su una parola la evidenzieranno. (E in X, copia nella selezione principale.)

screen, ad esempio, ha le chiavi per passare a una modalità per spostarsi nel buffer (output precedente) e copiare / incollare.

Penso che se fai un uso adeguato xsele la selezione principale, scoprirai che le operazioni con gli appunti sono abbastanza rare e abbastanza complesse da meritare usando il mouse.


5
Apprezzo il tempo che hai impiegato per scrivere la tua risposta, ma in qualche modo non mi sento di avere una maggiore comprensione del perché questa non è una funzione disponibile negli emulatori di terminali. Mi hai fatto notare una nuova idea - che un emulatore di terminale è unico in quanto può eseguire altri programmi - ma non capisco perché solo un sottoinsieme selezionato di combinazioni di tasti sia impossibile da rendere disponibile all'utente.
Monguin,

2
Gli emulatori di terminali emulano terminali fisici . Non sono stati creati da zero per fornire un'interfaccia da riga di comando. Cose come Control-C avevano stabilito significati molto prima che Microsoft decidesse di cooptarle come scorciatoie da tastiera, e gli emulatori di terminali devono aderire ad esse.
Chepner,

2
Penso che il diavolo sia nei dettagli qui. Non è impossibile: lo schermo ha una modalità per fare ciò che vuoi, credo. Ma per realizzarlo, devi passare alla modalità "Voglio selezionare le cose". gnome-terminalavrebbe problemi simili: probabilmente non lo hanno implementato perché non è esattamente qualcosa che stai facendo. Tieni presente che la shell non è l'unico programma in esecuzione: qualsiasi programma potrebbe essere in esecuzione e potrebbe voler utilizzare qualsiasi sequenza di tasti che potresti utilizzare per copiare / incollare per i propri scopi. lo schermo ha modi per inviare i tasti che sovrascrive e gnome-terminal cerca di non calpestare le dita dei piedi.
Thanatos

1
La selezione a blocchi è un mezzo per selezionare un rettangolo: mantieni il controllo e trascina in gnome-terminal, e dovresti immediatamente vedere come è diverso. La maggior parte degli emulatori di terminali con interfaccia grafica ha questa funzionalità e anche gli editor di testo più avanzati. (Vedi Blocco visivo in vim, per esempio.)
Thanatos

1
Ah, allora ho familiarità con la selezione dei blocchi, ma non ero a conoscenza del nome. Inoltre, non sono a conoscenza di una scorciatoia da tastiera della GUI per quell'azione, quindi non sembra necessario inventarne uno per rispondere alla mia domanda. Apprezzo i commenti di tutti qui, ma come io sono ancora insoddisfatto, suppongo tutto quello che posso fare ora è scavare nella fonte me stesso ...
monguin

1

Non sono un esperto di emulatori di terminali ma ...

applicazioni come bash (readline) in esecuzione in un emulatore di terminale non sanno nulla del sistema X Window in esecuzione e della finestra X in cui si trovano, conoscono stdin e stdout su un dispositivo terminale (ttyS / ttyUSB / tty / pts su Linux).

Il problema non è mostrare del testo evidenziato ma come far sapere all'applicazione X window (l'emulatore di terminale) quel testo selezionato, attraverso questi dispositivi terminali.

Mi immagino X applicazione terminale aperto uno di quei dispositivi di ingresso e uscita e quindi tradurre eventi chiave X a correttamente uscita (dal lato X) di ingresso (da lato bash). Viceversa il flusso di output bash sul terminale X come input , qui il terminale X elabora questo input per spostare il cursore, riempire il backround di un po 'di colore, in base all'output dell'applicazione bash.

Per i miei codici di escape conoscenze possono essere utilizzati per controllare i comportamenti particolari, come evidente, riempire lo sfondo, spostare il cursore, e forse un po ' personalizzato codice di escape potrebbe essere aggiunto per far conoscere il terminale X che un testo da riga, colonna per riga, colonna è stato selezionato, solo un esempio, forse invece il testo selezionato potrebbe essere appena restituito (un dettaglio di implementazione).

Io indovino non essendo una definizione standard dovrete cerotto ogni applicazione che si desidera sostenerlo per conoscere la combinazione di tasti ha premuto e l'uscita del codice di escape appropriata, il readline se lo vuoi in bash, l'emulatore di terminale X su l'altro lato per elaborare correttamente il codice di escape (e infine inviare le informazioni agli Appunti). Probabilmente implementarlo come funzionalità terminale ti salverebbe dalla patch di ogni singola applicazione. Spero (e suppongo) che i driver del terminale nel kernel vogliano sapere meno possibile sui codici di escape, quindi se sei fortunato non sarà richiesta alcuna patch.

Il terminale X disegna l'output, in modo da sapere facilmente, quando si utilizza il mouse, quale testo / caratteri si sta selezionando.

Un widget di testo grafico sa tutto sulla sua finestra X e sul perché è così facile implementare selezionare e copiare.

MODIFICARE

Qui questa patch di visualizzazione delle immagini di urxvt-9.16 potrebbe essere un buon punto di partenza per capire cosa è necessario per supportare i nuovi codici di escape. http://lists.schmorp.de/pipermail/rxvt-unicode/2013q1/001736.html


1

Le risposte fornite sono buone spiegazioni del perché farlo è difficile. Qui c'è qualcosa che puoi fare in gnome-terminal per configurare ctrl-ce ctrl-vcopiare e incollare, mentre rilegando altre chiavi nella disciplina terminale con sttyl'invio SIGINTe l'inserimento di un carattere alla lettera. Questa non è una soluzione completa perché alcuni programmi disabilitano la disciplina terminale e non sarà possibile inviarli '^ C' e '^ V'. Maggiori informazioni qui .

Nel vostro script di avvio della shell (per esempio ~/.bashrc, ~/.zshrc, ~/.rcrc), do

stty intr '^Q' 2>/dev/null  # To send SIGINT I will use ctrl-q
stty lnext '^A' 2>/dev/null # To insert a character verbatim I will use ctrl-a

Quindi in gnome-terminal Modifica> Preferenze> Collegamenti puoi associare Copia e Incolla a ctrl-c e ctrl-v. Si noti che il terminale riceverà gli eventi chiave prima che qualcosa venga inviato al dispositivo terminale, quindi da quel momento in poi non sarà possibile inviare '^ C' e '^ V' a qualsiasi processo in esecuzione sul terminale.

Ho appena fatto questo e vedrò come va e quali problemi provoca. Ho fatto condizionalmente lo stty per applicarli solo quando eseguo X.


1
Grazie per la risposta. Nel frattempo mi sono abituato ai collegamenti OSX ed Emacs e ho anche rinunciato al sogno di ctrl +
maiusc

1

Come menzionato Thanatos, c'è una distinzione da fare tra l' emulatore di terminale (in esecuzione su X Windows o Wayland) e programmi in esecuzione all'interno del terminale (chiamiamolo "shell", anche se potrebbe non esserlo); queste due cose sono isolate l'una dall'altra (vedi dettagli tecnici ).

I primi elementi dell'elenco (tasti freccia, Home / Fine, ecc.) Sono gestiti direttamente dal programma all'interno del terminale, quindi la posizione del cursore è controllata dal programma all'interno del terminale.

Le scorciatoie copia e incolla (Ctrl + Maiusc + C e Ctrl + Maiusc + V), invece, sono gestite dall'emulatore di terminale, che capisce il mouse (in modo da poter selezionare il testo con il mouse), sa cos'è sullo schermo (in modo che possa essere copiato) e in grado di inviare i tasti premuti al programma all'interno (in modo che possa incollare).

Per supportare Maiusc + Sinistra e Maiusc + Destra, l'emulatore di terminale o la shell dovrebbero gestire la sequenza di tasti. In entrambi i casi abbiamo un problema:

  1. La shell non può gestire facilmente queste chiavi perché alla fine vorrai copiare il testo selezionato negli appunti, e gli appunti sono un concetto di X Windows a cui la shell non ha necessariamente accesso (ma vedi xclip). E per quanto ne so, se la shell supportava la selezione del testo, Linux non definisce alcun meccanismo per notificare all'emulatore di terminale ciò che è selezionato.
  2. Nel frattempo, l'emulatore di terminale non è responsabile della posizione del cursore. Anche se l'emulatore di terminale potrebbe cambiare la posizione del cursore, probabilmente non sa dove inizia e finisce la riga di testo corrente. Ad esempio, il terminale potrebbe contenere testo simile ~ $ ls -le l'emulatore di terminale non è consapevole del fatto che solo la ls -lparte appartiene all'utente.

Non è difficile immaginare un emulatore di terminale che supporti la selezione con Shift + Frecce, ma suppongo che dovrebbe nascondere il cursore della shell e introdurre il proprio "cursore falso" che esiste temporaneamente per aiutarti a selezionare qualcosa, quindi puoi premere Ctrl + C / Ctrl + Maiusc + C / Ctrl + Ins per copiare (o Esc per annullare) e mostrare di nuovo il cursore reale. Ciò non avrebbe ovviamente tutte le capacità di una normale selezione, in particolare il taglio e l'eliminazione non esisterebbero.


Grazie, leggerò l'articolo TTY, ma non l'ho ancora fatto. Ciò potrebbe spiegare il divario nella mia comprensione della differenza tra "emulatori di terminali" e "applicazioni desktop che gestiscono programmi di testo". Il mio esempio precedente, la console Matlab, si comporta esattamente come voglio. Non capisco perché non ci possa essere un'applicazione desktop con quel comportamento, in cui il programma di testo in esecuzione al suo interno è qualcosa di diverso da Matlab. Diciamo che volevo usare solo i comandi di base della shell - ls, cd, cp, mv - quindi non vedo alcun conflitto. Programmi come screen o tmux, capisco, potrebbero rendere le cose più complicate.
Monguin,

1

Queste sono le associazioni di tastiere CUA che descrivi, uno standard di IBM a metà degli anni '80:

https://en.wikipedia.org/wiki/IBM_Common_User_Access

In genere sono implementati in tutti gli ambienti desktop creati da allora. DOS, Windows, Motif e persino gli strumenti Netware convergono tutti su questo standard. Un'eccezione è il Mac, che utilizza un set abbastanza simile ma diverso (Cmd anziché Ctrl) dello stesso periodo di tempo.

I terminali Unix precedono di gran lunga questo standard e lo ignorano per lo più. Inoltre, se implementassero questi collegamenti chiave, potrebbero interferire con i programmi TUI che li utilizzano già per altre funzionalità. Quindi, sebbene tecnicamente fattibile, anche problematico.

applicazioni:

L' microeditor di testo è il migliore che abbia mai visto emulare un editor di testo GUI, simile a DOS  editma con funzionalità più moderne come Sublime Text. neè più vecchio nei repository Debian e nanopuò anche essere configurato con combinazioni di tasti sani. Ma il terminale nudo / shell, no.

Con libvteesso potrebbe essere facile costruire un terminale virtuale rudimentale che gestisca queste combinazioni di tasti da soli. Un sacco di lavoro per un piccolo guadagno comunque.


0

Ho appena aiutato un amico a risolvere un problema simile a questo e ho scoperto che il responsabile del blocco appunti era il colpevole.

sudo apt-get remove clipit

è stato in grado di ripristinare tutto e funzionare perfettamente per lui. Spero che possa aiutare qualcun altro là fuori.


Hai risposto alla domanda sbagliata? Questa era una domanda generale sulle capacità di tutti gli emulatori terminali. È abbastanza chiaro che non esiste una "soluzione". Non lo faccio ora, né ho mai installato Clipit su nessuna macchina.
Monguin,
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.