Come interrompere emacs quando control-g non funziona in file molto grandi?


16

Mi sono imbattuto in un qualche tipo di comportamento O (n ^ 2) o peggiore durante la visualizzazione di file di grandi dimensioni (ad esempio 128 MB) in Emacs e saltando alla fine del file. Penso che potrebbe avere a che fare con il mio algoritmo di colorazione per colorare il testo contestualmente. Se digito control-g (tastiera-esci), l'operazione non è interessata. Vorrei un modo per recuperare la mia sessione di emacs senza semplicemente ucciderla. Ho provato a inviare un SIGINT, ma emacs è appena uscito. Ci sono segnali che posso inviare o in qualche altro modo (forse in un debugger) per forzare qualsiasi azione sia in corso per rinunciare e restituirmi il controllo?


Non conosco un modo per rendere il blocco dei caratteri interrompibile, ma potresti trovare qualcosa di utile in questa pagina Wiki di Emacs per accelerare il blocco dei caratteri .
Aaron Miller,

5
Hai provato a colpire la fuga 3 volte?
yPhil

Sì, penso che il tuo codice di blocco dei caratteri sia probabilmente qui in difetto. Esamina font-lock-keywordsattentamente le tue regexps per cercare di trovare il problema.
Ha

1
EMACS: otto megabyte e scambio costante :-)
user829755

2
Colpire la fuga tre volte non fa nulla per me.
WilliamKF,

Risposte:


9

Dubito che sia la modalità di blocco dei caratteri. Questo probabilmente fa solo sezioni vicino a ciò che è visibile. Probabilmente sta copiando i dati in memoria.

sigusr1

sigusr2

Questi eventi vengono generati quando il processo Emacs riceve i segnali SIGUSR1e SIGUSR2. Non contengono dati aggiuntivi poiché i segnali non contengono informazioni aggiuntive. Possono essere utili per il debug (vedi Debug degli errori ).

Fonte: GNU Emacs Lisp Manuale di riferimento: Eventi vari

Non so che cosa farebbe (o quale versione di emacs stai eseguendo) ma potresti provare un segnale PROBABILMENTE non distruttivo (USR1 o USR2).

$ kill -USR1 pid

Oppure potresti andare a dormire e vedere se si ripristina.


Mi chiedo quanto sia occupata (CPU e disco) la tua macchina. Questo potrebbe dirti un po 'di quello che sta facendo. .. e potresti essere in grado di eseguire un'altra copia di emacs e "kill -USR1 pid" quella nuova per vedere cosa succede prima di fare quello a cui tieni.
9mjb l'

3
Wow, l'invio kill -USR2a emacs-mac ha funzionato per me in una situazione simile - ha caricato un file di grandi dimensioni in modalità js2 e ha avviato una ricerca. USR2 ha chiuso isearch ed è entrato nel debugger. Molto meglio che uccidere il processo!
William,

Non sono d'accordo con i tuoi dubbi. L'uccisione ha funzionato per me. Mi ha portato al debugger e font-lock-default-fontify-region era dove era bloccato.
Brian C.

2

Non sono a conoscenza della gestione del segnale emacs, ma è possibile utilizzare Emacs Server inserendo server-startil file ~ / .emacs in modo da poter eseguire RPC sull'istanza corrente di emacs.

Quindi quando vuoi uccidere emacs e scrivere puoi chiamare dalla tua shell emacsclient -e '(save-buffers-kill-emacs t)'.

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.