সিআই কে কীভাবে ট্যাব থেকে পৃথক করা যায়?


16

আমি Control-iপারফর্ম করতে চাই indent-region(মূলত যেহেতু এক্সকোড সেই পেশীটির স্মৃতি ইতিমধ্যে তৈরি করেছে)।

আমি বুঝতে পেরেছি Control-iএবং tabআসকি অর্থে পৃথক নয়, তবে তারা কীকোড অর্থে রয়েছে।

আমি স্পষ্ট চেষ্টা করেছি:

(global-unset-key (kbd "C-i"))
(global-set-key (kbd "C-i") 'indent-region)

কোনও লাভ নেই - Control-iএখনও চাপ দিয়ে tabকী প্রাসঙ্গিক প্রেক্ষাপটে যা কিছু করে তা করে। ইম্যাক্সকে ট্যাব বোতামটির সাথে অন্যরকম আচরণ করতে সহায়তা করার জন্য আমি কী করতে পারি Control-i?

আপডেট: আমি অনুমান করি যে কোনও অঞ্চল নির্বাচন করা হলে tab/ Control-iপ্রেসের কী পুনর্নির্মাণ করতে সক্ষম হয়ে একটি সমতুল্য ফলাফল অর্জন করা হবে ।


1
এটি কি জিইউআই ফ্রেম বা টার্মিনাল ফ্রেম থেকে? আপনি টার্মিনালের জন্য ওভাররাইড করতে পারেন কিনা তা আমি জানি না।
ডিজিটেড

গুড কিউ, জিইউআই ফ্রেম সাধারণত হয় তবে আমি সার্ভারগুলিতে রিমোট করি এবং মাঝে মাঝে টার্মিনালে ইমাস ব্যবহার করি (অবশ্যই গিট-শেয়ার্ড ইমাস.ড সহ :) :)
মার্ক অফলিক

উত্তর:


15

আমি মনে করি না যে এটি একটি টার্মিনাল থেকে অর্জন করা যেতে পারে তবে জিইউআই মোডে আপনি এটি চেষ্টা করতে পারেন:

(define-key input-decode-map [?\C-i] [C-i])
(global-set-key (kbd "<C-i>") 'indent-region)

আমি একই জিনিসটি C-mযাতে এটির থেকে আলাদা করা যায় তাও করিRET

সম্পাদনা করুন:

আপনি জিইউআই বা টিটিওয়াই মোডে রয়েছেন কিনা তা নীচে কাজ করা উচিত:

;; Unbind <C-i> from the TAB key and bind it to indent-region.
;; Since TAB and <C-i> cannot be differentiated in TTY emacs,
;; the workaround is to conditionally bind TAB to indent-region
;; when there is an active region selected.
(if (window-system)
  ; IF we are not in a TTY, unbind C-i from TAB
    (progn
      (define-key input-decode-map [?\C-i] [C-i])
      ; ... and remap it to indent-region
      (global-set-key (kbd "<C-i>") 'indent-region))
  ; ELSE IF we are in a TTY, create a replacement for TAB
  (defun my/tab-replacement (&optional START END)
    (interactive "r")
    (if (use-region-p)
      ; IF active region, use indent-region
        (indent-region START END)
      ; ELSE IF no active region, use default tab command
      (indent-for-tab-command)))
  ; Bind our quick-and-dirty TAB replacement to the TAB key
  (global-set-key (kbd "TAB") 'my/tab-replacement))

এটি সুন্দর নয়, তবে মনে হয় কাজটি করবেন। আমি প্রয়োজনীয় হিসাবে এই কোডটিতে কোন পরিশোধন বা সম্পাদনা স্বাগত জানাই।



কেবলমাত্র ছোটখাটো সমস্যা যা আমি ভেবেছিলাম তা হ'ল আমরা এখন উইন্ডো সিস্টেম (যা আমি মাঝে মাঝে করি) দিয়ে শুরু করা ইমাসের বিরুদ্ধে একটি টার্মিনাল ইমাস্কিলিয়েন্ট আনতে পারি। আমি যদি কোনও বিলম্ব না দেখি তবে আমি কেবলমাত্র সমস্ত ক্ষেত্রে ট্যাব-প্রতিস্থাপন ফান ব্যবহার করব।
মার্ক অফলিক

1
আমি কেবল এটি যুক্ত করতে চাই যে <C-i>এবং [C-i]এটি একটি স্বেচ্ছাসেবী সনাক্তকারী হতে পারে, পছন্দ <foobar>এবং [foobar], এবং এটি এখনও কাজ করবে; কেবল এটিকে কল করবেন না tabবাbackspace
xdavidliu

আমি মধ্যে আপনার উত্তরে সম্পাদিত কোড টুকরা যোগ করেছেন .emacsফাইল কিন্তু উভয় TABএবং C-iহয় remapped :-( @nispio
Alper

@ আল্পার, সম্ভবত এর অর্থ এটি বোঝা যাওয়ার সময় (window-system)ফিরে এসেছিল । এটি ইমাক্সের একটি গ্রাফিকাল উদাহরণ না চালানোর কারণে বা আপনি ইমাস্যাক ডেমন চালাচ্ছেন বলে এটি হতে পারে। nil.emacs
নিসপিও

13

জিইউআই ফ্রেম

জিইউআই ফ্রেমগুলিতে (এক্স 11, উইন্ডোজ, ওএসএক্স,…), ইমাক্স ফাংশন কী Tabহিসাবে কীটি পড়ে tab। তবে, যেহেতু Tabটার্মিনালের কীটি traditionতিহ্যগতভাবে ^I( কন্ট্রোল + আই) অক্ষরটি প্রেরণ করে , ইমাস্যাক্সগুলি tabফাংশন কীটি কন্ট্রোল + আই অক্ষরে (অক্ষর 9) অনুবাদ করে, যা হিসাবে প্রদর্শিত হয় TAB। এই অনুবাদ মাধ্যমে করা হয় function-key-map

অনুরূপ অনুবাদ কিছু অন্যান্য ফাংশন কীগুলির সাথে ঘটে। ( Backspaceএবং Deleteএটি একটি কাঁটাযুক্ত মামলা যা আমি এখানে বিস্তারিত আলোচনা করব না))

Function key    Translated to character         Notes
                Number  Name  Decomposition
backspace       127     DEL   Ctrl+?            May be translated to C-h instead
tab               9     TAB   Ctrl+I
linefeed         10     LFD   Ctrl+J            Few keyboards have this key
return           13     RET   Ctrl+M
escape           27     ESC   Ctrl+[

আপনি যদি পুরোপুরি + Tabথেকে আলাদা করতে চান তবে বাইন্ডিংটি এখান থেকে সরান :CtrlIfunction-key-map

(define-key function-key-map [tab] nil)

তবে এটি খুব কার্যকর নয়, কারণ এন্ট্রিগুলিকে function-key-mapমোড-নির্দিষ্ট কীম্যাপে বা বৈশ্বিক মানচিত্রে বাইন্ডিং দ্বারা ওভাররাইড করা হয়। সুতরাং আপনি যদি এর জন্য আলাদা বাইন্ডিং সংজ্ঞায়িত করতে চান তবে tabএটি করুন (এলিস্পে, ইন্টারেক্টিভভাবে নয়, কারণ কী রিডিং প্রম্পটটি function-key-mapঅনুবাদটি প্রয়োগ করে যাতে আপনি রিবান্ডিং শেষ করেন TABএবং না tab):

(global-set-key [tab] '…)
(define-key some-mode-map [tab] '…)

সমস্ত মান মোড কর্ম সংশোধন যে Tabকী পরিবর্তন করে এটা করতে TABকী, যার জন্য ডাক নাম হয় C-iদ্বারা কী সমন্বয় উত্পন্ন চরিত্র Ctrl+ + I। আপনি স্ট্যান্ডার্ড বাইন্ডিং প্রয়োগ করতে চান তাহলে tabবরং C-i, ছুটি function-key-mapএবং মোড keymaps একা, এবং এর পরিবর্তে পুনর্নির্দেশ Ctrl+ + Iএকটি ভিন্ন চাবি।

(define-key input-decode-map [(control ?i)] [control-i])
(define-key input-decode-map [(control ?I)] [(shift control-i)])
(define-key some-mode-map [control-i] '…)

এখন ইমাকগুলি Ctrl+ Iকে " <control-i>(অনুবাদিত TAB) হিসাবে" হিসাবে রিপোর্ট করবে । এটি সুন্দর নয়, তবে এটি অনিবার্য নয়: TABইম্যাক্স উত্স কোড হিসাবে নির্মিত 9 অক্ষরের সুন্দর-মুদ্রণ ।

টার্মিনাল ফ্রেম

টার্মিনাল ফ্রেমে সমস্যাটি আরও শক্ত এবং প্রায়শই অসম্ভব। টার্মিনালগুলি কীগুলি সংক্রমণ করে না, তারা অক্ষর সংক্রমণ করে (আরও স্পষ্টভাবে, তারা বাইটস সংক্রমণ করে)। Tabযা কন্ট্রোল + আমি, কি কী সমন্বয় হিসাবে একই - মূল ট্যাব অক্ষর হিসেবে প্রেরণ করা হয় Ctrl+ + Iজেনারেট করে। কোনও সম্পর্কিত অক্ষর নেই এমন ফাংশন কীগুলি (যেমন কার্সার কী হিসাবে) এস্কেপ সিকোয়েন্স হিসাবে প্রেরণ করা হয়, অর্থাৎ ESC= কন্ট্রোল + দিয়ে শুরু হওয়া অক্ষরের অনুক্রম [[এজন্যই ইমাকস escapeএকটি উপসর্গ কী হিসাবে সংজ্ঞা দেয় - ESCএটি একটি উপসর্গ হতে হবে)। দেখুন কিভাবে কীবোর্ড ইনপুট এবং টেক্সট আউটপুট কাজ করে? আরও পটভূমি জন্য।

কয়েকটি টার্মিনাল রয়েছে যা ফাংশন কীগুলির জন্য বিভিন্ন কী সিকোয়েন্সগুলি প্রেরণের জন্য কনফিগার করা যেতে পারে তবে অনেকগুলি নয়। উভয় LeoNerd এর libtermkey / libtickit এবং টমাস Dickey এর xterm (সংস্করণ 216 থেকে) এই সমর্থন করি। এক্সটার্মে, বৈশিষ্ট্যটি alচ্ছিক এবং modifyOtherKeysসংস্থানটির মাধ্যমে সক্রিয় করা হয়েছে । যাইহোক, আমি এক্সটার্ম ব্যতীত অন্য কোনও জনপ্রিয় টার্মিনাল এমুলেটর জানি না যা এটি সমর্থন করে, বিশেষত লিবভেটিতে নির্মিত বহু ইমুলেটর । কিছু টার্মিনাল এমুলেটর আপনাকে কীচর্ডস থেকে অব্যাহত ক্রমগুলি থেকে ব্যবহারকারী-সংজ্ঞায়িত চিঠিপত্রের মাধ্যমে আপনাকে ম্যানুয়ালি এটি করতে দেয়।

এই প্রক্রিয়াটি কেবলমাত্র ট্যাব / সিআই নয়, রিটার্ন / সেন্টিমিটার এবং অব্যাহতি / সি- [অনেকগুলি মূল সংমিশ্রণকে আলাদা করার মঞ্জুরি দেয়। আরও বিশদ বিবরণের জন্য টার্মিনাল ব্যবহার করার সময় কী-বাইন্ডিংগুলির সাথে সমস্যাগুলি দেখুন ।

বুনিয়াদি এক্সটার্ম বৈশিষ্ট্যটি ইমাক্স 24.4 থেকে সমর্থনযোগ্য। তবে মৌলিক (বিশেষ করে Tab, Return, Escape, Backspace) এখনও প্রথাগত নিয়ন্ত্রণ অক্ষর পাঠাতে কারণ যে কী অ্যাপ্লিকেশন আশা। এমন একটি মোড রয়েছে যেখানে Ctrl+ letterকন্ট্রোল অক্ষরের পরিবর্তে একটি পালানোর ক্রম প্রেরণ করে। সুতরাং Ctrlইমাস 24.4 এর সংমিশ্রণগুলি থেকে ফাংশন কীগুলি পৃথক করার জন্য modifyOtherKeys, 1 টি পরিবর্তে 2 এ সংস্থানটি সেট করে এই মোডটি ব্যবহার করার জন্য এর সমর্থনটি পরিবর্তন করুন ।

;; xterm with the resource ?.VT100.modifyOtherKeys: 2
;; GNU Emacs >=24.4 sets xterm in this mode and define
;; some of the escape sequences but not all of them.
(defun character-apply-modifiers (c &rest modifiers)
  "Apply modifiers to the character C.
MODIFIERS must be a list of symbols amongst (meta control shift).
Return an event vector."
  (if (memq 'control modifiers) (setq c (if (or (and (<= ?@ c) (<= c ?_))
                                                (and (<= ?a c) (<= c ?z)))
                                            (logand c ?\x1f)
                                          (logior (lsh 1 26) c))))
  (if (memq 'meta modifiers) (setq c (logior (lsh 1 27) c)))
  (if (memq 'shift modifiers) (setq c (logior (lsh 1 25) c)))
  (vector c))
(defun my-eval-after-load-xterm ()
  (when (and (boundp 'xterm-extra-capabilities) (boundp 'xterm-function-map))
    ;; Override the standard definition to set modifyOtherKeys to 2 instead of 1
    (defun xterm-turn-on-modify-other-keys ()
      "Turn the modifyOtherKeys feature of xterm back on."
      (let ((terminal (frame-terminal)))
        (when (and (terminal-live-p terminal)
                   (memq terminal xterm-modify-other-keys-terminal-list))
          (send-string-to-terminal "\e[>4;2m" terminal))))
    (let ((c 32))
      (while (<= c 126)
        (mapc (lambda (x)
                (define-key xterm-function-map (format (car x) c)
                  (apply 'character-apply-modifiers c (cdr x))))
              '(;; with ?.VT100.formatOtherKeys: 0
                ("\e\[27;3;%d~" meta)
                ("\e\[27;5;%d~" control)
                ("\e\[27;6;%d~" control shift)
                ("\e\[27;7;%d~" control meta)
                ("\e\[27;8;%d~" control meta shift)
                ;; with ?.VT100.formatOtherKeys: 1
                ("\e\[%d;3~" meta)
                ("\e\[%d;5~" control)
                ("\e\[%d;6~" control shift)
                ("\e\[%d;7~" control meta)
                ("\e\[%d;8~" control meta shift)))
        (setq c (1+ c)))))
  (define-key xterm-function-map "")
  t)
(eval-after-load "xterm" '(my-eval-after-load-xterm))

আপনি যখন "ইমাস 24.24" বলছেন তখন আপনার অর্থ কি "ইমাস 24.4"?
তারসিয়াস

1
@ টারসিয়াস আমার থিম ফাইলটি থেকে অনুলিপি করা কোডের একটি মন্তব্য "24.4" বলে, তাই আমি মনে করি এটি সঠিক, এবং আমি এই উত্তরটির জন্য যে পাঠ্যটি লিখেছিলাম তাতে "24.4" টাইপ ছিল।
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.