অটো-মোড-তালিকাকে সম্মানের জন্য বাফারগুলি (কেবল ফাইল নয়) কীভাবে পাবেন?


13

প্রশ্ন: আমি কীভাবে ম্যাপিংয়ে সম্মান জানাতে নতুন বাফার পেতে পারি auto-mode-alist?

কোনও ফাইল সন্ধান করার সময় , ইমাক্স auto-mode-alistফাইলের বাফারের জন্য কোন প্রধান মোডটি ব্যবহার করতে হবে তা নির্ধারণ করতে ফাইল এক্সটেনশনের সাথে তুলনা করে । auto-mode-alistবাফারের সাথে মোড নির্ধারণ করার জন্য তথ্যটি ব্যবহার করার কোনও উপায় আছে যা এর সাথে কোনও ফাইল যুক্ত (এখনও) নেই?

এটি হ'ল: যদি আমি একটি নতুন বাফারটি খুলি যার নামটিতে ফাইল এক্সটেনশনের মতো কিছু থাকে তবে আমি কী এটি প্রত্যাশিত মোডে স্বয়ংক্রিয়ভাবে খুলতে পারি? উদাহরণস্বরূপ, যদি আমি একটি নতুন বাফার খুলি a-new-buffer.elযা এখনও কোনও ফাইলের সাথে সম্পর্কিত নয়, আমি emacs-lisp-modeডিফল্ট মোডের পরিবর্তে এটি খুলতে চাই ।


2
শুধু কৌতূহলী: ব্যবহারের ক্ষেত্রে কী? আইওডাব্লু, কেন / কখন / কী-প্রসঙ্গে আপনি এটি করতে চান? সাধারণত, যদি তুমি চাও একটি বাফার একটি ফাইল যুক্ত করা এবং তাই থেকে তার মোড কুড়ান auto-mode-alist, আপনি বাফার করা " দর্শন " ফাইল (এবং যে সবকিছু যত্ন নেয়)।
ড্রিউ

5
আমার জন্য সাধারণ ব্যবহারের উদাহরণগুলির উদাহরণগুলি: ক) orgআমি ব্যবহার করার জন্য লিখছি এমন নতুন ফাংশনগুলি পরীক্ষা করার জন্য একটি অস্থায়ী বাফার org-mode; খ) Rকিছু দ্রুত করার জন্য একটি অস্থায়ী বাফার, পরিসংখ্যানগত হেরফেরগুলি; গ) একটি ইমেল রচনা করতে একটি অস্থায়ী পাঠ্য বাফার। প্রতিটি ক্ষেত্রে, আমি দেখার জন্য একটি ফাইল তৈরি করতে চাই না , আমি কেবল একটি থ্রো-অ্যাওয়ে বাফার চাই যা যথাযথ মোডে খোলে।
ড্যান

2
যেমন ফাইল পরিদর্শন কমান্ড C-x C-fনা না " দর্শন করার জন্য একটি ফাইল তৈরি "। এটি একটি মৌলিক ভুল বোঝাবুঝি। তারা কেবল আপনি যা সন্ধান করছেন ঠিক তাই করেন। এটি কেবল তখনই যখন আপনি কোনও ফাইল তৈরি হয়ে যায় বাফারটি সংরক্ষণ করার চেষ্টা করেন । আপনি যদি বাফারটি সংরক্ষণ করার চেষ্টা না করেন তবে কোনও ফাইল তৈরি হয় না। আপনি এখন পর্যন্ত যা বুঝতে পেরেছি তা থেকে আপনি যা চান তা হ'ল "কোনও ফাইল দেখার জন্য" (যার অর্থ সঠিকভাবে সঠিক মোডে একটি বাফার খুলুন)।
ড্রিউ

8
ড্যানের মতো, আমি সমস্ত সময় অস্থায়ী বাফার তৈরি করি যা আমি কোনও আসল ফাইল পাথের সাথে যুক্ত করতে চাই না। একটি বোগাস ফাইলের পাথ পরিদর্শন কাজ করবে তবে একটি ডিরেক্টরি বাছাই করার ক্ষেত্রে (বা বর্তমানটি স্বীকার করে নেওয়ার জন্য) কমপক্ষে অল্প পরিমাণে ঘর্ষণ আছে। আপনার কনফিগারেশনটির উপর নির্ভর করে অন্যান্য পার্শ্ব-প্রতিক্রিয়া থাকতে পারে: স্বতঃ-সংরক্ষণের আচরণ? আইবুফার গোষ্ঠী বা অনুমান প্রকল্প পথ দ্বারা নির্ধারিত? ইডো কনফার্মেশন জিজ্ঞাসা? যেহেতু বাফারগুলির কোনও নাম থাকতে হবে, তাই অস্থায়ী বাফারের জন্য স্বয়ংক্রিয়ভাবে মোডটি সেট করতে নামটি ব্যবহার করা আমার কাছে বোধগম্য।
গ্লুকাস

@ ড্র, হ্যাঁ, এটি উপলব্ধি করে এবং এই প্রশ্নের সহজ উত্তর হতে পারে - আপনি কি উত্তর হিসাবে পোস্ট করতে পারেন, দয়া করে? এটি একটি আপগ্রেডের দাবিদার।
ড্যান

উত্তর:


8

ফাইল পরিদর্শন কমান্ড যেমন ভিজিট করার জন্য C-x C-f কোনও ফাইল তৈরি করে না । তারা যা খুঁজছে তা করে do

এটি কেবল তখনই যখন আপনি কোনও ফাইল তৈরি হয়ে যায় বাফারটি সংরক্ষণ করার চেষ্টা করেন

আপনি যদি বাফারটি সংরক্ষণ করার চেষ্টা না করেন তবে কোনও ফাইল তৈরি হয় না। আপনি এখন পর্যন্ত যা বুঝতে পেরেছি তা থেকে আপনি যা চান তা হ'ল " কোনও ফাইল দেখার জন্য " (যার অর্থ সঠিকভাবে সঠিক মোডে একটি বাফার খুলুন)।


4
আপনার যদি এমন হাইপ্র্যাকটিভ আঙুল থাকে যা আপনি যা চান তা নির্বিশেষে প্রতি 3 সেকেন্ডে নিয়মিতভাবে বর্তমান ফাইলটি সংরক্ষণ করে?
মালাবারবা

1
@ মালবারবা: আসলে, আমার সেই আঙুলটি আছে! ;-) হয়তো আমাদের বেশিরভাগ পুরানো খামারগুলি করেন - জিনিসগুলি সর্বদা ক্র্যাশ হওয়ার সময় একটি অভ্যাসটি ফিরে আসে। তবে যাইহোক, আমি ঠিক তেমনটাই করেছি যা আমি পরামর্শ দিয়েছি: একটি ফেলা-দর্শন করা ফাইল-বাফারে সম্পাদনা করুন। যদি আমার অত্যধিক সংবেদনশীল পেশী স্মৃতিটি সেভাবে চলে যায় এবং সংরক্ষণের চেষ্টা করে, তবে তা হ'ল: না হয় আমি nসংরক্ষণ করি না বা (প্রায়শই) আমি কেবল বাফারটি সংরক্ষণ করি। আর পরে আমি নির্মিত ফাইল ... বা না শিরসঁচালন)।
ড্রিউ

1
@ মালবারবা এটি টেম্প ফাইলগুলির গোলমাল প্রতিরোধ করার জন্য, যেটি আমি মেজর-মোডের নির্দিষ্ট স্ক্র্যাচ বাফারগুলি ব্যবহার করতে শুরু করেছি। যদি স্ক্র্যাচ কোনও ফাইলের যোগ্য হয় তবে আপনি সর্বদা এটি পরে সংরক্ষণ করতে পারেন।
দক্ষ মোদী

1
@kaushalmodi: আপনার মোড-নির্দিষ্ট বাফার বিরুদ্ধে কিছুই নেই, কিন্তু একটি " টেম্প ফাইলের গোলমাল " হিসাবে সহজে একটি হিসাবে পরিষ্কার করা হয় বাফার এর গোলমাল । ;-) এবং একটি মোড-নির্দিষ্ট স্ক্র্যাচ বাফারে হাইপ্র্যাকটিভ আঙুল একই সমস্যাটি উপস্থাপন করে - সম্ভবত এটি একইভাবে উপস্থাপন করে *scratch*: সেই আঙুলটি স্বয়ংক্রিয়ভাবে আঘাত করলে আপনাকে সংরক্ষণ করার অনুরোধ জানানো হবে C-x C-s
ড্র করুন

9

যদি কয়েক বছর ধরে জুড়ির লিঙ্কভের সমাধানটি ব্যবহার করা হয়।

আমি এমন কিছু দিয়ে অস্থায়ী বাফার তৈরি করি C-x b test.org C-j। এর major-modeমাধ্যমে ফাইল এক্সটেনশন দ্বারা নির্ধারিত হয় auto-mode-alist

;; http://thread.gmane.org/gmane.emacs.devel/115520/focus=115794
(setq-default major-mode
              (lambda () (if buffer-file-name
                          (fundamental-mode)
                            (let ((buffer-file-name (buffer-name)))
                          (set-auto-mode)))))

প্রভাবটি পরীক্ষা করার জন্য আপনি চেষ্টা করতে পারেন (prog1 (and (switch-to-buffer "my-new.org") major-mode) (kill-buffer "my-new.org")) => org-mode। একটি পরিষ্কার emacs -qমধ্যে পরীক্ষা ফিরে হবে fundamental-mode


1
খুব চালাক! adviceআমি যে বিকল্পটি ব্যবহার করছিলাম তার চেয়ে এটি আরও পরিপাটি । নিশ্চিত না যে আমি (prog1...)অংশটির জন্য যা করছি তা অনুসরণ করছি তবে (setq-default major-mode ...)অংশটি বেশ সুন্দর।
ড্যান

1
জুড়ির ইম্যাক্স সাইটটি নির্দ্বিধায় চেক করুন । প্রতিযোগিতাটি prog1কেবল দেখায় যে major-modeকোনও বাফারে স্যুইচ করার সময় আপনি প্রত্যাশিতটি পান। setq-defaultঅংশটি মূল্যায়ন করুন এবং পরীক্ষাটি চালান। এটি org-mode ছাড়া setq-defaultএটি ফিরে আসবে fundamental-mode
রসমাস

এটি আমার বাফার-তালিকা-আপডেট-হুকের চেয়ে আরও মার্জিত। ধন্যবাদ!
গ্লুকাস

এটি গ্রহণযোগ্য উত্তর হওয়া উচিত, যেহেতু এটি সত্যই প্রশ্নের জবাব দেয় কারণ আমরা কেন এটি জিজ্ঞাসা করার জন্য ভুল করছি :) বলার অপেক্ষা রাখে না :)
Shlomi

6

@ ড্র এর মন্তব্য এবং @ গ্লুকাসের উত্তর থেকে আসা ধারণাগুলি ব্যবহার করে একটি পরামর্শ ভিত্তিক উপায় খুঁজে বের করলেন যা তারা কারওর পক্ষে দরকারী হলে আমি এখানে রেকর্ড করব।

সংক্ষিপ্ত সংস্করণ: afterবাফারের কোনও যুক্ত ফাইলের নাম আছে কিনা তা অনুসন্ধানের জন্য পরামর্শ ব্যবহার করুন, এটি না থাকলে একটি অস্থায়ীভাবে সেট করুন এবং তারপরে বাকী সমস্ত set-auto-modeযন্ত্রাংশ বিশদটির যত্ন নিতে দিন। কিছুটা পরীক্ষার পরে (বিস্তৃত নয়) মনে হচ্ছে এটি ঠিক ঠিক কাজ করছে।

জন্য ido-switch-bufferএবং ভ্যানিলা switch-to-buffer, পরামর্শ দুটি বিট হতে হবে:

(defadvice ido-switch-buffer (after set-mode activate)
  (unless buffer-file-name
    (let ((buffer-file-name (buffer-name)))
      (set-auto-mode t))))

(defadvice switch-to-buffer (after set-mode activate)
  (unless buffer-file-name
    (let ((buffer-file-name (buffer-name)))
      (set-auto-mode t))))

আমি এই বিকল্পটি সহায়ক find-fileবিন্দুটির উপরে খুঁজে পেয়েছি যা @ ড্র আঁকিয়েছে কারণ আমার আঙ্গুলগুলি আমার মস্তিষ্কের সামনে যেতে পারে: পেশী মেমরিটি প্রায়শই আমাকে সম্পূর্ণরূপে আমার কাছে আসার আগে আমাকে স্যুইচ-টু-বাফার অঞ্চলে নিয়ে যায় যা আমার যা প্রয়োজন find-fileতা করতে পারে। এখন, উভয় বিকল্প উপলব্ধ।

আপডেট: উপরের কোডে ছোট তবে সম্ভাব্য-বিরক্তিকর বাগ: এটি প্রতিবার আপনি যখন স্যুইচ করবেন তখন এটি বাফারে মোড হুকটি আবার চালাবে। নিম্নলিখিতটি /tmpডিরেক্টরিটিকে প্রকৃত ফাইলের নাম দেয় এবং সেই সমস্যাটি এড়িয়ে চলে:

(defadvice ido-switch-buffer (after set-mode activate)
  (unless buffer-file-name
    (setq buffer-file-name (concat "/tmp/" (buffer-name)))
    (set-auto-mode t)))

দেখতে বেশ ভাল, এবং আমার উত্তরটি কয়েকটা পুনরাবৃত্তির উপরে জমে থাকা ক্রাফটটি পরিষ্কার করে। :-) আমি এখানে কেবল পুনরাবৃত্তি করব যে আপনি যদি কোনও কারণে প্রকৃত ফাইল পাথ সেট করতে না চান তবে আপনি একাধিক বার মোড সেট করা থেকে বাঁচতে বাফার-লোকাল ভেরিয়েবলটি ব্যবহার করতে পারেন।
গ্লুকাস

5

set-auto-modeফাংশন একটি বাফার সঙ্গে যুক্ত ফাইল উপর ভিত্তি করে মোড সেট করে। buffer-file-nameমোড সেট করার জন্য এখানে একটি ফাংশন যা অস্থায়ীভাবে বাফারের নাম থেকে সেট করে:

(defun my/set-buffer-mode (buffer &optional again)
  "Set the mode for BUFFER from the name.  
When called repeatedly for the same buffer only set the mode the first
time, unless the optional argument AGAIN is specified.
Does nothing if the buffer is associated with a file."

  (with-current-buffer buffer
    (when again (kill-local-variable 'my/buffer-mode-set))
    (unless (or buffer-file-name 
            (local-variable-p 'my/buffer-mode-set))
      (let ((buffer-file-name (buffer-name)))
        (set-auto-mode t)
        (setq-local my/buffer-mode-set t)))))

পরামর্শ ব্যবহার করে কোনও বাফার নাম পরিবর্তন করা হলে আপনি এটি চালাতে পারেন:

(defadvice rename-buffer (after my/rename-update-mode activate)
  (my/set-buffer-mode (current-buffer) 'again))

নতুন বাফারগুলিকে প্রভাবিত করার জন্য এটি এঁকে দেওয়ার সেরা স্থান সম্পর্কে আমি নিশ্চিত নই। এখানে আমি ব্যবহার করছি buffer-list-update-hookতবে এটি আমাদের প্রয়োজনের চেয়ে বেশি ক্ষেত্রে ডাকা হয়।

(add-hook 'buffer-list-update-hook
      '(lambda ()
         (my/set-buffer-mode (car (buffer-list)))))

উপরোক্ত উত্তরটি কয়েকটি সমস্যা সমাধানের জন্য সংশোধিত হয়েছে। বিশেষত, আমি এটি ব্যবহার করতে ফিরে গিয়েছি buffer-list-update-hookকারণ change-major-mode-hookপ্রত্যাশিত বর্তমান বাফারের সাথে ডাকা হয়নি। রেকর্ডের জন্য এটি সম্ভবত আপনার স্যুইচ-বাফার ফাংশনটিকে পরামর্শ দেওয়ার মতো আরও অর্থবোধ করে যা ড্যান তার উত্তরে দেয়।
গ্লুকাস

3

আপনি যে স্ক্র্যাচ * বাফারটি ব্যবহার করছেন সেটির জন্য একই মেজর মোড থাকা অস্থায়ী বাফার তৈরি করার উদ্দেশ্যে আপনি ব্যবহার করতে পারেন।

এখানে একটি ইমাস এসই উত্তর যা আপনার সমস্যার সমাধান করতে পারে:

আমি কীভাবে দ্রুত একই প্রধান মোডযুক্ত ফাইল এবং একটি স্ক্র্যাচ * বাফারের মধ্যে টগল করতে পারি?

রেফারেন্সড প্রশ্নোত্তর দুটোই আমার দ্বারা পোস্ট করা হয়েছিল। ফাংশনের উত্তর নিম্নলিখিতটি দেয়:

  • আপনি যদি কোনও ফাইলে এক্স মেজর মোডে কাজ করছেন, এই ফাংশনটি কল করা একটি নতুন স্ক্র্যাচ বাফার তৈরি করে যা *scratch-X-mode*যদি ইতিমধ্যে উপস্থিত না থাকে, এবং এই সদ্য নির্মিত বাফারে স্যুইচ করে।
  • যদি *scratch-X-mode*ইতিমধ্যে বিদ্যমান থাকে তবে এটি কেবল that বাফারে স্যুইচ করে।
  • সেই স্ক্র্যাচ বাফার থাকাকালীন আবার এই ফাংশনটি কল করা আপনাকে মূলত যে ফাইল ফাইল বাফারটিতে কাজ করছিলেন সেটিতে ফিরিয়ে আনবে।

0

এখানে কিছু ভাল উত্তর আছে তবে আমি আরও একটি জিনিস যুক্ত করতে চেয়েছিলাম। ইমাসের বৈশিষ্ট্য একটি টন রয়েছে এবং প্রায়শই কিছু করার বিভিন্ন উপায় রয়েছে। আপনি কোনও ফাইলের শীর্ষে ট্যাগগুলি যুক্ত করতে পারেন যা কোনও ইমট্যাকশন নির্বিশেষে ইম্যাকগুলি কী টাইপ করে তা জানায়। উদাহরণস্বরূপ এটি যোগ করুন:

# -*-Python-*-

কোনও ফাইলের শীর্ষে ইমাসকে জানাতে হবে এটি .pyএক্সটেনশান ছাড়াই এটি একটি পাইথন ফাইল । লক্ষ করুন যে #লাইনের শুরুতে একটি পাইথন শৈলীর মন্তব্য। বিভিন্ন ফাইলের জন্য আপনি বিভিন্ন মন্তব্য ব্যবহার করতে পারেন। উদাহরণস্বরূপ, একটি লিস্প ফাইল নির্দিষ্ট করার জন্য আপনি ;কোনও মন্তব্য লাইন শুরু করতে এবং ইমাকে এমড করে মোডটি সেট করতে ব্যবহার করেন:

; -*- mode: Lisp;-*-

ফাইলের ভেরিয়েবলগুলি নির্দিষ্ট করা এবং ফাইল মোড নির্বাচন করা দেখুন ।


হ্যাঁ, কিন্তু প্রশ্ন এখানে বিশেষভাবে সম্বন্ধে একটা নতুন অস্থায়ী বাফার তৈরি করছে (যেমন সঙ্গে switch-buffer) এবং মোড স্বয়ংক্রিয়রূপে ব্যতীত অন্য কিছু সেট থাকার fundamental-mode
গ্লুকাস 21
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.