ন্যূনতম কীস্ট্রোক সহ বর্তমান লাইনটি কিল বা কপি করুন


32

আমি C-a C-k C-kপুরো লাইন পয়েন্ট মেরে ফেলছি।

আমি যদি লাইনটি মারার পরিবর্তে অনুলিপি করতে চাই C-/ C-/ তবে উপরের ক্রমটি টাইপ করার পরে আমি ঠিক হিট করতে পারি ।

বিকল্পভাবে, আমি করতে পারেন C-a C-SPC C-n M-w

পুরো লাইন পয়েন্টটি মারার বা অনুলিপি করার কোনও দ্রুত উপায় আছে কি?


1
কি দারুন! এই উত্তরগুলি দেখায় যে বিল্ট-ইন ব্যবহার এড়াতে লোকেরা যে পরিমাণ দৈর্ঘ্যে যাবে kill-whole-line। :)
ওমর

নীচে প্রস্তাবিত হিসাবে, ব্যবহার করুন evil-mode। ভিম কমান্ড শিখুন, আপনি আফসোস করবেন না!
এ ব্লিজার্ড

উত্তর:


44

আপনি kill-whole-lineসম্পূর্ণ লাইন পয়েন্টটি মারতে ব্যবহার করতে পারেন । পয়েন্ট পজিশন কোন ব্যাপার না। এই কমান্ডটি C-S-DELডিফল্টরূপে আবদ্ধ ।

আপনি ভেরিয়েবলটিকে অ- মান হিসাবে সেট করে পুরো লাইনটি মেরে ফেলার নির্দেশ kill-line(আবদ্ধ C-k) করতে পারেন : kill-whole-linenil

(setq kill-whole-line t)

নোট করুন যে এটি কাজ করার জন্য পয়েন্টটি লাইনের শুরুতে হওয়া উচিত।


তারপরে এই দুটি রত্ন রয়েছে ( ইমাস-ফু দ্বারা ):

(defadvice kill-region (before slick-cut activate compile)
  "When called interactively with no active region, kill a single line instead."
  (interactive
   (if mark-active
       (list (region-beginning) (region-end))
     (list (line-beginning-position) (line-beginning-position 2)))))

(defadvice kill-ring-save (before slick-copy activate compile)
  "When called interactively with no active region, copy a single line instead."
  (interactive
   (if mark-active
       (list (region-beginning) (region-end))
     (message "Copied line")
     (list (line-beginning-position) (line-beginning-position 2)))))

এগুলিতে আপনি একক কীস্ট্রোক সহ লাইন পয়েন্টটি মেরে বা অনুলিপি করতে পারেন :

  • C-w বর্তমান লাইন মেরে ফেলেছে
  • M-w বর্তমান লাইন অনুলিপি

নোট যদি একটি সক্রিয় অঞ্চল, যে kill-regionএবং kill-ring-saveতারা স্বাভাবিকভাবে করতে কি চলতে থাকবে: kill অথবা এটি কপি করুন।


পোর্টিং slick-cutএবং slick-copyনতুন পরামর্শ পদ্ধতিতে

ইমাস 24.4 একটি নতুন পরামর্শ ব্যবস্থা প্রবর্তন করেছে । যদিও defadvice এখনও কাজ করে , একটি সুযোগ যে এ গিয়ে Emacs ভবিষ্যত সংস্করণে নতুন সিস্টেম পক্ষে অবচিত হতে পারে। যে জন্য প্রস্তুত করার জন্য, আপনাকে নতুন সংস্করণ ব্যবহার করতে চাইতে পারেন slick-cutএবং slick-copy:

(defun slick-cut (beg end)
  (interactive
   (if mark-active
       (list (region-beginning) (region-end))
     (list (line-beginning-position) (line-beginning-position 2)))))

(advice-add 'kill-region :before #'slick-cut)

(defun slick-copy (beg end)
  (interactive
   (if mark-active
       (list (region-beginning) (region-end))
     (message "Copied line")
     (list (line-beginning-position) (line-beginning-position 2)))))

(advice-add 'kill-ring-save :before #'slick-copy)

2
নোট করুন kill-regionএবং kill-ring-saveঅঞ্চলটি "সক্রিয়" না থাকলেও এখনও কাজ করে। এটি সেই আচরণকে ওভাররাইড করবে। আমি এই আচরণটি সময়ে সময়ে ব্যবহার করি তবে আপনি যদি এইভাবে তাদের ব্যবহার করতে অভ্যস্ত না হন তবে আপনি সম্ভবত এই পার্থক্যটি লক্ষ্য করবেন না।
নিসপিও

@nispio যখন / কিভাবে প্রসারিত দয়া করে kill-regionইত্যাদি উপভোগ্য / দরকারী যখন mark-activeহয় nil
ফিল হাডসন

1
@ ফিলহডসন সক্রিয় না হয়ে চিহ্নটি (এবং সাধারণত হয়) সেট করা যায়। C-SPCসক্রিয় করতে এবং তারপরে চিহ্নটি নিষ্ক্রিয় করতে দু'বার চেষ্টা করুন । কার্সারটি ফাইলের অন্যত্র সরিয়ে নিয়ে চলুন kill-regionএবং চিহ্নটি সক্রিয় না থাকা সত্ত্বেও এটি বিন্দু এবং চিহ্নের মধ্যে অঞ্চলটিকে মেরে ফেলবে। কমান্ড কয়েকটি উদাহরণ সেট (কিন্তু সক্রিয় করবেন না) চিহ্ন দ্বারা yankএবং isearch। এই ধরণের কমান্ডগুলি সম্পাদন করার পরে, আমি জানি যে চিহ্নটি কোথায় রয়েছে, এটি সক্রিয় না থাকলেও এবং অনেকগুলি কমান্ড (সহ kill-region) আমাকে চিহ্নটি স্পষ্টভাবে সক্রিয় না করে ব্যবহার করতে দেবে।
নিসপিও

ধন্যবাদ @নিস্পিও অবশ্যই. এইভাবে এটি ব্যবহৃত হত, একচেটিয়াভাবে, দৃশ্যমান অঞ্চল হাইলাইট করার আগে ডিফল্ট হয়ে ওঠে বেশ কয়েকটি বড় রিলিজ, ডান? আমি "সেট" দিয়ে "অ্যাক্টিভ" বিভ্রান্ত করছি।
ফিল হাডসন

1
এটি কোনও এসএক্স-এ পোস্ট করা সর্বকালের সবচেয়ে বড় উত্তর answer সিরিয়াসলি।
বেনজামিন লিন্ডকভিস্ট

15

সমাধানটি আমি নিজের জন্য খুঁজে পেয়েছি হ'ল উপসর্গ আর্গুমেন্ট ব্যবহার করা।

আমার জন্য, অর্ধেক রেখা মেরে ফেলা একটি দরকারী বৈশিষ্ট্য, তবে আমি সম্পূর্ণ লাইনগুলি হত্যার আরও সহজ উপায় চাই। সুতরাং আমি এটি তৈরি করেছি যাতে kill-lineউপসর্গের পক্ষে যুক্তি দেওয়া হলে কেবল সমস্ত কিছু দৃষ্টিতে খুন করে।

(defmacro bol-with-prefix (function)
  "Define a new function which calls FUNCTION.
Except it moves to beginning of line before calling FUNCTION when
called with a prefix argument. The FUNCTION still receives the
prefix argument."
  (let ((name (intern (format "endless/%s-BOL" function))))
    `(progn
       (defun ,name (p)
         ,(format 
           "Call `%s', but move to BOL when called with a prefix argument."
           function)
         (interactive "P")
         (when p
           (forward-line 0))
         (call-interactively ',function))
       ',name)))

(global-set-key [remap paredit-kill] (bol-with-prefix paredit-kill))
(global-set-key [remap org-kill-line] (bol-with-prefix org-kill-line))
(global-set-key [remap kill-line] (bol-with-prefix kill-line))
(global-set-key "\C-k" (bol-with-prefix kill-line))

এই ছোট্ট ম্যাক্রো দিয়ে C-kএখনও বিন্দু থেকে হত্যা করে তবে C-3 C-kতিনটি সম্পূর্ণ লাইন গিলে ফেলে। বোনাস হিসাবে, আমরা kill-whole-lineআচরণ করে পেয়েছি C-1 C-k


এটি একটি দুর্দান্ত ধারণা, এটি ভাগ করে নেওয়ার জন্য ধন্যবাদ! :) আপনি কীভাবে এই সমাধানটিকে এক বা একাধিক লাইন অনুলিপি করার জন্য কাজ করতে চান? kill-ring-saveউপসর্গ আর্গুমেন্ট গ্রহণ করে না ...
itjeyd

@itsjeyd আমি নিশ্চিত যে দুটি উত্তর একত্রীকরণের জন্য অনুরূপ কিছু করা যেতে পারে। তবে এটি আরও কিছুটা সময় নিতে চাই।
মালবারবা

শেষ লাইনটি পেরেডিট-কিলকে বোঝায়। এটা কি উদ্দেশ্য?
বোকপেপার-আইটি

1
ওহ, ঠিক আছে, ধন্যবাদ যদিও আমি প্রত্যাশিত আচরণ পাচ্ছি না। যদি আমি একটি লাইনের মাঝখানে পয়েন্টার রাখি এবং সি -3 সিকে আঘাত করি তবে প্রথম লাইন পুরোপুরি মারা যায় না। এটি কীভাবে কাজ করার কথা বলে মনে হচ্ছে বা আমি কোনও ভুল করছি?
বোকপেপার-আইটি

1
@Malabarba আপনি ঠিক, kill-visual-lineআবদ্ধ হয় C-k। আমি এটা ঠিক করব. আবার ধন্যবাদ.
বোকপাটার-আইটি

15

একটি প্যাকেজ বলা হয়েছে whole-line-or-regionযা বিভিন্ন অন্তর্নির্মিত কমান্ডকে পরামর্শ দেয় যাতে কোনও অঞ্চল সক্রিয় না হলে তারা বর্তমান লাইনে কাজ করে, সুতরাং M-wবর্তমান লাইনটি অনুলিপি C-wকরবে এবং উদাহরণস্বরূপ এটি হত্যা করবে। আমি প্যাকেজটি বছরের পর বছর ধরে ব্যবহার করছি এবং এটি অনিবার্য বলে মনে করি।

অতিরিক্তভাবে, এই প্যাকেজটি এটি তৈরি করে যাতে একটি সংখ্যাসূচক উপসর্গটি কাজ করার জন্য রেখার সংখ্যা নির্দেশ করে, সুতরাং M-2 M-wদুটি লাইন অনুলিপি করবে। এখানে অন্যান্য উত্তরগুলি সেই কার্যকর কার্যকারিতা সরবরাহ করে না।

আমি যখন আমার গিথুব অ্যাকাউন্টে প্যাকেজটির রক্ষণাবেক্ষণ করেছি তখন যখন লেখক এটি রক্ষণাবেক্ষণ বন্ধ করে দেন এবং প্রতিক্রিয়াহীন হয়ে যান।

whole-line-or-region এই আচরণটি আরও কমান্ডগুলিতে যুক্ত করার সুবিধাও দেয়, আপনার যদি এটির দরকার হয়।


দয়া করে এটির জন্য একটি মেল্পা ইস্যু ফাইল করুন, কারণ আপনি কী বলতে চাইছেন তা সম্পর্কে আমি নিশ্চিত নই: আমি মেলপা থেকে এই প্যাকেজটি সমস্ত সময়ই ইন্সটল করি issues
সানাইটিইঙ্ক

9

এটি গোঁড়া ইমা্যাকগুলির জন্য কোনও উত্তর নয়। তবে, আপনি যদি evilমোডাল সম্পাদনার সাথে নিন্দা করতে রাজি হন তবে আপনি এটি করতে পারেন:

  • dd কিল লাইন জন্য
  • cc অনুলিপি লাইনের জন্য

উভয়কে কিল / কপি করার জন্য লাইনের সংখ্যা দ্বারা উপসর্গ করা যেতে পারে (যেমন, 4ccপরবর্তী 4 টি লাইন অনুলিপি করবে)।


5

@Itsjeyd উত্তর ছাড়াও, আমি কি এই দুটি কার্যকারিতা প্রস্তাব করতে পারি?

(defun xah-copy-line-or-region ()
  "Copy current line, or text selection.
When `universal-argument' is called first, copy whole buffer (but respect `narrow-to-region')."
  (interactive)
  (let (p1 p2)
    (if (null current-prefix-arg)
        (progn (if (use-region-p)
                   (progn (setq p1 (region-beginning))
                          (setq p2 (region-end)))
                 (progn (setq p1 (line-beginning-position))
                        (setq p2 (line-end-position)))))
      (progn (setq p1 (point-min))
             (setq p2 (point-max))))
    (kill-ring-save p1 p2)))

(defun xah-cut-line-or-region ()
  "Cut current line, or text selection.
When `universal-argument' is called first, cut whole buffer (but respect `narrow-to-region')."
  (interactive)
  (let (p1 p2)
    (if (null current-prefix-arg)
        (progn (if (use-region-p)
                   (progn (setq p1 (region-beginning))
                          (setq p2 (region-end)))
                 (progn (setq p1 (line-beginning-position))
                        (setq p2 (line-beginning-position 2)))))
      (progn (setq p1 (point-min))
             (setq p2 (point-max))))
    (kill-region p1 p2)))

তারপরে, মূল সংজ্ঞা (আপনি সম্ভবত সেগুলি মানিয়ে নিতে চাইবেন):

(global-set-key (kbd "<f2>") 'xah-cut-line-or-region) ; cut

(global-set-key (kbd "<f3>") 'xah-copy-line-or-region) ; copy

(global-set-key (kbd "<f4>") 'yank) ; paste

সৌজন্যে এরগোএম্যাকস


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

1
এটি কি সম্ভব তবে নীচে @ জোনাথন পোস্টের মতো এটি সংশোধন করা উচিত তাই এটি প্রথমে যৌনতা বা শব্দ নেয় এবং তারপরে আবার ফোন করা হলে লাইনটি গ্রহণ করে?
জে স্পেন

@ জেএসপেন আমি যা করছি তা কাজ করার জন্য একটি শর্টকাট কী বরাদ্দ করা হচ্ছে। জোনাথন যা করছেন তা কোনও ফাংশনের পরামর্শের সংজ্ঞা দেওয়া। সুতরাং, আপনি কেবল ফাংশনটির পরামর্শ দিতে পারেন, তারপরে পরামর্শ দেওয়া ফাংশনের একটি শর্টকাট কী সংজ্ঞায়িত করতে পারেন; এবং আপনি আপনার ফলাফল পাবেন। বিলম্বের জন্য দুঃখিত;)
নসুকামি _

4

উপরে @ ইজজেডের উত্তরের বর্ধন হিসাবে আমার কাছে নিম্নলিখিতটি রয়েছে। (যুক্তিটি সম্ভবত কিছুটা পরিষ্কার হয়ে যেতে পারে এবং আমি যখন নতুন পরামর্শ পদ্ধতিতে পোর্ট করি তখন আমি সম্ভবত এটি আবারও প্রসারিত করে sexp/ paragraphযদি পুনরাবৃত্তি করা হয় তবে)।

প্রাথমিক C-w/ M-wশব্দটি কেবলমাত্র শব্দটি ধরে ফেলবে, দ্বিতীয় বার বলার সময় পুরো লাইনটি দখল করবে।

;; *** Copy word/line without selecting
(defadvice kill-ring-save (before slick-copy-line activate compile)
  "When called interactively with no region, copy the word or line

Calling it once without a region will copy the current word.
Calling it a second time will copy the current line."
    (interactive
     (if mark-active (list (region-beginning) (region-end))
       (if (eq last-command 'kill-ring-save)
           (progn
             ;; Uncomment to only keep the line in the kill ring
             ;; (kill-new "" t)
             (message "Copied line")
             (list (line-beginning-position)
                   (line-beginning-position 2)))
         (save-excursion
           (forward-char)
           (backward-word)
           (mark-word)
           (message "Copied word")
           (list (mark) (point)))))))

;; *** Kill word/line without selecting
(defadvice kill-region (before slick-cut-line first activate compile)
  "When called interactively kill the current word or line.

Calling it once without a region will kill the current word.
Calling it a second time will kill the current line."
  (interactive
   (if mark-active (list (region-beginning) (region-end))
    (if (eq last-command 'kill-region)
        (progn
          ;; Return the previous kill to rebuild the line
          (yank)
          ;; Add a blank kill, otherwise the word gets appended.
          ;; Change to (kill-new "" t) to remove the word and only
          ;; keep the whole line.
          (kill-new "")
          (message "Killed Line")
          (list (line-beginning-position)
                (line-beginning-position 2)))
      (save-excursion
        (forward-char)
        (backward-word)
        (mark-word)
        (message "Killed Word")
        (list (mark) (point)))))))

আপনি কি এটি আপডেট করেছেন এবং যদি তাই হয় তবে একটি অনুলিপি কোথায় আছে? এছাড়াও, এটি চিহ্নের রিংয়ে একটি টন চিহ্ন যুক্ত করে। এটি যেখানে অনুলিপি করেছে তার শুরুতে এটি কেবল একটি চিহ্ন যুক্ত করতে পারে? সুতরাং শব্দের শুরু বা লাইনের শুরু beginning এখন এটি প্রতিবারের মতো চারটি চিহ্ন যুক্ত করে যা বিরক্তিকর। আমি এটি ব্যবহার করার জন্য আসলে এটি পরিবর্তন করেছি (পশ্চাদপদ-যৌনতা) তবে কখনও কখনও এটি কোনওটি খুঁজে পায় না এবং এটি একটি ত্রুটি দেয়। এটি লাইনটি না পেলে এটি কেবল অনুলিপি করতে পারে? আমি কীভাবে এটি করব বা ঠিক ত্রুটি উপেক্ষা করে কোনও শব্দ না করার বিষয়ে নিশ্চিত ছিলাম না। দুঃখিত, আমি লিস্পে সেরা নই।
জে স্পেন

1

যেহেতু আপনি এটি ন্যূনতম কী স্ট্রোকের সাহায্যে করতে চান, আপনি ডেভিড অ্যান্ডারসনের দুর্দান্ত কী-দুল প্যাকেজটি ব্যবহার করতে পারেন । একটি "কী জ্যাড" হ'ল দুটি কী একসাথে চাপা হয়, বা একক কী দু'বার চাপা হয়।

আপনি এই ফাংশনগুলিতে যে কোনও কী জাল বাঁধতে পারেন।

(require 'key-chord)
(key-chord-mode 1)
(key-chord-define-global "dd"  'kill-whole-line)
(key-chord-define-global "cc"  'yank-whole-line)

আপনার উত্তরের জন্য ধন্যবাদ :) আমি অতীতে দু'বার চাবি বাজানোর চেষ্টা করেছি এবং সত্যই তাদের অভ্যস্ত হতে পারি নি। উত্তরগুলি এখানে সংগ্রহ করা থাকলে তবে এটি অবশ্যই সেটটিতে একটি দরকারী সংযোজন!
itjeyd

1

একটি কম অ্যাডহক উপায় সংজ্ঞায়িত করা হয় mark-whole-line, যার জন্য ইমা্যাকগুলির সত্যই একটি ডিফল্ট কমান্ড থাকা উচিত।

(defun mark-whole-line ()               
    "Combinition of C-a, mark, C-e"
    (interactive)
    (move-beginning-of-line nil)
    (set-mark-command nil)
    (move-end-of-line nil)
)
(global-set-key (kbd "C-2") 'mark-whole-line) ; 2 is near w

তাহলে C-2 C-wকাজটি করবে।

এটি বর্তমান পুরো লাইনে মন্তব্য করার মতো বিষয়গুলিকে আরও সহজ করে তোলে।


0

এটি এর জাইজের উত্তরের একটি পরিবর্তন - বর্তমানে সর্বাধিক ভোট প্রাপ্ত উত্তর এবং আমি বছরের পর বছর ধরে ব্যবহার করি। তবে এতে সমস্যা রয়েছে: প্রস্তাবিত সংস্করণটি কিছু kill-ring-saveসময় ব্যর্থ হবে কারণ চিহ্নটি সেট করা হয়নি (সাধারণত কোনও নতুন বাফারে থাকে) এবং এটি কাজ করার পরেও কার্সারটি একটি লাইন অনুলিপি করার জন্য ফাংশনটি ব্যবহার করার পরে একটি অদ্ভুত নাচ করেছিল । কিছু খনন করার পরে, এটি আমার উপর ছড়িয়ে পড়ে যে এটি ঘটেছিল কারণ এটি কাজ kill-ring-saveকরার indicate-copied-regionপরে কলগুলি হয়েছিল, তবে পয়েন্ট এবং চিহ্নটি অনুলিপি করা অঞ্চলের সাথে মেলে না, indicate-copied-regionভুল অঞ্চল চিহ্নিত করেছে।

যথেষ্ট বলেছ. এখানে একটি সমাধান যা এর প্রতিকার করে:

(define-advice kill-ring-save
    (:before-while (beg end &optional region) slick)
  (or mark-active
      (not (called-interactively-p 'interactive))
      (prog1 nil
    (copy-region-as-kill
     (line-beginning-position) (line-beginning-position 2))
    (message "Copied current line"))))

এর জেজেডের পরামর্শে কোনও ভুল নেই kill-region। উপরোক্তর সাথে স্টাইলিস্টিকালি আরও সুসংগতভাবে এখানে যাইহোক এটির একটি বৈকল্পিক is

(define-advice kill-region
    (:around (kill-region beg end &optional region) slick)
  (if (or mark-active (not region))
      (funcall kill-region beg end region)
    (funcall kill-region
             (line-beginning-position) (line-beginning-position 2))
    (message "Killed current line")))

মনে রাখবেন যে যদি transient-mark-modeএটি চালু না করা হয় তবে এই পরামর্শগুলি কিছুই করে না।


আপনি যদি আরও ব্যাপক সমাধান চান তবে whole-line-or-regionপরিবর্তে প্যাকেজটি ব্যবহারের কথা বিবেচনা করুন; উত্তরটি @ স্যানাসিটইনক দ্বারা দেখুন।
হ্যারাল্ড হানচে-ওলসেন

0

আমি কম্পোজেবল.এল নামে একটি প্যাকেজ ব্যবহার করি । প্যাকেজটি সম্পর্কে পরিষ্কার জিনিস হ'ল এটি মেগা এবং সিডাব্লু (কমান্ড কপিরাইট এবং কিল কমান্ড) আরও মোচড়ের সাথে পরিণত করার পরিবর্তে traditionalতিহ্যবাহী ইমাস কমান্ড গ্রহণ করে with সুতরাং C-w lএকটি সম্পূর্ণ লাইন হত্যা। তবে আপনি C-w M->ফাইলের শেষ কিল মারার মতো জিনিসও করতে পারেন । অঞ্চল চিহ্নিত করার সময় উভয় কমান্ডই স্বাভাবিকের মতো কাজ করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.