Minimal tuş vuruşlarıyla geçerli satırı öldür veya kopyala


32

C-a C-k C-kÖldürmek için yaptığım bütün çizgi noktası açık.

Eğer istersem kopyalamak onu öldürmek yerine çizgi, ben vurabilir C-/ C-/ yukarıdaki diziyi yazdıktan sonra sağ.

Alternatif olarak yapabilirim C-a C-SPC C-n M-w.

Açıktaki tüm çizgi noktasını öldürmek veya kopyalamak için daha hızlı bir yol var mı?


1
Vaov! Bu cevap, insanların yerleşik kullanımı kullanmaktan kaçınmak için harcayacağı uzunlukları göstermektedir kill-whole-line. :)
Omar

Aşağıda önerildiği gibi kullanın evil-mode. Vim komutlarını öğrenin, pişman olmayacaksınız!
A. Blizzard

Yanıtlar:


44

kill-whole-lineAçıktaki tüm çizgi noktasını öldürmek için kullanabilirsiniz . Noktanın konumu önemli değil. Bu komut C-S-DELvarsayılan olarak bağlıdır .

Ayrıca değişkeni değeri olmayan bir değere ayarlayarak tüm çizgiyi kill-linesonlandırmanız için talimat verebilirsiniz (buna bağlı C-k) : kill-whole-linenil

(setq kill-whole-line t)

Bunun işe yaraması için hattın başında olması gerektiğini unutmayın.


Sonra bu iki taşlar var ( emacs-fu ile ):

(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)))))

Bunlar yerinde iken , tek bir tuşa basarak hat noktasının açık olduğunu öldürebilir veya kopyalayabilirsiniz :

  • C-w mevcut çizgiyi öldürür
  • M-w geçerli satırı kopyalar

Aktif bir bölge varsa kill-regionve kill-ring-savenormalde yaptıklarını yapmaya devam edeceğini unutmayın: Öldürün veya kopyalayın.


Taşıma slick-cutve slick-copyyeni tavsiye sistemi

Emacs 24.4 yeni bir tavsiye sistemi sunar . İken defadvice hala çalışır , bu Emacs gelecekteki sürümlerinde yeni sistemin lehine önerilmemektedir olabileceği olasılığı vardır. Bunun için hazırlamak için, güncelleştirilmiş sürümlerini kullanmak isteyebilirsiniz slick-cutve 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
Unutmayın kill-regionve kill-ring-savebölge "aktif" olmasa bile çalışmaya devam eder. Bu, bu davranışı geçersiz kılar. Zaman zaman bu davranışı kullanıyorum, ancak bu şekilde kullanmaya alışkın değilseniz, muhtemelen farkı görmezsiniz.
nispio

@nispio zaman / nasıl genişletmek Lütfen kill-regionkullanışlı olduğunu etc / yararlı olduğunda mark-activeise nil.
Phil Hudson

1
@PhilHudson Bu işaret aktif olmadan ayarlanabilir (ve genellikle de belirlenir). C-SPCİşareti etkinleştirmek ve ardından devre dışı bırakmak için iki kez yapmayı deneyin . İmleci dosyanın başka bir yerine getirin ve çalıştırın kill-region; işaret etkin olmasa bile nokta ve işaret arasındaki bölgeyi öldürür. İşaretini ayarlayan (ancak etkinleştirmeyen) birkaç komut örneği yankve isearch. Bu tür komutları yerine getirdikten sonra, etkin olmasa bile, işaretin nerede olduğunu biliyorum ve çoğu komut (dahil kill-region) işareti açıkça etkinleştirmeden kullanmama izin verecek.
nispio

@ Nispio teşekkürler. Tabii ki. Bu, yalnızca görünür bölge vurgulanmasının varsayılan olarak birkaç büyük sürüm geri dönmesine neden olmasından önce, eskiden böyle oldu, değil mi? "Etkin" i "set" ile karıştırıyordum.
Phil Hudson,

1
Bu, herhangi bir SX'te yayınlanan en büyük cevaptır. Ciddi anlamda.
Benjamin Lindqvist

15

Kendim için bulduğum çözüm önek argümanlarını kullanmak.

Benim için, yarım çizgiyi öldürmek faydalı bir özellik, ama ben de bütün çizgileri öldürmenin daha kolay bir yolunu istiyorum. Ben de kill-linebir önek tartışması yapıldığında göründüğü her şeyi öldürmesi için yaptım .

(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))

Bu küçük makro ile, C-khala noktadan öldürür ama C-3 C-küç bütün çizgiyi yutar. Bonus olarak, kill-whole-linedavranışı yaparak alıyoruz C-1 C-k.


Bu harika bir fikir, paylaştığınız için teşekkürler! :) Bu çözümü bir veya daha fazla satırın kopyalanması için çalışmak üzere nasıl uyarlarsınız? kill-ring-saveönek argümanlarını kabul etmiyor ...
itsjeyd

@ itsjeyd İki cevabı birleştirmek için benzer bir şeyler yapılabileceğinden eminim. Ama biraz daha fazla iş alırdı.
Malabarba

Son satır, paredit-kill anlamına gelir. Amaçlandı mı?
Boccaperta-IT

1
Ah tamam teşekkürler. Yine de beklenen davranışı alamıyorum. İşaretçiyi bir çizginin ortasına yerleştirip C-3 Ck tuşlarına basarsam, ilk satır tamamen ölmez. Böyle mi çalışması gerekiyordu yoksa yanlış bir şey mi yapıyorum?
Boccaperta-IT

1
@ Malabarba haklısın, buna kill-visual-linebağlı C-k. Düzelteceğim. Tekrar teşekkürler.
Boccaperta-IT

15

whole-line-or-regionHerhangi bir bölge aktif değilse, geçerli hatta hareket etmeleri için çeşitli yerleşik komutları öneren bir paket var, bu nedenle mevcut bölge M-wkopyalanacak ve C-wörneğin onu öldürecek. Paketi yıllardır kullanıyorum ve vazgeçilmez buluyorum.

Ek olarak, bu paket, sayısal bir önek, üzerinde işlem yapılacak satır sayısını gösterecek ve böylece M-2 M-wiki satırı kopyalayacak şekilde yapar. Buradaki diğer cevaplar bu kullanışlı işlevselliği sağlamaz.

Yazarın bakımını durdurduğunda ve tepkisiz kaldığında paketin bakımını github hesabımda devraldım .

whole-line-or-region Ayrıca, bu davranışı daha ileri komutlara eklemek için de imkanlar sağlar.


Lütfen bunun için bir MELPA sorunu hazırlayın, çünkü ne demek istediğinizi tam olarak anlamadım: Bu paketi sorunsuz olarak her zaman MELPA'dan yüklüyorum.
sanityinc

9

Bu ortodoks emacs için bir cevap değildir. Bununla birlikte, evilmodal düzenlemeyle küfretmeye hazırsanız , şunları yapabilirsiniz:

  • dd öldürme çizgisi için
  • cc kopya hattı için

Her ikisine de öldürmek / kopyalamak için satır sayısı eklenebilir (örneğin, 4ccsonraki 4 satırı kopyalayacaktır).


5

@ İtsjeyd cevabının yanı sıra, bu iki işlevi de önerebilir miyim?

(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)))

Ardından, anahtar tanımlar (muhtemelen bunları uyarlamak isteyeceksiniz):

(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

İzniyle ErgoEmacs


Cevabınız için teşekkürler! Bu komutların burada yayınlanan diğer çözümlerden nasıl farklı olduğunu açıklayarak biraz uzatmayı düşünebilirsiniz. Evet, bu bilgiler Docstringler mevcuttur, ancak gelecek okuyucular için daha görünür hale getirmek için zarar vermez :)
itsjeyd

1
Bunu yapmak mümkün mü, ancak aşağıdaki @Jonathan post gibi değiştirin, böylece ilk önce sexp veya word'ü alır ve sonra tekrar aranırsa satır alır?
J Spen

@JSpen Yaptığım işleve bir kısayol tuşu atamak. Jonathan'ın yaptığı, bir işleve bir tavsiye tanımlamaktır. Böylece, sadece işlevi önerebilir, ardından önerilen işlev için bir kısayol tuşu tanımlayabilirsiniz; ve sonucunu alacaksın. Gecikme için üzgünüm;)
Nsukami _

4

@ İtsjeyd'in yukarıdaki cevabının bir uzantısı olarak aşağıdakiler var. (Mantık muhtemelen biraz temizlenebilir ve yeni tavsiye sistemine geçtiğimde yapacağım, muhtemelen tekrar tekrarı sexp/ genişletmek için de genişletirim paragraph).

Bir başlangıç C-w/ M-wsadece noktadaki sözcüğü alır, ikinci kez çağırırken tüm satırı kapar.

;; *** 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)))))))

Bunu güncellediniz mi, öyleyse bir kopyası nerede? Ayrıca, bu işaret halkasına bir ton işaret ekler. Sadece kopyalandığı yerin başına bir işaret ekleyebilir mi? Yani kelimenin başlangıcı ya da satırın başlangıcı. Şimdi her zaman sinir bozucu dört işaret ekler. Aslında onu kullanmaya (back-sexp) değiştirdim ama bazen bir tane bulamıyor ve hata veriyor. Bir tane bulamazsa satırı kopyalayabilir mi? Bunu nasıl yapacağımı veya hatayı görmezden gelip bir ses çıkarmayacağından emin değildim. Üzgünüm, lisp'ta en iyisi değilim.
J Spen

1

Minimal tuş vuruşlarıyla yapmak istediğiniz için David Andersson'un mükemmel tuş akor paketini kullanabilirsiniz. Bir "tuş akoru", aynı anda basılan iki tuşa veya iki kez basılan tek bir tuştur.

Herhangi bir tuş akorunu bu işlevlere bağlayabilirsiniz.

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

Cevabınız için teşekkürler :) Geçmişte birkaç kez anahtar akorları denedim ve onlara gerçekten alışamadım. Ancak bu cevaplar burada toplanırsa kesinlikle sete faydalı bir katkıdır!
15’de

1

Daha az geçici bir yol tanımlamaktır mark-whole-line; Emacs'in gerçekte hangi varsayılan komutu kullanması gerektiğini tanımlamaktır .

(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

O C-2 C-wzaman işi yapacak.

Ayrıca mevcut tüm satırı yorumlamak gibi işleri kolaylaştırır.


0

Bu, cevabın jeyd tarafından değiştirilmiş halidir - şu anda en yüksek oyu alan cevap ve yıllardır kullandığım cevap. Bununla birlikte, sorunları var: Tavsiye edilen sürümü bir kill-ring-savezamanlar başarısız olur çünkü işaret ayarlanmamış (tipik olarak yeni bir tamponda) ve çalışsa bile, imleç tek bir satırı kopyalamak için fonksiyonun kullanımından sonra garip bir dans yaptı . Bir miktar kazı yaptıktan sonra, bunun işini yaptıktan sonra yapılan kill-ring-saveçağrılar nedeniyle işaret ettiğinden şüphe duydum indicate-copied-region, ancak nokta ve işaret kopyalanan bölgeyle eşleşmiyor indicate-copied-region, yanlış bölgeyi işaret ediyordu.

Yeterince söylendi. İşte bunu düzelten bir çözüm:

(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"))))

James'in tavsiyesinde yanlış bir şey yok kill-region. Her nasılsa, yukarıdakilerle stilistik olarak daha tutarlı bir değişken:

(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")))

Açık değilse transient-mark-mode, bu önerilerin hiçbir şey yapmadığını unutmayın.


Daha kapsamlı bir çözüm istiyorsanız, whole-line-or-regionbunun yerine paketi kullanmayı düşünün ; cevabı @sanityinc bakın.
Harald Hanche-Olsen

0

Composable.el adında bir paket kullanıyorum . Paketin en güzel yanı, geleneksel emacs komutlarını kabul etmesi, büküm ile Mw ve Cw'yi (kopyala ve öldür komutlarını) daha Vim'e benzer şekilde değiştirmesidir. Yani C-w lbütün bir çizgiyi öldürür. Ancak C-w M->, dosyanın sonunu öldürmek gibi şeyler de yapabilirsiniz . Her iki komut da bir bölgeyi işaretlerken normal gibi davranır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.