Satırların sonuna doğru ilerlemeye devam et


9

Anahtar bağlamanın varsayılanı C-a/C-esadece bir şey içindir, satırın başına / sonuna gider, Emac'ların böyle çalışmasını sağlayan herhangi bir paket var mı:

  1. Bir çizginin sonunda değilsem C-e, çizginin sonuna gider, aksi takdirde bir sonraki çizginin sonuna gider
  2. Eğer bir çizginin başında değilsem C-a, çizginin başına gider, yoksa bir sonraki çizginin başına gider.

Mesele, C-a/eparmağınızı ulaşmak için hareket ettirmeden her satırın başına / sonuna gitmek için vurmaya devam edebilmenizdir C-n/p.

Ve bir önekle ( C-u) zıt yönde satırın başına / sonuna giderler.


Aşağıdaki cevaba yapılan bir yorumda @kaushalmodi, sorunuzun yanlış yorumlanabileceğine işaret ediyor. Eğer istiyorsunuz C-agitmek "yukarı" ve C-e"aşağı" gitmek için? Başka bir deyişle, "sonraki satır" ın anlamı madde 1 ve 2'de aynı mıdır?
Konstantin

@Constantine Ben aslında bu soruyu gönderdiğimde " C-ayukarı ve C-eaşağı" sorunu hakkında düşündüm, ama sonra birisi defunsizin gibi bir çözüm verdi , herkes C-a"yukarı" seviyorsa ne yapacağını biliyor düşündüm ..
CodyChan

TAMAM; Bence hala düzeltmeye değer. Cevabı güncelleyeceğim - bu sadece tek satırlık bir değişiklik.
Konstantin

Yanıtlar:


11

Bu davranışı etkinleştirecek bir paket bilmiyorum, ama işte bunu yapmanın bir yolu var.

Aşağıdakilere bağlı C-h k C-aolduğunu keşfetmek için basın ; bu, değiştirmemiz gereken işlev --- veya sadece "başlangıca geçiş" bölümünü uygulamak için kullanmamız gereken işlevdir. Benzer şekilde, yukarı / aşağı hareket etmek için kullanılacak olan bulabilirim .C-amove-beginning-of-lineC-h kforward-line

Bir işlevi bir anahtara bağlayabilmek için onu bir komut haline getirmemiz gerekir, bu yüzden interactiveözel formu kullanmamız gerekir (bkz . Etkileşimli Kullanımı ). C-uÖnek bağımsız değişkenini almak için "P"kod karakterine ihtiyacımız var .

Bunu bolp(satırın başında olup eolpolmadığını kontrol edin ) ve (satırın sonunda olup olmadığını kontrol edin) ile yazarak şunları yazabiliriz:

(defun my-move-beginning-of-line (arg)
  (interactive "P")
  (when (bolp) (previous-line (if arg -1 1)))
  (move-beginning-of-line nil))

(defun my-move-end-of-line (arg)
  (interactive "P")
  (when (eolp) (forward-line (if arg -1 1)))
  (move-end-of-line nil))

Şimdi yeniden bağlayabilir C-ave C-ebunları arayabiliriz:

(global-set-key [remap move-beginning-of-line] #'my-move-beginning-of-line)
(global-set-key [remap move-end-of-line] #'my-move-end-of-line)

Alternatif olarak, tek olabilir tavsiye eklemek için move-beginning-of-lineve move-end-of-line.


Bu gerçekten iyi bir açıklama ve zarif bir çözüm. my-move-beginning-of-lineFonksiyonda bir yazım hatası var .. (previous-line (if arg -1 1))veya (forward-line (if arg 1 -1))(1 ve -1 anahtarlamalı) olmalı mı ?
Kaushal Modi

@kaushalmodi: soruda her iki madde 1 ve 2, "aşağı" olarak yorumladığım "sonraki satır" der. Öyleyse, sorunun yazarına soralım! :-)
Konstantin

Ah, OP'nin sorusuna kendi varsayımımı ekledim. Haklısınız, ya da kullanırken bir sonraki satıra gitmeyi belirtiyor . C-aC-e
Kaushal Modi

@kaushalmodi: Haklısın! Cevabı C-a"yukarı" çıkarmak için güncelledim .
Konstantin

8

Kütüphane misc-cmds.eluzun zamandır bu özelliğe sahipti.

Bunlar ilgili komutlar ve önerilen anahtar bağlamalarıdır (bu bağlamalar yapılır setup-keys.el).

(cond ((fboundp 'move-beginning-of-line)
       (substitute-key-definition 'move-beginning-of-line 'beginning-of-line+ global-map)
       (substitute-key-definition 'move-end-of-line 'end-of-line+ global-map))
      (t
       (substitute-key-definition 'beginning-of-line 'beginning-of-line+ global-map)
       (substitute-key-definition 'end-of-line 'end-of-line+ global-map)))
(when (boundp 'visual-line-mode-map)
  (define-key visual-line-mode-map [remap move-beginning-of-line] nil)
  (define-key visual-line-mode-map [remap move-end-of-line]       nil)
  (define-key visual-line-mode-map [home] 'beginning-of-line+)
  (define-key visual-line-mode-map [end]  'end-of-line+)
  (define-key visual-line-mode-map "\C-a" 'beginning-of-visual-line+)
  (define-key visual-line-mode-map "\C-e" 'end-of-visual-line+)))

İşte budur C-h f end-of-line+bir örnek olarak, diyor ki:

end-of-line+ is an interactive compiled Lisp function in
`misc-cmds.el'.

It is bound to C-e, end.

(end-of-line+ &optional N)

Move cursor to end of current line or end of next line if repeated.
This is similar to `end-of-line', but:
  If called interactively with no prefix arg:
     If the previous command was also `end-of-line+', then move to the
     end of the next line.  Else, move to the end of the current line.
  Otherwise, move to the end of the Nth next line (Nth previous line
     if N<0).  Command `end-of-line', by contrast, moves to the end of
     the (N-1)th next line.

Çok zarif.
sanityinc

1

Aşağıdaki iki işlev istenen eylemleri gerçekleştirir.

(defun move-beginning-of-line-or-previous (&optional pre)
  "Move to the start of the line. If we are already at the start
of the line, move to the start of the previous line or, if called 
with a prefix argument, the next line."
  (interactive "P")
  (let* ((pos (point)))
    (move-beginning-of-line nil)
    (if (= (point) pos)
        (if pre
            (next-line)
          (previous-line)))))

(defun move-end-of-line-or-next (&optional pre)
  "Move to the end of the line. If we are already at the end of
the line, move to the end of the next line or, if called with a 
prefix argument, the previous line."
  (interactive "P")
  (let* ((pos (point)))
    (move-end-of-line nil)
    (if (= (point) pos)
        (if pre
            (previous-line)
          (next-line)))))
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.