2010-08-12 6 views
12

लघु संस्करण: emacs 'xterm-mouse-mode का उपयोग करते समय, किसी को (emacs? Bash? Xterm?) Xterm के नियंत्रण अनुक्रमों को रोकता है और उन्हें \ 0 के साथ बदल देता है। यह व्यापक मॉनीटर पर दर्द है क्योंकि केवल पहले 223 स्तंभों में माउस होता है।Emacs, यूनिकोड, xterm माउस से बचने के अनुक्रम, और विस्तृत टर्मिनल

अपराधी क्या है, और मैं इसके आसपास कैसे काम कर सकता हूं?

मैं क्या बता सकते हैं इस यूनिकोड/UTF-8 समर्थन के साथ कुछ किया है, क्योंकि यह एक समस्या 5-6 साल पहले नहीं था जब मैं पिछले एक बड़ा मॉनिटर था से

गोरी विवरण का पालन करें ...

धन्यवाद!

Emacs टर्म-माउस-मोड एक प्रसिद्ध कमजोरी के आसपास एक्स = 95 से शुरू होने माउस क्लिक से निपटने है। A workaround, emacs के हाल के संस्करणों द्वारा अपनाया गया है, समस्या को x = 223 पर बंद कर देता है।

कई साल पहले मुझे पता चला कि xterm 7-बिट octets में एन्कोड पदों को एन्कोड करता है। यह देखते हुए स्थिति 'एक्स' के साथ एक्स = एक्स 96, एन्कोड करने के लिए, भेजें:

\40+x (x < 96) 
\300+X/64 \200+X%64 (otherwise) 

हम, Emacs से दिए गए एक्स स्थिति के लिए एक जोड़ने के लिए है, क्योंकि एक पर टर्म शुरू में पदों, नहीं शून्य। इसलिए जादू x = 95 संख्या पॉप अप होती है क्योंकि इसे "\ 300 \ 200" के रूप में कोड किया जाता है - पहला बच निकला नंबर। कोई (emacs? Bash? Xterm?) ISO 2022 से "सी 0" नियंत्रण अनुक्रमों जैसे व्यवहार करता है। एक्स = 15 9 से शुरू होने पर, हम "सी 1" अनुक्रमों (\ 301 \ 200) में बदल जाते हैं, जो आईएसओ 2022 का भी हिस्सा हैं।

\ x2 अनुक्रमों के साथ परेशानी हिट, जो वर्तमान x = 223 सीमा से मेल खाती है। कई साल पहले मैं मैन्युअल रूप से \ 302 और \ 303 अनुक्रमों को रोकने के लिए हैक का विस्तार करने में सक्षम था, जो समस्या से पहले हो गया था। कुछ साल फास्ट फॉरवर्ड करें, और आज मुझे लगता है कि मैं एक्स = 223 पर वापस फंस गया हूं क्योंकि कोई उन अनुक्रमों को \ 0 के साथ बदल रहा है।

तो, जहाँ मैं लाइन 1, col 250 पर क्लिक करके उम्मीद थी

ESC [ M SPC [email protected] ! ESC [ M # [email protected] ! 

(किसी भी col> 223 के लिए)

ESC [ M SPC \303\207 ! ESC [ M # \303\207 ! 

इसके बजाय Emacs रिपोर्ट तैयार करने के लिए मुझे लगता है कि यूनिकोड/UTF -8 समर्थन अपराधी है। कुछ खुदाई से पता चलता है कि the Unicode standard allowed C0 and C1 sequences as part of UTF-8 until Nov 2000, और मुझे लगता है कि किसी को ज्ञापन (सौभाग्य से) नहीं मिला। हालांकि, \ 302 \ 200 - \ 302 \ 237 Unicode control sequences हैं, इसलिए कोई उन्हें फिसलता है (जो जानता है-उनके साथ क्या है!) और बदले में \ 0 देता है।

कुछ और विस्तृत प्रश्न:
- यह कोई है जो ईएमएक्स 'हानि बफर तक पहुंचने से पहले कोड को रोकता है?
- यदि यह वास्तव में केवल नियंत्रण अनुक्रमों के बारे में है, तो \ 302 \ 237 के बाद वर्ण कैसे आते हैं, जो प्रिंट करने योग्य यूनिकोड के यूटीएफ -8 एन्कोडिंग हैं, भी वापस आते हैं \ 0?
- इमैक निर्णय लेता है कि क्या यूनिकोड वर्ण या ऑक्टल एस्केप अनुक्रमों के रूप में हानि प्रदर्शित करना है, और दो मैच क्यों नहीं? उदाहरण के लिए, मेरे स्वयं निर्मित सिग्विन कॉलम 161 के लिए 23.2.1 (xterm 22 9) रिपोर्ट \ 301 \ 202 emacs, लेकिन मेरे rhel5.5-supplied emacs 22.3.1 (xterm 215) रिपोर्ट "¢" (circumflex के साथ लैटिन ए) , जो वास्तव में यूटीएफ -8 में \ 303 \ 202 है!

अद्यतन:

diff -r button.c button.utf-8-fix.c 
--- a/button.c Sat Aug 14 08:23:00 2010 +0200 
+++ b/button.c Thu Aug 26 16:16:48 2010 +0200 
@@ -3994,1 +3994,27 @@ 
-#define MOUSE_LIMIT (255 - 32) 
+#define MOUSE_LIMIT (2047 - 32) 
+#define MOUSE_UTF_8_START (127 - 32) 
+ 
+static unsigned 
+EmitMousePosition(Char line[], unsigned count, int value) 
+{ 
+ /* Add pointer position to key sequence 
+  * 
+  * Encode large positions as two-byte UTF-8 
+  * 
+  * NOTE: historically, it was possible to emit 256, which became 
+  * zero by truncation to 8 bits. While this was arguably a bug, 
+  * it's also somewhat useful as a past-end marker so we keep it. 
+  */ 
+ if(value == MOUSE_LIMIT) { 
+  line[count++] = CharOf(0); 
+ } 
+ else if(value < MOUSE_UTF_8_START) { 
+  line[count++] = CharOf(' ' + value + 1); 
+ } 
+ else { 
+  value += ' ' + 1; 
+  line[count++] = CharOf(0xC0 + (value >> 6)); 
+  line[count++] = CharOf(0x80 + (value & 0x3F)); 
+ } 
+ return count; 
+} 
@@ -4001,1 +4027,1 @@ 
- Char line[6]; 
+ Char line[9]; /* \e [ > M Pb Pxh Pxl Pyh Pyl */ 
@@ -4021,2 +4047,0 @@ 
- else if (row > MOUSE_LIMIT) 
-  row = MOUSE_LIMIT; 
@@ -4028,1 +4052,5 @@ 
- else if (col > MOUSE_LIMIT) 
+ 
+ /* Limit to representable mouse dimensions */ 
+ if (row > MOUSE_LIMIT) 
+  row = MOUSE_LIMIT; 
+ if (col > MOUSE_LIMIT) 
@@ -4090,2 +4118,2 @@ 
-  line[count++] = CharOf(' ' + col + 1); 
-  line[count++] = CharOf(' ' + row + 1); 
+  count = EmitMousePosition(line, count, col); 
+  count = EmitMousePosition(line, count, row); 

उम्मीद है कि इस (या इसे की तरह कुछ) एक में दिखाई देगा:

यहाँ जो यह utf-8 प्रारूप में माउस पदों का उत्सर्जन करता है टर्म-261 के खिलाफ एक पैच है xterm का भविष्य संस्करण ... पैच xxm को emacs-23 (जो utf-8 इनपुट मानता है) के साथ बॉक्स से बाहर काम करता है और मौजूदा समस्याओं को xt-mouse.el के साथ भी ठीक करता है। Emacs -22 के साथ उपयोग करने के लिए समारोह में यह माउस पदों को डिकोड करने का उपयोग करता है की एक नई परिभाषा की आवश्यकता है (नई परिभाषा के साथ ठीक काम करता है Emacs-23 भी):

(defadvice xterm-mouse-event-read (around utf-8 compile activate) 
    (setq ad-return-value 
     (let ((c (read-char))) 
      (cond 
      ;; mouse clicks outside the encodable range produce 0 
      ((= c 0) #x800) 
      ;; must convert UTF-8 to unicode ourselves 
      ((and (>= C#xC2) (< emacs-major-version 23)) 
      (logior (lsh (logand C#x1F) 6) (logand (read-char) #x3F))) 
      ;; normal case 
      (c))))) 

सब पर .emacs के हिस्से के रूप defun वितरित करें जिन मशीनों में आप लॉग इन करते हैं, और आप जिस मशीन से काम करते हैं उस पर xterm को पैच करें। देखा!

चेतावनी: अनुप्रयोग जो xterm के माउस मोड का उपयोग करते हैं लेकिन यूटएफ -8 के रूप में उनके इनपुट का इलाज नहीं करते हैं, इस पैच द्वारा भ्रमित हो जाएंगे क्योंकि माउस से बचने के दृश्य लंबे समय तक पहुंचते हैं। हालांकि, वे अनुप्रयोग वर्तमान xterm के साथ बहुत ही टूट जाते हैं क्योंकि x> 95 के साथ माउस स्थिति utf-8 कोड की तरह दिखती है लेकिन नहीं हैं। मैं xterm के लिए एक नया माउस मोड बनाउंगा, लेकिन कुछ एप्लिकेशन (gnu स्क्रीन!) अज्ञात भागने के दृश्यों को फ़िल्टर करते हैं। Emacs एकमात्र टर्मिनल-माउस ऐप है जिसका उपयोग मैं करता हूं, इसलिए मैं पैच को नेट जीत मानता हूं, लेकिन वाईएमएमवी।

+2

मैं एक टर्मिनल इस विस्तृत नहीं है और मैं एक Emacs उपयोगकर्ता नहीं हूँ, लेकिन इस सवाल का चट्टानों। एक नए उपयोगकर्ता द्वारा विस्तृत और बिंदु पर। मुझे नहीं लगता कि मैं इस के साथ आपकी मदद कर सकता हूं (आपके सेटअप को पुन: पेश करने और विश्लेषण करने में काफी समय लगेगा), लेकिन आपने अपने टर्मिनल एमुलेटर को सटीक बाइट्स को स्टोर करने के लिए "स्क्रिप्ट" (टूल) का उपयोग करने का प्रयास किया है आवेदन? – scy

+1

हम्म (ओह, और शायद इस सवाल का नहीं बल्कि सत्ता उपयोगकर्ता पर एक उम्मीदवार से अधिक ... होगा)। स्क्रिप्ट एक ही चीज़ देखता है। मैंने माउस मोड को सक्षम करने के लिए एक त्वरित सी प्रोग्राम भी लिखा और फिर अपने stdin को एक ऑक्टेट स्ट्रीम में परिवर्तित कर दिया। $ xterm -e echo-octets इसे सीधे xterm (ऊपर) से भी चला रहा है, जो कुछ भी मैं 7-बिट पर सेट करने के बारे में सोच सकता हूं, माउस क्लिक \ 377 या उससे कम तक सीमित हैं - जो 8 की तरह संदिग्ध रूप से लगता है -bit एन्कोडिंग। में संकलित? वैसे भी, यह emacs नहीं है ... और उम्मीद है कि उपरोक्त सही है तो उम्मीद नहीं है। – Ryan

उत्तर

3

ठीक है, यह पता लगा। वास्तव में दो मुद्दे हैं।

सबसे पहले, कुछ स्रोत डाइविंग से पता चलता है कि xterm विंडो के माउस-सक्षम क्षेत्र को 223x223 वर्णों में क्लिप करता है, और अन्य सभी स्थितियों के लिए 0x0 भेजता है।

दूसरा, emacs-23 यूटीएफ -8 जागरूक है और x> 160 और y> 94 ​​वाले माउस ईवेंट द्वारा भ्रमित हो जाता है; उन मामलों में x और y के लिए xterm का एन्कोडिंग दो-बाइट यूटीएफ -8 वर्ण (उदा। 0xC2 0x80) जैसा दिखता है और परिणामस्वरूप माउस अनुक्रम एक वर्ण छोटा लगता है।

मैं माउस घटनाओं को यूटीएफ -8 उत्सर्जित करने के लिए xterm के लिए एक पैच पर काम कर रहा हूं (जो दोनों unacuse emacs-23 और टर्मिनलों को 2047x2047 तक अनुमति देगा), लेकिन मुझे यकीन नहीं है कि यह कैसे निकल जाएगा।

2

मुझे लगता है कि समस्या 23.2 में काम करना बंद करने के लिए आपके कामकाज (और अपस्ट्रीम फिक्स जिसे वी 22 रिलीज़ में शामिल किया गया था) के कारण इमाक्स के भीतर ही है। 23.1 urxvt, gnu screen, putty या iTerm का उपयोग कर कॉलम 95 के बाद माउस क्लिक को संभाल सकता है, लेकिन 23.2 नहीं कर सकता। लैटिन -1 में सेट सबकुछ सेट करना कोई फर्क नहीं पड़ता। 23.1 में xt-mouse.el में एक ही कोड है। src/lread.c और src/character.h बदल गया, हालांकि, और एक नज़र में मुझे लगता है कि बग कहीं कहीं है। कॉलम 223 के बाद क्या होता है, मुझे कोई सुराग नहीं मिला है।

23.2 में xt-mouse रिग्रेशन द्वारा नाराज किसी और के लाभ के लिए यहां xterm-mouse-event-read का एक संशोधित संस्करण है जो माउस 222 तक माउस क्लिक के साथ काम करता है (222 ओवरफ्लो के लिए रयान को क्रेडिट हैंडलिंग जो मेरे मूल फिक्स की कमी थी)। यह शायद 23.1 या इससे पहले काम नहीं करेगा।

(defun xterm-mouse-event-read() 
    (let ((c (read-char))) 
    (cond ((= c 0) #x100) 
     ; for positions past col 222 emacs just delivers 
     ; 0x0, best we can do is stay at eol 
     ((= 0 (logand c (- #x100))) c) 
     ((logand C#xff))))) 

... संपादित करें: यहाँ Emacs 24 (BzR सिर) से संस्करण है। यह 23.2 ऊपर में फिर से काम करता है 222 कर्नल, लेकिन> 222 अतिप्रवाह EOL से निपटने रयान सुझाव का अभाव:

(defun xterm-mouse-event-read() 
    (let ((c (read-char))) 
    (if (> C#x3FFF80) 
     (+ 128 (- C#x3FFF80)) 
     c))) 
1

टर्म अब एक पैच के साथ utf-8 मोड में काम करता है, इस utf-8 हैक, किसी अन्य स्थान में सबसे खराब संभव तरीके से तोड़ने के रूप में यूनिकोड वर्ण बस जब तक प्रदर्शनीय गिरा दिया जाएगा होगा।

आरएक्सवीटी-यूनिकोड (9.0 9 के बाद रिलीज में) एक 1015 मोड है जो दशमलव संख्याओं का उपयोग करते हुए "ईएससी [कोड; एक्स; वाई एम" फ़ॉर्म के जवाब भेजता है। इसका ऐप से किसी भी जांच की आवश्यकता नहीं है और गैर-यूटीएफ -8 लोकेशंस में काम करने का लाभ भी है।

+0

अद्यतन के लिए धन्यवाद। मुझे वास्तव में सिद्धांत में आरएक्सवीटी समाधान बहुत बेहतर लगता है (यह वही है जो मूल रूप से vt100 किया जाना चाहिए था), लेकिन यह कई अन्य ऐप्स तोड़ता है। कभी-कभी कुछ ऐप्स तोड़ने या उन सभी को फिर से लिखने के लिए मजबूर करने की पसंद के साथ सामना करना पड़ा, मैं कम आक्रामक के लिए गया। उस ने कहा, यह पता चला है कि मुझे gnu स्क्रीन में माउस हैंडलिंग को फिर से लिखना था, इसलिए ... – Ryan

5

xterm-262 पैच ऊपर inlined, हालांकि, इस पैच काफी डिजाइन द्वारा टूट गया है कहते हैं। Rxvt-unicode के डेवलपर्स ने इसे महसूस किया और माउस निर्देशांक की रिपोर्ट करने के लिए अभी तक एक और बेहतर जोड़ा गया।

अभी मैं इस के लिए व्यापक समर्थन मिल रहा है पर काम कर रहा हूँ। Rxvt-unicode और iTerm2 पहले से ही दोनों एक्सटेंशन का समर्थन करते हैं। मैं xterm (urxvt विस्तार का समर्थन करने के लिए) के लिए पैच बनाया है, और gnome-terminal, konsole और putty के लिए दोनों नए विस्तार का समर्थन करने के लिए। अनुप्रयोगों के लिए, मैंने urxvt एक्सटेंशन Midnight Commander पर समर्थन जोड़ा है।

कृपया मेरे प्रयास में शामिल हों और इन एक्सटेंशन को लागू करने के लिए अधिक टर्मिनल डेवलपर्स और एप्लिकेशन को मनाने की कोशिश करें (कम से कम urxvt एक, क्योंकि अन्य को एप्लिकेशन द्वारा स्वचालित रूप से स्वचालित रूप से पहचाना नहीं जा सकता है)।

तकनीकी जानकारी और आगे संकेत के लिए http://www.midnight-commander.org/ticket/2662 देखें।

संबंधित मुद्दे