Elips'te işaret nasıl ayarlanır ve vardiya seçimi yapılır?


9

Geçici işaretleme modu etkinken Emacs'ın normal davranışı, bir kaydırma seçimi yaptığınızda, sonraki komutun kaydırma olmayan bir hareket olması durumunda işaretin devre dışı bırakılmasıdır. Örneğin, komutlardan sonra M-l(geçerli satırı aşağıdaki işlevle işaretlemek için) ve C-fişareti devre dışı bırakılır. Bu davranışı sonradan elisp'ten nasıl taklit edebilirim (set-mark-command nil)?

Örneğin:

(defun my-mark-current-line ()
  (interactive)
  (beginning-of-line)
  (set-mark-command nil)
  (end-of-line)
  (forward-char))

(global-set-key (kbd "M-l") 'my-mark-current-line)

Şimdi Ml Cf yapmak ve bölge büyüyecek, ama bunun yerine, varsayılan davranış, yani Cf zaman bölge devre dışı bırakmak istiyorum ve CSf ile büyümek istiyorum.

EDIT : buna izin veren set-mark-komutu için farklı bir işlev kullanmalı? Ben bulamadım.


Bunun mümkün olmadığına inanıyorum (ve yanlış olabilirim). Bir bölge aktif olduğu sürece, navigasyon komutları seçimi değiştirir. Vites değiştirme seçimi (bir bölgeyi etkinleştirme) + (navigasyon) C-S-file benzerdir . Muhtemelen istediğinizi, öncelikle bir bölgeyi aktifse devre dışı bırakan ve sonra ne yapar ( ); ve doğrudan bağlanın . Emacs'ı terminal modunda kullanırsanız ve her ikisinin de terminal ikisi arasında ayrım yapamayacağı gibi davranacağını unutmayın. C-SPCC-fC-fC-fforward-charC-S-fforward-charC-fC-S-fC-f
Kaushal Modi

Ayrıca yaptığınız sarıcı ve ciltleme C-f, kullandığınız tüm diğer gezinme komutları için de geçerlidir.
Kaushal Modi

btw C-fafter M-l, bölgeyi genişletmez, çünkü sonunda etkin bir bölge yoktur M-l( downcase-wordvarsayılan olarak bağlıdır ).
Kaushal Modi

1
@KaushalModi Bence M-lOP tarafından atıfta bulunulan varsayılan ciltleme ( downcase-word) değil,my-mark-current-line
nispio

gerçekten de @ nispio.
mikl

Yanıtlar:


8

Vites değiştirme ve işaretin geçici olarak etkinleştirilmesi komut döngüsü tarafından işlendiği için, bunlardan uygun vites seçimi davranışını elde etmek için hareket işlevlerinin etkileşimli sürümlerini çağırmanız gerekir:

;; (source: http://emacs.stackexchange.com/a/22166/93)
(defun my-mark-current-line ()
  (interactive)
  (beginning-of-line)
  (setq this-command-keys-shift-translated t)
  (call-interactively 'end-of-line)
  (call-interactively 'forward-char))

(global-set-key (kbd "M-l") 'my-mark-current-line)

Güncelleme:

Yukarıdaki cevabı yazdığımdan beri, vites seçiminin gerçekten kaputun altında nasıl çalıştığı hakkında biraz daha fazla bilgi edinmek için zaman ayırdım. Sembol değerini transient-mark-modeformun bir eksileri olarak ayarlar; (only . OLDVAL)burada OLDVALkaydırma seçiminden önceki değerdir.

Aşağıdaki çözüm call-interactively, işareti gerektiği şekilde etkinleştirerek ve öğesinin uygun değerini ayarlayarak kullanılmasını önler transient-mark-mode. Temel olarak, bu çözümün ilk çözümden daha az bir saldırı olduğunu düşünüyorum.

Bonus olarak, artık isteğe bağlı bir tekrar sayısı vardır ve işaret zaten etkinse mevcut seçimi her iki yönde genişletir.

;; (source: http://emacs.stackexchange.com/a/22166/93)
(defun my-mark-current-line (&optional arg)
  "Uses shift selection to select the current line.
When there is an existing shift selection, extends the selection
in the appropriate direction to include current line."
  (interactive "p")
  (let ((oldval (or (cdr-safe transient-mark-mode) transient-mark-mode))
        (backwards (and mark-active (> (mark) (point))))
        (beg (and mark-active (mark-marker))))
    (unless beg
      (if backwards (end-of-line) (beginning-of-line))
      (setq beg (point-marker)))
    (if backwards (end-of-line (- 1 arg)) (beginning-of-line (+ 1 arg)))
    (unless mark-active
      (push-mark beg nil t))
    (setq transient-mark-mode (cons 'only oldval))))

1
Her ikisi de mükemmel çalışıyor ve oldval şey çok faydalı! çok teşekkürler!
mikl
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.