ইন্ডেন্টেশন করে নেভিগেট করুন


15

আমি ইনডেন্টেশনের উপর ভিত্তি করে কোনও ফাইলের লাইনের মধ্যে নেভিগেট করতে চাই। ফাইলটি ইনডেন্টেশন দ্বারা কাঠামোযুক্ত: একটি লাইনের সাথে পূর্ববর্তী লাইনের চেয়ে বেশি ইনডেন্ট করা পূর্ববর্তী লাইনের সন্তানের, একটি লাইনের সাথে পূর্ববর্তী লাইনের মতো একই ইনডেন্টেশন রয়েছে এটি তার ভাইবোন। আমি প্রায়শই তিনটি কমান্ড খুঁজছি:

  • পরের ভাইবোন, অর্থাৎ একই ইনডেন্টেশন সহ পরবর্তী লাইনটি সরান, লাইনগুলি আরও বেশি ইন্ডেন্টেড এড়িয়ে যাওয়া, তবে কম ইন্ডেন্টেড লাইনটি বাদ দেওয়া নয়।
  • পূর্ববর্তী ভাইবালায় চলে যান, অর্থাৎ অন্য দিকের একই জিনিস।
  • প্যারেন্টে যান, অর্থাত্ কম ইনডেন্টেশন সহ পূর্ববর্তী লাইনে যান।

পয়েন্টের কলামের অবস্থান পরিবর্তন করা উচিত নয়।

এগুলি হ'ল ইনডেন্টেশন-কাঠামোগত ডেটার জন্য forward-sexp, backward-sexpএবং backward-up-listসেক্সপ-কাঠামোগত ডেটার জন্য অ্যানালগ। ইন্ডেন্টেশন হ্যাস্কেল এবং পাইথনের মতো ভাষায় প্রোগ্রাম কাঠামোর সাথে সমান; এই ফাংশনগুলি এই প্রসঙ্গে বিশেষভাবে কার্যকর হতে পারে তবে আমি মোড-নির্দিষ্ট কোনও কিছুর সন্ধান করছি না (আমার প্রাথমিক ব্যবহারের ক্ষেত্রে অন্য ফাইল ফর্ম্যাটের অভ্যন্তরীণ-কাঠামোগত ডেটা)।

রঙিন ইন্ডেন্টেশন স্তরের সাহায্যে ম্যানুয়ালি নেভিগেট করতে সহায়তা করতে পারে Up/ Downতবে আমি কিছু স্বয়ংক্রিয় চাই।

এই দুর্দান্ত ব্যবহারকারীর প্রশ্নটি একই তবে দুর্বল প্রয়োজনীয়তার সাথে এবং বর্তমানে আমার প্রয়োজনীয়তা মেটাতে এমন উত্তর নেই।


আপনার set-selective-displayযা প্রয়োজন তার কাছাকাছি পৌঁছে দেবেন?
कौशल মোদী

1
@ কাউশালমোদি এটি দরকারী, এবং আমি এ সম্পর্কে জানতাম না, তাই আপনাকে ধন্যবাদ, তবে আমার যা প্রয়োজন তা সবসময় হয় না। ঠিক এখনই, আমি সরানো এবং আমি যে লাইনের উপর দিয়ে যাচ্ছিলাম তাদের বাচ্চাদের দেখতে চেয়েছিলাম।
গিলস 'অশুভ হওয়া বন্ধ করুন'

এই প্রশ্ন জিজ্ঞাসা করার জন্য ধন্যবাদ; আমি মূলত একই প্রশ্নটি কম কমই জিজ্ঞাসা করতে যাচ্ছিলাম। আমার কেবলমাত্র অতিরিক্ত জিনিসটি হ'ল "শেষ ভাইবলে চলে যাওয়া" অর্থাত্ শেষ লাইনটিতে একই ইন্ডেন্টেশন রয়েছে, লাইনগুলি কম এন্ডেডেড বাদ দেওয়া নয়। (কোনও কিছুই না পাওয়া পর্যন্ত "পরবর্তী ভাইবোন" তে পুনরাবৃত্তি করার সমতুল্য।)
শ্রীভাতসার

আমি কেবল indent-toolsমেলপা ( ইনডেন্ট-সরঞ্জাম ) এর প্যাকেজটি লক্ষ্য করেছি , যা সম্ভবত এই উদ্দেশ্যে কাজ করে। প্রথম প্রতিশ্রুতি ছিল এই প্রশ্নটি জিজ্ঞাসা করার প্রায় 3 মাস পরে 2016-মে -16 এ on
শ্রীভাতসারআর

উত্তর:


4

বর্তমানে উপলব্ধ চারটি উত্তর ( সুপার ব্যবহারকারীর দুটি এবং এই প্রশ্নে দুটি) পরীক্ষা করে দেখুন, আমি নিম্নলিখিত বিষয়গুলি দেখছি:

  • স্টিফান এবং পেং বাই দ্বারা বেশী superuser উপর (লাইন বাই লাইন চলন্ত বর্তমান খাঁজ দিকে তাকিয়ে আছে,), বর্তমান কলাম অবস্থান ধারনকারী এবং পিতা বা মাতা পর্যন্ত চলন্ত বাস্তবায়ন না
  • Dan দ্বারা উত্তর (পুনরায়-সন্ধান এগিয়ে ব্যবহার করে একই খাঁজ সঙ্গে পরের লাইনে এটি) কম খাঁজ সঙ্গে লাইন ধরে অগ্রাহ্য যখন কোন পরবর্তী সহোদর এটা জানে না, এবং সেইজন্য কিছু স্থানান্তর করতে পারেন যে একটি সহোদর নয় তবে অন্য পিতামাতার একটি সন্তান ... সম্ভবত পরবর্তী "কাজিন"।
  • গিলেজ দ্বারা উত্তর (রূপরেখা-মোড ব্যবহার করে) কলাম অবস্থান অক্ষুণ্ন রাখতে না এবং এটা শূন্য খাঁজ ( "টপ লেভেল" লাইন) সঙ্গে লাইনের কাজ করে না। এছাড়াও, এর কোডটি দেখে outline.el, এটিও মূলত outline-next-visible-headingআমাদের ক্ষেত্রে যেভাবেই লাইন-বাই-লাইনে চলছে (ব্যবহার করা হচ্ছে ), (প্রায়) সমস্ত লাইনই রূপরেখার সাথে মিলবে এবং "শিরোনাম" হিসাবে গণনা করবে।

সুতরাং, প্রত্যেকটির কয়েকটি ধারণাকে একসাথে রাখলে আমার কাছে নিম্নলিখিতগুলি রয়েছে: খালি এবং আরও ইনডেন্টেড রেখাগুলি ছাড়িয়ে লাইন-লাইন এগিয়ে যান move আপনি যদি সমান ইন্ডেন্টেশন এ থাকেন তবে এটি পরবর্তী ভাইবোন। প্রাথমিক ধারণাটি এরকম দেখাচ্ছে:

(defun indentation-get-next-sibling-line ()
  "The line number of the next sibling, or nil if there isn't any."
  (let ((wanted-indentation (current-indentation)))
    (save-excursion
      (while (and (zerop (forward-line))  ; forward-line returns 0 on success
               (or (eolp)  ; Skip past blank lines and more-indented lines
                 (> (current-indentation) wanted-indentation))))
      ;; Now we can't go further. Which case is it?
      (if (and (not (eobp)) (= (current-indentation) wanted-indentation))
        (line-number-at-pos)
        nil))))

(defun indentation-forward-to-next-sibling ()
  (interactive)
  (let ((saved-column (current-column)))
    (forward-line (- (indentation-get-next-sibling-line) (line-number-at-pos)))
    (move-to-column saved-column)))

যথাযথভাবে সাধারণীকরণ করা (সামনের / পিছিয়ে / উপরে / নিচে), আমি যা ব্যবহার করছি তা বর্তমানে নীচের মত দেখাচ্ছে:

(defun indentation-get-next-good-line (direction skip good)
  "Moving in direction `direction', and skipping over blank lines and lines that
satisfy relation `skip' between their indentation and the original indentation,
finds the first line whose indentation satisfies predicate `good'."
  (let ((starting-indentation (current-indentation))
         (lines-moved direction))
    (save-excursion
      (while (and (zerop (forward-line direction))
               (or (eolp)  ; Skip past blank lines and other skip lines
                 (funcall skip (current-indentation) starting-indentation)))
        (setq lines-moved (+ lines-moved direction)))
      ;; Now we can't go further. Which case is it?
      (if (and
            (not (eobp))
            (not (bobp))
            (funcall good (current-indentation) starting-indentation))
        lines-moved
        nil))))

(defun indentation-get-next-sibling-line ()
  "The line number of the next sibling, if any."
  (indentation-get-next-good-line 1 '> '=))

(defun indentation-get-previous-sibling-line ()
  "The line number of the previous sibling, if any"
  (indentation-get-next-good-line -1 '> '=))

(defun indentation-get-parent-line ()
  "The line number of the parent, if any."
  (indentation-get-next-good-line -1 '>= '<))

(defun indentation-get-child-line ()
  "The line number of the first child, if any."
  (indentation-get-next-good-line +1 'ignore '>))


(defun indentation-move-to-line (func preserve-column name)
  "Move the number of lines given by func. If not possible, use `name' to say so."
  (let ((saved-column (current-column))
          (lines-to-move-by (funcall func)))
    (if lines-to-move-by
      (progn
        (forward-line lines-to-move-by)
        (move-to-column (if preserve-column
                          saved-column
                          (current-indentation))))
      (message "No %s to move to." name))))

(defun indentation-forward-to-next-sibling ()
  "Move to the next sibling if any, retaining column position."
  (interactive "@")
  (indentation-move-to-line 'indentation-get-next-sibling-line t "next sibling"))

(defun indentation-backward-to-previous-sibling ()
  "Move to the previous sibling if any, retaining column position."
  (interactive "@")
  (indentation-move-to-line 'indentation-get-previous-sibling-line t "previous sibling"))

(defun indentation-up-to-parent ()
  "Move to the parent line if any."
  (interactive "@")
  (indentation-move-to-line 'indentation-get-parent-line nil "parent"))

(defun indentation-down-to-child ()
  "Move to the first child line if any."
  (interactive "@")
  (indentation-move-to-line 'indentation-get-child-line nil "child"))

আরও কিছু কার্যকারিতা এখনও আকাঙ্ক্ষিত রয়েছে, এবং এর outline.elকয়েকটি দেখে এবং এর পুনরায় প্রয়োগ করা সাহায্য করতে পারে তবে আমার উদ্দেশ্যে এখনই আমি এতে সন্তুষ্ট।


@ গিলস: সম্পাদনার জন্য ধন্যবাদ! দেখে মনে হচ্ছে (current-line)এমন কিছু ছিল যা থেকে misc-fns.elআমি আমার oneonone.elলাইব্রেরির অংশ হিসাবে আমার অ্যাকাম্যাক্স ইনস্টলেশনতে পেয়েছি ।
শ্রীভাতসারআর

6

এই বৈশিষ্ট্যটি ইম্যাক্সে বিদ্যমান। আউটলাইন মোড একটি নথিকে একটি স্তরের সাথে শিরোনাম লাইন হিসাবে বর্ণনা করে এবং স্তরগুলির মধ্যে স্থানান্তরিত করার সুবিধা রয়েছে has আমরা প্রতিটি রেখাকে একটি স্তরযুক্ত শিরোনামরেখা হিসাবে সংজ্ঞায়িত করতে পারি যা এর ইন্ডেন্টেশন প্রতিফলিত করে: ইনডেন্টেশনটিতে সেট outline-regexpকরুন। আরো সঠিকভাবে, খাঁজ প্লাস প্রথম অ হোয়াইটস্পেস অক্ষর (এবং ফাইল শুরুতে সর্বোচ্চে স্তর): \`\|\s-+\S-

M-x load-libray outline RET
M-: (make-local-variable 'outline-regexp) RET
M-: (setq outline-regexp "\\`\\|\\s-+\\S-") RET
M-x outline-minor-mode RET

ইমাস 22.1-24.3 এ আপনি এটিকে সহজ করতে পারেন:

M-x load-libray outline RET
M-1 M-x set-variable RET outline-regexp RET "\\`\\|\\s-+\\S-" RET
M-x outline-minor-mode RET

তারপরে আপনি আউটলাইন মোশন কমান্ডগুলি ব্যবহার করতে পারেন :

  • C-C @ C-f( outline-forward-same-level) পরবর্তী ভাইবোন যেতে;
  • C-C @ C-b( outline-backward-same-level) পূর্ববর্তী ভাইবোনে যেতে;
  • C-C @ C-u( outline-up-heading) পিতামাতার কাছে যেতে।

একটি ট্যাব এবং একটি স্পেস গণনা একই পরিমাণ ইনডেন্টেশনের জন্য। আপনার যদি ট্যাব এবং স্পেসগুলির মিশ্রণ থাকে তবে যথাযথভাবে সেট করুন tab-widthএবং কল করুনuntabify

যদি বর্তমান মেজর মোডের বাহ্যরেখা সেটিংস থাকে তবে তারা বিরোধ করতে পারে। এই ক্ষেত্রে, আপনি অনেকগুলি একাধিক বড় মোডের সমাধানগুলির মধ্যে একটি ব্যবহার করতে পারেন , অপ্রত্যক্ষ বাফার তৈরি করে আউটলাইন মেজর মোডে সেট করা সবচেয়ে সহজ । আউটলাইন মেজর মোডে, ডিফল্ট কীবোর্ড শর্টকাটগুলি টাইপ করা সহজ: C-c C-fইত্যাদি are


এটি দেখে মনে হচ্ছে এটি কাজ করা উচিত তবে আসলে কোনও কারণে আমার পক্ষে কাজ করে না। M-x make-local-variable RET outline-regexp RETএই পরিবর্তনশীলটি গ্রহণ করে না, এবং কেবল `[কোনও মিল নেই] says বলে` আমি আরও যত্ন সহকারে এটি তাকান এখনও।
শ্রীভাতসারআর

@ শ্রীভাতসার আর এটি ইম্যাক্স ২৪.৪-এ একটি বেমানান পরিবর্তন: outline-regexpআর কোনও সংজ্ঞা নয় এবং এত সহজে ইন্টারেক্টিভভাবে সেট করা যায় না।
গিলস 'অশুভ হওয়া বন্ধ করুন'

খুব সুন্দর, ধন্যবাদ. দুটি ছোটখাটো সমস্যা রয়েছে: (১) আপনি যদি শীর্ষ স্তরে থাকেন (কোন প্রান্ত ছাড়াই রেখা, যার অর্থ আমি অনুমান করি যে রূপরেখা-রেজিএক্সএক্সের সাথে কোনও মিল নেই) তবে না সামনের দিকে এবং পিছিয়ে কাজ করবে না এবং কোনও কারণে এটি দুটি উপরে চলে গেছে লাইনগুলি (২) যখন এটি পরবর্তী বা পূর্ববর্তী ভাইবোনগুলিতে যায়, এটি লাইনের শুরুতে (কলাম 0) যায় তবে কলামটি ধরে রাখা ভাল লাগবে। (আপনি যেমন প্রশ্নে নির্দিষ্ট করেছেন)) আমি অনুমান করি যে এটি উভয়ই আউটলাইন মোডের সীমাবদ্ধতা হতে পারে।
শ্রীভাতসারআর

5

নিম্নলিখিত তিনটি কমান্ড, সর্বনিম্ন পরীক্ষা করা হয়েছে, ইন্ডেন্টেড লাইন দ্বারা বেসিক নেভিগেশনের অনুমতি দেওয়া উচিত। কোড পুনরাবৃত্তি জন্য ক্ষমা।

(defun ind-forward-sibling ()
  "Move forward to the next sibling line with the same indentation."
  (interactive)
  (save-match-data
    (let ((col (current-column))
          (pad (progn
                 (back-to-indentation)
                 (current-column))))
      (end-of-line 1)
      (re-search-forward (concat "^\\s-\\{"
                                 (number-to-string pad)
                                 "\\}[^ ]") nil t)
      (move-to-column col))))

(defun ind-backward-sibling ()
  "Move backward to the next sibling line with the same indentation."
  (interactive)
  (save-match-data
    (let ((col (current-column))
          (pad (progn
                 (back-to-indentation)
                 (current-column))))
      (beginning-of-line 1)
      (re-search-backward (concat "^\\s-\\{"
                                 (number-to-string pad)
                                 "\\}[^ ]") nil t)
      (move-to-column col))))

(defun ind-up-parent ()
  "Move up to parent line with less indentation."
  (interactive)
  (save-match-data
    (let ((col (current-column))
          (pad (progn
                 (back-to-indentation)
                 (current-column))))
      (when (> pad 0)
        (beginning-of-line 1)
        (re-search-backward (concat "^\\s-\\{0,"
                                    (number-to-string (1- pad))
                                    "\\}[^ ]") nil t))
      (move-to-column col))))

এটি ভাল (স্থির হওয়ার পরে - 1 টি বিয়োগের সাথে আপনি কী করার চেষ্টা করছেন তা আমি বুঝতে পারি না (current-column)তবে এটি কার্সারটি সরিয়ে না দেয়), তবে আমার অনুমানের সাথে পুরোপুরি মিলিত হয় না: ইন্ডেন্টেশন স্তরে সরে যাওয়ার চেয়ে কম- ইনডেন্টড লাইন
গিলস 'খারাপ হয়ে যাওয়া বন্ধ করুন'

এটি কাজ করে না। উদাহরণস্বরূপ ind-forward-sibling, একই ইন্ডেন্টেশন সহ পরবর্তী লাইনের সন্ধান করে, সুতরাং এটি কম ইনডেন্টেশন সহ রেখাগুলি এড়িয়ে যায় (কোনও পূর্ববর্তী ভাইবোন না থাকলেও এটি এগিয়ে যায়)।
শ্রীভাতসারআর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.