Perilaku normal Emacs ketika mode tanda-transien aktif adalah bahwa ketika Anda melakukan pemilihan-shift, maka jika perintah berikutnya adalah gerakan non-shift, tanda dinonaktifkan. Misalnya, setelah perintah M-l
(untuk menandai baris saat ini dengan fungsi di bawah) dan C-f
, tanda dinonaktifkan. Bagaimana cara meniru perilaku itu dari elisp sesudahnya (set-mark-command nil)
?
Sebagai contoh:
(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)
Sekarang lakukan Ml Cf dan wilayah akan tumbuh, tetapi sebaliknya, saya ingin perilaku default, yaitu wilayah untuk menonaktifkan saat Cf, dan tumbuh dengan CSf.
EDIT : haruskah menggunakan fungsi yang berbeda untuk set-mark-command yang memungkinkan ini? Saya tidak dapat menemukannya.
C-S-f
dianalogikan denganC-SPC
(mengaktifkan suatu wilayah) +C-f
(navigasi). Anda mungkin bisa mendapatkan apa yang Anda inginkan dengan mengikatC-f
ke fungsi pembungkus yang pertama menonaktifkan suatu wilayah jika aktif dan kemudian mulai melakukan apa yangC-f
dilakukan (forward-char
); dan ikatC-S-f
langsung keforward-char
. Perhatikan bahwa jika Anda pernah menggunakan emacs dalam mode terminal,C-f
danC-S-f
keduanya akan berperilaku sebagaiC-f
terminal tidak dapat membedakan keduanya.C-f
akan berlaku untuk semua perintah navigasi lain yang Anda gunakan juga.C-f
setelahM-l
tidak memperluas wilayah karena tidak ada wilayah aktif di akhirM-l
(yang terikatdowncase-word
secara default).M-l
dirujuk oleh OP bukan pengikatan default (downcase-word
), tetapi pengikatan kustommy-mark-current-line
Jawaban:
Karena terjemahan shift dan aktivasi sementara mark ditangani oleh loop perintah, Anda perlu memanggil versi interaktif dari fungsi gerakan untuk mendapatkan perilaku pemilihan shift yang sesuai dari mereka:
Memperbarui:
Sejak menulis jawaban di atas, saya meluangkan waktu untuk belajar lebih banyak tentang bagaimana pemilihan shift benar-benar bekerja di bawah tenda. Ini menetapkan nilai simbol
transient-mark-mode
menjadi sel kontra bentuk(only . OLDVAL)
, di manaOLDVAL
nilai sebelum pemilihan shift.Solusi di bawah ini menghindari penggunaan
call-interactively
dengan mengaktifkan tanda sesuai kebutuhan, dan menetapkan nilai yang sesuaitransient-mark-mode
. Pada dasarnya, saya menganggap solusi ini kurang dari hack daripada yang pertama.Sebagai bonus, sekarang memiliki hitungan ulang opsional, dan akan memperpanjang pilihan saat ini di kedua arah jika tanda sudah aktif.
sumber