我正在寫一些自定義函數以特定方式移動點,並且遇到問題以正確管理標記&區域。 爲了說明的目的,下面是幾行代碼,它們的確沒有多大作用,它們只是將[home]鍵綁定到一個自定義函數,用於檢查標記是否已經激活 - 如果不是,它會暫時啓用transient-標記並設置標記。在所有情況下,它都會像您期望的那樣稱爲「開始行」。瞬態標記模式和cua模式之間的相互作用?
(defmacro setq-local (var val)
(list 'set (list 'make-local-variable (list 'quote var)) val))
(defun my-beginning-of-line()
(interactive)
(message "entering my-beginning-of-line: transient-mark-mode = %s" transient-mark-mode)
; Straight from "handle-shift-selection" in emacs 25.2
(unless (and mark-active (eq (car-safe transient-mark-mode) 'only))
(setq-local transient-mark-mode (cons 'only (unless (eq transient-mark-mode 'lambda) transient-mark-mode)))
(push-mark nil nil t))
(beginning-of-line)
(message "exiting my-beginning-of-line: transient-mark-mode = %s\n" transient-mark-mode))
(global-set-key [home] 'my-beginning-of-line)
所以,現在讓我們考慮兩種方案:
- [首頁] - 任何非位移光標移動鍵 - [首頁]
- [首頁] - 任何移動光標移動鍵 - [家]
在Emacs 24.4及更高版本,一切的行爲如我所料:
- [首頁]的第一次出現暫時啓用了瞬態標記(transient-mark-mode =(only。 OLDVAL)。該標記然後通過任何未移位光標運動命令去激活,和暫態標記模式恢復到OLDVAL如在[家]的後續調用觀察
- 不同的是,偏移的光標運動鍵離開標記活性並暫時啓用臨時標記。對[家]的最後一個實例仍然可以是瞬態標記模式=(只。OLDVAL)進入時,我的自定義函數
現在,在Emacs 24.3和早期版本的觀察,我仍然得到同樣的cua-mode被禁用時的行爲。 但是,當啓用cua模式時,我不明白的是在場景#2中進行的操作。在這種情況下,似乎有一些交互作用,並且某些事物(CUA?)會停用標記並將瞬態標記模式恢復爲OLDVAL。任何人都可以解釋發生了什麼,甚至可能更好,如何編寫我的自定義函數,以便它在所有情況下都具有所需的行爲? (emacs的24或25,使CUA模式與否)