ইমাসে লাইন / অঞ্চলটিকে উপরে এবং নীচে সরান


85

নির্বাচিত অঞ্চল বা রেখাটি (যদি কোনও নির্বাচন না থাকে) ইমাসে উপরে বা নীচে সরানোর সহজতম উপায় কী? আমি গ্রহণের মতো একই কার্যকারিতাটি খুঁজছি (এম-আপকে আবদ্ধ, এম-ডাউন)।


4
আমি নিশ্চিত যে আইডিয়মটি আপনি যেদিকে যেতে চান তা কেবল মেরে ফেলতে হবে, আপনি যে কোডটি দেখতে চান সেই বিন্দুটি সরানোর জন্য স্বাভাবিক নেভিগেশন ফাংশনগুলি (আইকন ইত্যাদি সহ) ব্যবহার করুন এবং তারপরে ইয়ঙ্ক করুন। এখানে হত্যার একটি স্ট্যাক রয়েছে, মনে রাখবেন, যাতে আপনাকে অবিলম্বে লোকেশনটি খুঁজে পেতে হবে না; আপনি পরে ইয়াঙ্কে অন্যান্য বিট সংগ্রহ করতে পারেন। ব্যক্তিগতভাবে, ভারী ইম্যাক্স ব্যবহারকারী হিসাবে, আমি এমন কোনও পরিস্থিতি কল্পনা করতে পারি না যেখানে আমি ম্যানুয়ালি একটি লাইন উপরে বা নীচে সরিয়ে নিয়েছি। এটি কেবল কার্যকর হবে না।
jrockway

7
@ জারকওয়ে: আপনার মন্তব্যের জন্য ধন্যবাদ আমি মনে করি প্রত্যেকের নিজস্ব কাজ করার পদ্ধতি রয়েছে। আমি গ্রহণের সাথে অনেক কাজ করি এবং আমি সরানো রেখা / অঞ্চলগুলিতে খুব অভ্যস্ত। ইম্যাক্সকে খুব এক্সটেনসিবল রাখার দুর্দান্ত জিনিসগুলির মধ্যে একটি হ'ল এই কার্যকারিতাটি সহজেই যুক্ত করা যায়।
ফিকোভনিক 24

4
একমত আপনার বর্ণনার সাথে সাথে আমি প্রায়শই লাইনগুলি উপরে এবং নীচে সরিয়ে নিতে চাই, আমি যে সম্পাদক এটিকে সমর্থন করি তা না থাকুক। অথবা, এই বিষয়ে, আমি কোডে কাজ করছি কিনা। শব্দটি আল্ট + শিফট + আপ এবং ডাউন এর সাহায্যে (অনুচ্ছেদে) সমর্থন করে এবং আমি যখনই পারি আমার এডিটরগুলিতে এটি ম্যাপ করি।
হার্পো

6
@ ড্র এবং জারকওয়ে: আমি মনে করি কম পরিমাণে নিষ্পত্তি করা খুব কম ইমাক্স উপায় is আপনি যখন হত্যা / ইয়াঙ্ক্কের চেয়ে সরানো চান তখন লাইনগুলি সরানো কেবল দ্রুত হয়। এবং org- মোড অফ কোর্সটি একটি কারণে খুব কার্যকর হয়েছে: প্রকৃতপক্ষে এমন অনেকগুলি মামলা রয়েছে যা আপনি একটি লাইন স্থানান্তর করতে চান, একটি ব্লক স্কোপে / আউটপুটে ভুল রাখা স্টেটমেন্টটি সরানো এক, বিবৃতি অর্ডার পরিবর্তন করুন, নথির আদেশ পরিবর্তন করুন (org- দেখুন মোড), .. প্রচুর লোকজন এটি গ্রহনে ব্যবহার করে। আপনি যা ব্যবহার করেন না, আপনি প্রায়শই মিস করেন না, তবে চলমান রেখাগুলি ব্যবহারের পুরোপুরি পুরো প্রোগ্রামারদের জন্য একটি সত্য
পিটার

4
গিট-রিবেস ফাইলগুলি সম্পাদনা করার সময় এটি কার্যকর যখন আপনি পুনঃক্রম করতে চান এমন কমিটগুলির তালিকা থাকে।
কেন উইলিয়ামস

উত্তর:


47

আবদ্ধ ট্রান্সপোজ-লাইন ব্যবহার করে একটি লাইন সরানো যেতে পারে C-x C-t। অঞ্চলগুলি সম্পর্কে ডুনো যদিও।

আমি এই এলিস্প স্নিপেটটি পেয়েছি যা আপনি যা চান তা করেন, বাইন্ডিংগুলি পরিবর্তন করার প্রয়োজন ব্যতীত।

(defun move-text-internal (arg)
   (cond
    ((and mark-active transient-mark-mode)
     (if (> (point) (mark))
            (exchange-point-and-mark))
     (let ((column (current-column))
              (text (delete-and-extract-region (point) (mark))))
       (forward-line arg)
       (move-to-column column t)
       (set-mark (point))
       (insert text)
       (exchange-point-and-mark)
       (setq deactivate-mark nil)))
    (t
     (beginning-of-line)
     (when (or (> arg 0) (not (bobp)))
       (forward-line)
       (when (or (< arg 0) (not (eobp)))
            (transpose-lines arg))
       (forward-line -1)))))

(defun move-text-down (arg)
   "Move region (transient-mark-mode active) or current line
  arg lines down."
   (interactive "*p")
   (move-text-internal arg))

(defun move-text-up (arg)
   "Move region (transient-mark-mode active) or current line
  arg lines up."
   (interactive "*p")
   (move-text-internal (- arg)))

(global-set-key [\M-\S-up] 'move-text-up)
(global-set-key [\M-\S-down] 'move-text-down)

স্নিপেট জন্য ধন্যবাদ। আমি ঠিক এটিই খুঁজছিলাম!
ফিকোভনিক 24

এই সমাধান উভয় ক্ষেত্রেই কিছুটা সমস্যা রয়েছে এবং @ সানসিটিইনক পোস্ট করেছেন প্রায় একইরকম একটি: যদি আমি কোনও অঞ্চলকে উপরে এবং / বা নীচে সরানোর জন্য সংজ্ঞায়িত শর্টকাট ব্যবহার করি তবে অবিলম্বে শর্টকাটটি পূর্বাবস্থায় ফিরিয়ে আনুন (সি-_ ডিফল্টরূপে), অঞ্চলটি কেবল অদৃশ্য হয়ে যায় এবং বার্তাটি "অঞ্চলে পূর্বাবস্থায় ফিরুন!" প্রতিধ্বনি অঞ্চলে প্রদর্শিত হয়। আরেকটি পূর্বাবস্থায় কমান্ড "অঞ্চলটির জন্য আর কোনও পূর্ববর্তী তথ্য নয়" বার্তাটি দেয়। যাইহোক, আমি যদি কার্সারটি সরান, তবে পূর্বাবস্থায় ফিরে আসুন, পূর্বাবস্থায় ফিরে কাজ শুরু করে। তুলনামূলকভাবে সামান্য জ্বালা, তবে অন্য সমস্ত ইমাস কমান্ডগুলি কোনও কৌশল অবলম্বন না করে অবিলম্বে পূর্বাবস্থায় ফেলা যায়।
তিমু লেইস্তি

4
এটি করার সঠিক উপায় এটি। ইমাসে ডিফল্ট ট্রান্সপোজ লাইন কার্যকারিতা সঠিক নয় কারণ ট্রান্সপোসের পরে কার্সার পরের লাইনে চলে যায় ফলে ধাপে ধাপে এটি পুনরুক্ত করা কঠিন হয়ে পড়ে।
পৌরাণিক

51

আপডেট: নিম্নলিখিত কোডটি পেতে মারম্যালেডmove-text বা মেলপা থেকে প্যাকেজটি ইনস্টল করুন ।

আমি যা ব্যবহার করি তা এখানে, যা উভয় অঞ্চল এবং স্বতন্ত্র লাইনে কাজ করে:

(defun move-text-internal (arg)
  (cond
   ((and mark-active transient-mark-mode)
    (if (> (point) (mark))
        (exchange-point-and-mark))
    (let ((column (current-column))
          (text (delete-and-extract-region (point) (mark))))
      (forward-line arg)
      (move-to-column column t)
      (set-mark (point))
      (insert text)
      (exchange-point-and-mark)
      (setq deactivate-mark nil)))
   (t
    (let ((column (current-column)))
      (beginning-of-line)
      (when (or (> arg 0) (not (bobp)))
        (forward-line)
        (when (or (< arg 0) (not (eobp)))
          (transpose-lines arg)
          (when (and (eval-when-compile
                       '(and (>= emacs-major-version 24)
                             (>= emacs-minor-version 3)))
                     (< arg 0))
            (forward-line -1)))
        (forward-line -1))
      (move-to-column column t)))))

(defun move-text-down (arg)
  "Move region (transient-mark-mode active) or current line
  arg lines down."
  (interactive "*p")
  (move-text-internal arg))

(defun move-text-up (arg)
  "Move region (transient-mark-mode active) or current line
  arg lines up."
  (interactive "*p")
  (move-text-internal (- arg)))


(global-set-key [M-S-up] 'move-text-up)
(global-set-key [M-S-down] 'move-text-down)

4
Ive এটি আপনার জন্য EmacsWiki এ যুক্ত করেছে, এটি এখানে: emacswiki.org/emacs/MoveText
ocodo

ধন্যবাদ! আমি মনে করি যে কোডটি ইতিমধ্যে সেখানে ছিল ( emacswiki.org/emacs/basic-edit-toolkit.el ) তবে এই নতুন পৃষ্ঠাটি মানুষের সন্ধান করা সহজ হবে।
সানটিইঙ্কে

আহ, শান্ত আমি এর আগে দেখিনি, দেখে মনে হচ্ছে বেসিক-এডিট-টুলকিট কোনও ক্লিনআপ ব্যবহার করতে পারে।
ocodo

4
@ এমসিবি হ্যাঁ, যে কোনও ইএলপিএ প্যাকেজ এল-গেটের মাধ্যমে ইনস্টল করা যেতে পারে। (দ্রষ্টব্য যে এমনকি এল-গেট লেখক প্যাকেজ.এল এর দিকে এগিয়ে চলেছেন)) পূর্ণ লাইনগুলি নির্বাচন করতে, আমি একটি পৃথক ফাংশন লেখার পরামর্শ দেব যা দ্রুত বর্তমান লাইনটি নির্বাচন করে, বা সম্পূর্ণ অঞ্চলগুলিকে সম্পূর্ণ রেখাগুলি অন্তর্ভুক্ত করার জন্য বর্তমান অঞ্চলটিকে প্রসারিত করে। তারপরে মুভ-টেক্সট ফাংশনের আগে কেবল সেই ফাংশনটি শুরু করুন।
স্যানিটিনিক

4
@ স্যানাসিটিনিক এই জন্য আপনাকে ধন্যবাদ। আমি প্রথমবার এটি ব্যবহার করার সময় একটি মিনি ইম্যাকস 'ও' পেয়েছিলাম। ভাল জিনিস!
জেএস।

31

আপনার চেষ্টা করা উচিত drag-stuff!

এটি একক লাইনের পাশাপাশি গ্রীক Alt+ Up/ এর মতো Downনির্বাচিত অঞ্চল রেখার মতো কাজ করে!

এছাড়াও এটি আপনাকে Alt+ Left/ দিয়ে শব্দ সরাতে দেয় Right
যা আপনি খুঁজছেন ঠিক এটিই! এমনকি এটি ইএলপিএ রেপো থেকে পাওয়া যায় !

অন্যান্য সমাধানগুলি কখনই আমার পক্ষে কার্যকর হয়নি। তাদের মধ্যে কিছু বগি ছিল (ক্রম পরিবর্তন করার সময় লাইন ট্রান্সপোসিংয়ের সময়, ডাব্লুটিএফ?) এবং তাদের মধ্যে কিছু সঠিক অবস্থান বেছে নিয়েছিল, তাদের অবস্থানগুলিতে লাইনের অনির্বাচিত অংশ রেখে। তবে drag-stuffঠিক গ্রহের মতোই কাজ করে!

এবং আরও বেশি! আপনি একটি অঞ্চল নির্বাচন এবং Alt+ Left/ ব্যবহার করে চেষ্টা করতে পারেন Right! এটি নির্বাচিত অঞ্চলটিকে একটি অক্ষর দ্বারা বাম বা ডানে স্থানান্তরিত করবে। আশ্চর্য!

এটি বিশ্বব্যাপী সক্ষম করতে কেবল এটি চালান:

(drag-stuff-global-mode)

এটিতে বাম এবং ডান চলাচল optionচ্ছিক হওয়া দরকার কারণ এটি ডিফল্ট ইম্যাকস কীম্যাপটিকে ওভাররাইড করে।
ocodo

@ স্লোমোজো সম্ভবত! আপনি কেন ইমাসউইকিতে এটির পরামর্শ দিচ্ছেন না? :)
আলেকস-ড্যানিয়েল জাকিমেনকো-এ।

4
আমি এটি ব্যবহার করতাম, আমি এখন স্মার্ট-শিফট ব্যবহার করছি। আমি এটি পছন্দ করি এটি অনুভূমিক চলাচলের জন্য DWIM।
jpkotta

4
কী (drag-stuff-define-keys)-বাইন্ডিংগুলি কাজ শুরু করার আগে আর ডি ফাইলের প্রয়োজন । এটি এই গিথুবে
এজেন্ট 18

11

আমি লাইনগুলি উপরে / নিচে সরানোর জন্য কয়েকটি ইন্টারেক্টিভ ফাংশন লিখেছি:

;; move line up
(defun move-line-up ()
  (interactive)
  (transpose-lines 1)
  (previous-line 2))

(global-set-key [(control shift up)] 'move-line-up)

;; move line down
(defun move-line-down ()
  (interactive)
  (next-line 1)
  (transpose-lines 1)
  (previous-line 1))

(global-set-key [(control shift down)] 'move-line-down)

কী-বাইন্ডিংগুলি হ'ল ইন্টেলিজ আইডিইএ শৈলী, তবে আপনি যা চান তা ব্যবহার করতে পারেন। আমার সম্ভবত কিছু ফাংশন প্রয়োগ করা উচিত যা অঞ্চলগুলিতেও পরিচালনা করে।


5

সক্রিয় অঞ্চল দ্বারা প্রসারিত বর্তমান লাইন বা রেখাগুলি সরানোর জন্য আমার স্নিপেট এখানে। এটি কার্সার অবস্থান এবং হাইলাইটেড অঞ্চলকে সম্মান করে। যখন অঞ্চলটি লাইন বর্ডারে (গুলি) শুরু / শেষ না হয় তখন লাইনগুলি ভাঙবে না। (এটি গ্রহণ দ্বারা অনুপ্রাণিত; আমি 'ট্রান্সপোজ-লাইন' এর চেয়ে বেশি সহজলভ্যভাবে ग्रहण পেলাম))

;; move the line(s) spanned by the active region up/down (line transposing)
;; {{{
(defun move-lines (n)
  (let ((beg) (end) (keep))
    (if mark-active 
        (save-excursion
          (setq keep t)
          (setq beg (region-beginning)
                end (region-end))
          (goto-char beg)
          (setq beg (line-beginning-position))
          (goto-char end)
          (setq end (line-beginning-position 2)))
      (setq beg (line-beginning-position)
            end (line-beginning-position 2)))
    (let ((offset (if (and (mark t) 
                           (and (>= (mark t) beg)
                                (< (mark t) end)))
                      (- (point) (mark t))))
          (rewind (- end (point))))
      (goto-char (if (< n 0) beg end))
      (forward-line n)
      (insert (delete-and-extract-region beg end))
      (backward-char rewind)
      (if offset (set-mark (- (point) offset))))
    (if keep
        (setq mark-active t
              deactivate-mark nil))))

(defun move-lines-up (n)
  "move the line(s) spanned by the active region up by N lines."
  (interactive "*p")
  (move-lines (- (or n 1))))

(defun move-lines-down (n)
  "move the line(s) spanned by the active region down by N lines."
  (interactive "*p")
  (move-lines (or n 1)))

4
আমার জন্য মুভ-টেক্সট প্যাকেজটি ভেঙে গেছে। আপনার সমাধানটি আমার সিস্টেমে পুরোপুরি কাজ করে। তার জন্য ধন্যবাদ!
রুন কাগারগার্ড


1

কোনও বিল্ট-ইন নেই। আপনি ট্রান্সপোজ-লাইনগুলি (Cx Ct) ব্যবহার করতে পারেন তবে আপনি এটি বারবার ব্যবহার করতে পারবেন না। Http://www.schuerig.de/michael/blog/index.php/2009/01/16/line-movement-for-emacs/ এ ফাংশনগুলি দেখুন ।

অঞ্চলগুলিতেও এটি মানিয়ে নেওয়া সহজ হওয়া উচিত।


4
বিটিডব্লু, আপনি যদি লিঙ্কযুক্ত স্নিপেট ব্যবহার করার সিদ্ধান্ত নেন, আপনি লেট স্টেটমেন্টটি (লেট (চলমান (বর্তমান-কলাম)) (লাইন-মুভ-ভিজ্যুয়াল নীল) এ পরিবর্তন করতে চাইতে পারেন, অন্যথায় আপনি মোড়ানো লাইনের সাথে মজার আচরণ পান ।
লিও আলেক্সেয়েভ

1

transpose-paragraphফাংশন আপনাকে সাহায্য করতে পারে।

আপনি ইমাস ম্যানুয়ালটিতে ট্রান্সপোজ বিভাগটি দেখতে চান । মূলত:

C-t
Transpose two characters (transpose-chars).
M-t
Transpose two words (transpose-words).
C-M-t
Transpose two balanced expressions (transpose-sexps).
C-x C-t
Transpose two lines (transpose-lines).

0

আমি এর জন্য স্মার্ট শিফট প্যাকেজটি (মেলপাতে) ব্যবহার করি। ডিফল্টরূপে এটি C-C <arrow>একটি লাইন বা অঞ্চল সরানোর জন্য পুনঃতফসিল করে। এটি প্রধান-মোড-নির্দিষ্ট পরিমাণের (যেমন সি-বেসিক-অফসেট বা পাইথন-ইনডেন্ট-অফসেট) দ্বারা অনুভূমিকভাবে সরানো হয়। অঞ্চলগুলিতেও কাজ করে।

;; binds C-C <arrows>
(when (require 'smart-shift nil 'noerror)
  (global-smart-shift-mode 1))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.