সহায়তা থেকে ইমাকস উত্স কোড ব্রাউজ করার সময় কীভাবে কেবলমাত্র দর্শন মোডে প্রবেশ করবেন?


10

আমি যখন এর মাধ্যমে ফাংশনগুলির জন্য ইমাক্স সহায়তা ব্রাউজ করি তখন আমি C-h fপ্রায়শই এলিস্প / সি বাস্তবায়নের দিকে তাকাতে চাই। view-modeঅপ্রয়োজনীয় পরিবর্তন এড়াতে যখন আমি এই পদ্ধতিতে সোর্স কোড অ্যাক্সেস করি তখন আমি স্বয়ংক্রিয়ভাবে প্রবেশ করতে চাই । এটি সম্পাদন করার জন্য আমি পরামর্শ দিতে পারি এমন কোনও হুক বা ফাংশন রয়েছে কি?


2
আমার যে কোনও ফাইল খোলার ক্ষেত্রে দুর্ঘটনাজনিত পরিবর্তন রোধ করতে আমি যা ব্যবহার করি তা এখানে রয়েছে emacs-lisp-modeএবং C-x C-qযদি আমি উত্স কোডটি সম্পাদনা করতে চাই তবে আমি তা করি। (defun set-buffer-read-only () (setq buffer-read-only t)) (add-hook 'emacs-lisp-mode-hook 'set-buffer-read-only)
আইনজীবি

উত্তর:


2

আপডেট (রাতে ঘুমের পরে): এই উত্তরের একটি বড় ত্রুটি রয়েছে: এটি কেবল ইমাস সূত্র নয়, কোনও ফাংশনে view-modeনেভিগেট করার সময় সক্ষম করে। এটি স্থির করা যেতে পারে তবে আপনি @ ফিল্ম দ্বারা উত্তরটি ব্যবহার করা ভাল ।

এমনটি করে C-h f describe-function RETএবং তারপর সোর্স কোড পড়া describe-functionআমি আবিষ্কার করেছি যে এটা ফাংশন সংজ্ঞায় বেশ লিঙ্কের জন্য একটি বিশেষ ধরনের একটি "বোতাম" তৈরি করে: help-function-def

zrgrepএই স্ট্রিং দিয়ে চালানো (" help-function-def") আমাকে ইঙ্গিত করেছে help-mode.el.gz

এই সমস্ত খনন করার পরেও আমরা এই বোতামের প্রকারটি আমাদের নিজের সাথে প্রতিস্থাপন করতে পারি (কোডটিতে মন্তব্যটি নোট করুন):

(define-button-type 'help-function-def
  :supertype 'help-xref
  'help-function (lambda (fun file)
               (require 'find-func)
               (when (eq file 'C-source)
                 (setq file
                       (help-C-file-name (indirect-function fun) 'fun)))
               ;; Don't use find-function-noselect because it follows
               ;; aliases (which fails for built-in functions).
               (let ((location
                      (find-function-search-for-symbol fun nil file)))
                 (pop-to-buffer (car location))
                 (if (cdr location)
                     (goto-char (cdr location))
                   (message "Unable to find location in file")))
                   (view-mode t)) ; <= new line: enable view-mode
  'help-echo (purecopy "mouse-2, RET: find function's definition"))

আমি যতদূর বলতে পারি এখানে পরামর্শ যুক্ত করার জন্য কোনও ফাংশন নেই: ইমাকস lambdaএখানে একটি ব্যবহার করে । অন্যদিকে ( @rationalrevolt দ্বারা চিহ্নিত হিসাবে ) কেউ বোতামের ধরণের help-functionসম্পত্তি প্রতিস্থাপন করতে পারে help-function-def:

(require 'help-mode)
(let ((help-func (button-type-get 'help-function-def 'help-function)))
  (button-type-put 'help-function-def 'help-function
                   `(lambda (func file)
                      (funcall ,help-func func file) (view-mode t))))

1
আমি মনে করি যে আমি লাম্বদাটি ব্যবহার করতে button-type-getএবং button-type-putআমার নিজের সাথে ল্যাম্বদাটি প্রতিস্থাপনের চেষ্টা করতে পারি যা বিদ্যমান ল্যাম্বডায় এগিয়ে যায়।
যুক্তিসঙ্গত

@ ইরানালারিভোল্ট: ভাল ধারণা! (কিছুটা নাজুক মনে হচ্ছে, তবে আমি মনে করি এটিও ভঙ্গুর)
কনস্টান্টাইন

@ ইরানালারিভোল্ট: দয়া করে আপডেট হওয়া উত্তরটি দেখুন। (মন্তব্যে নতুন লাইন থাকতে পারে না, মনে হচ্ছে ...)
কনস্টান্টাইন

ধন্যবাদ! আমি অনুরূপ কিছু চেষ্টা করছিলাম কিন্তু এলিস্পের নবজাতক হওয়ার কারণে ডাইনামিক বাইন্ডিংয়ের দ্বারা আমাকে কামড়ে ধরেছে এবং আমার কাজ বন্ধ করতে পারছে না :)
যুক্তিসঙ্গত

16

ইমা্যাক্সের উত্স ফাইলগুলি কেবলমাত্র ডিফল্টরূপে পঠনযোগ্য করতে আপনি ডিরেক্টরি-স্থানীয় ভেরিয়েবলগুলি ব্যবহার করতে পারেন । (আরও দেখুন C-hig (emacs) Directory Variables RET)

.dir-locals.elনীচের বিষয়বস্তু সহ আপনি যে ডিরেক্টরি ডিরেক্টরী ট্রিটি সুরক্ষিত করতে চান তার মূলে একটি ফাইল তৈরি করুন :

((nil . ((eval . (view-mode 1)))))

সম্পাদনা: মাইখা পলিটোভস্কি মন্তব্যগুলিতে উল্লেখ করেছেন যে এইভাবে সক্ষম view-modeকরা সমস্যাযুক্ত কারণ আপনি যখন qএটি দিয়ে বাফারটি বরখাস্ত করেন তখন মোডটি অক্ষম করে দেয়, এর অর্থাত পরবর্তী সময় আপনি যখন এই বাফারটি পরিদর্শন view-modeকরবেন তখন সক্ষম হবে না।

সম্পাদনা 2: কনস্ট্যান্টাইন নীচের মন্তব্যে সেই সমস্যার সমাধান দিয়েছে:

((nil . ((eval . (when buffer-file-name (view-mode-enter nil #'kill-buffer))))))

এটি বাফারটি ইতিমধ্যে একটি ফাইল পরিদর্শন করেছে কিনা তা নিশ্চিত করার জন্য এটি কার্যকরভাবে একটি পরীক্ষা যুক্ত করে তবে মূল পরিবর্তনটি view-mode-enterপরিবর্তে এর ব্যবহার হ'ল view-modeপ্রাক্তন একটি EXIT-ACTIONযুক্তি গ্রহণ করে যা qটাইপ করার সময় কী করা উচিত তা নির্ধারণ করে । এই ক্ষেত্রে প্রস্থান ক্রিয়াটি বাফারটিকে হত্যা করা হয়, পরবর্তী সময় ফাইলটি পরিদর্শন করার পরে এটি আবার শেষ হবে তা নিশ্চিত করে view-mode

3 সম্পাদনা করুন: সেই পথ অনুসরণ করে, আমরা আরও দেখতে পারি যে নির্দিষ্টটি EXIT-ACTIONশেষ পর্যন্ত view-mode-exitফাংশনে প্রেরণ করা হয় এবং এর ডক্টরসিং আমাদের একটি বিকল্প সমাধান দেয়:

view-no-disable-on-exit is a variable defined in `view.el'.
Its value is nil

Documentation:
If non-nil, View mode "exit" commands don't actually disable View mode.
Instead, these commands just switch buffers or windows.
This is set in certain buffers by specialized features such as help commands
that use View mode automatically.

সুতরাং আমরা নিম্নলিখিত ব্যবহার করতে পারেন:

((nil . ((eval . (when buffer-file-name
                   (setq-local view-no-disable-on-exit t)
                   (view-mode-enter))))))

আমি বিকল্প পদ্ধতির ব্যবহার করি যা আপনি আপনার init ফাইলটিতে সম্পূর্ণরূপে নির্দিষ্ট করতে পারেন (কোনও .dir-locals.elফাইল তৈরির বিপরীতে ) এবং আমি কেবল ফাইলগুলি কেবল ব্যবহারের পরিবর্তে পঠনযোগ্য করে তুলি view-mode। আমার কনফিগারেশনটি দেখতে এমন দেখাচ্ছে:

;; Emacs
(dir-locals-set-class-variables
 'emacs
 '((nil . ((buffer-read-only . t)
           (show-trailing-whitespace . nil)
           (tab-width . 8)
           (eval . (whitespace-mode -1))))))

(dir-locals-set-directory-class "/usr/local/src/emacs" 'emacs)
(dir-locals-set-directory-class "/usr/local/share/emacs" 'emacs)
(dir-locals-set-directory-class "/usr/share/emacs" 'emacs)

স্পষ্টতই আপনি আপনার এলপা ডিরেক্টরি এবং অন্য কোনও ডিরেক্টরিতে তৃতীয় পক্ষের উত্স কোড সহ একই কাজ করতে পারেন।


গ্রেট! আমি যা সামনে এসেছি তার থেকে এটি পরিষ্কারভাবে ভাল। (আমি কী ভাবছিলাম? আমি .dir-locals.elনিজের সম্পর্কে জানি এবং ব্যবহার করি ...)
কনস্টান্টাইন

আমি একটি find-file-hookএবং read-only-dirsতালিকার উপর ভিত্তি করে একই লাইন বরাবর কিছু ছিল , কিন্তু আমি এই পদ্ধতির পছন্দ করি।
গ্লুকাস

এটি দেখতে খুব পরিষ্কার পদ্ধতির মতো। যদিও আমার একটি ছোটখাটো সমস্যা আছে। সঙ্গে ((nil . ((eval . (view-mode 1)))))কি সহজ উপায় করা হয় View-quitবাফার সাহায্যের মাধ্যমে অ্যাক্সেস মারব? অন্যথায় টিপে সোর্স ভিউটি থেকে বেরিয়ে আসার পরে q, বাফার পিছনে থাকে এবং পরে একই ফাইল থেকে উত্স অ্যাক্সেস করার পরে আবার ভিউ-মোড শুরু হয় না।
মিশা পলিটোভস্কি

মিচা পলিটোভস্কি: ঠিক আছে তুমি। আমি এই সত্যটি অন্তর্ভুক্ত করার জন্য উত্তর আপডেট করেছি, তবে আমার কোনও কার্যকারিতা নেই। কনস্ট্যান্টাইন এর (সম্পাদিত) উত্তর ব্যবহারের জন্য সেরা সমাধান হতে পারে view-mode
ফিল্ডস

1
আজ আমি বুঝতে পেরেছি যে @ মিচা-পোলিটোভস্কি দ্বারা চিহ্নিত ইস্যুটির জন্য আমার একটি কার্যকারিতা প্রয়োজন --- এবং আমি একটিটি পেয়েছি: ব্যবহার করুন ((nil . ((eval . (when buffer-file-name (view-mode-enter nil #'kill-buffer))))))( (view-mode-enter ...)পরিবর্তে নোট করুন (view-mode 1))। এইভাবে টিপলে qবাফারকে মেরে ফেলা হয় এবং পরের বার আমি একই ফাইলটি দেখার view-mode জন্য সক্ষম করা হয়।
কনস্টান্টাইন

0

আমি মনে করি আপনার যা দরকার তা হুক যুক্ত করা :

(add-hook 'find-function-after-hook 'view-mode)

এটি আমার মনস্ট্রোসিটির চেয়ে ভাল তবে এখনও প্রশ্নের সাথে মেলে না: কেবল ইমাক্স উত্স নয়, কোনও ফাংশনে view-modeনেভিগেট করার সময় এটি চালু হয় । C-h f
কনস্টান্টাইন

পরীক্ষামূলকভাবে, সহায়তা লিঙ্কগুলি আসলে এই হুকটি চালায় না। দেখে মনে হচ্ছে কেবল ইন্টারেক্টিভ find-THINGকমান্ডগুলি এই হুকটি ব্যবহার করে এবং সহায়তা বোতামগুলি এটিকে বাইপাস করে।
ফিল্ডস

0

এটি আপনার নির্দিষ্ট কেসটিকে সম্বোধন করে না, তবে view-modeযখনই আপনি কোনও সহায়তা বাফার থেকে উত্স ফাইলটিতে যান তখন স্যুইচ করার আরও সাধারণ ক্ষেত্রে । আমি এটি @ কনস্ট্যান্টাইনের উত্তরের বিকল্প হিসাবে প্রস্তাব দিচ্ছি, কারণ এটি কোনও মন্তব্য হিসাবে পাঠযোগ্য ছিল না।

আমি দেখে মনে হচ্ছে যে আমি এটি ইমাসউইকি থেকে পেয়েছি ।

(defadvice find-function-search-for-symbol (after view-function-source last (symbol type library) activate)
  "When visiting function source via Help, switch to view-mode"
  (with-current-buffer (car ad-return-value)
    (view-mode 1)))

(defadvice find-variable-noselect (after view-var-source last (variable &optional file) activate)
  "When visiting variable source via Help, switch to view-mode"
  (with-current-buffer (car ad-return-value)
    (view-mode 1)))

0

এখানে একটি সমাধান যা অন্তর্নির্মিত ডকুমেন্টেশনের জন্য কাজ করে এবং একটি উদাহরণ কীভাবে এটি ELPA এ প্রসারিত করা যায় তা দেখায়। এটি কিছু রিজেক্সের বিরুদ্ধে বর্তমান ফাইলের সাথে পাথটি মিলিয়ে এবং সেগুলির কোনওটির সাথে read-only-modeমেলে যদি প্রয়োগ করে কাজ করে।

মনে রাখবেন যে বাফারটি diredকেবলমাত্র সাহায্যের মাধ্যমে নয়, যদি আপনি এটির মাধ্যমেও যান তবে কেবলমাত্র-পড়ার জন্য আইফিডে রয়েছে ।

আমি একটি হুক যুক্ত করেছি emacs-lisp-modeযা ফাইলের পাথটি মেলে কিনা তা পরীক্ষা করে runsোকার পরে চলে /\.el\.gz$/এবং তা যদি হয় তবে কেবল পঠন মোড প্রয়োগ করে।

(defun readonly-if-el-gz ()
  (cond
   ((string-match "\\.el\\.gz\\'" (or (buffer-file-name) ""))
    (read-only-mode +1))))

(add-hook 'emacs-lisp-mode-hook 'readonly-if-el-gz)

এখানে একটি উদাহরণ রয়েছে যা ইএলপিএও পরীক্ষা করে, এমন কোনও হাইওরিস্টিক ব্যবহার করে যে কোনও .emacs.d/elpaপাথই আসলে ইএলপিএ কোড।

(defun readonly-if-internal ()
  (let
      ((name (or (buffer-file-name) "")))
    (cond
     ((string-match "\\.el\\.gz\\'" name) (read-only-mode +1))
     ((string-match "\\.emacs\\.d/elpa" name) (read-only-mode +1)))))

(add-hook 'emacs-lisp-mode-hook 'readonly-if-internal)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.