2017-08-31 40 views
0

我正在寫一些自定義函數以特定方式移動點,並且遇到問題以正確管理標記&區域。 爲了說明的目的,下面是幾行代碼,它們的確沒有多大作用,它們只是將[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) 

所以,現在讓我們考慮兩種方案:

  1. [首頁] - 任何非位移光標移動鍵 - [首頁]
  2. [首頁] - 任何移動光標移動鍵 - [家]

在Emacs 24.4及更高版本,一切的行爲如我所料:

  1. [首頁]的第一次出現暫時啓用了瞬態標記(transient-mark-mode =(only。 OLDVAL)。該標記然後通過任何未移位光標運動命令去激活,和暫態標記模式恢復到OLDVAL如在[家]的後續調用觀察
  2. 不同的是,偏移的光標運動鍵離開標記活性並暫時啓用臨時標記。對[家]的最後一個實例仍然可以是瞬態標記模式=(只。OLDVAL)進入時,我的自定義函數

現在,在Emacs 24.3和早期版本的觀察,我仍然得到同樣的cua-mode被禁用時的行爲。 但是,當啓用cua模式時,我不明白的是在場景#2中進行的操作。在這種情況下,似乎有一些交互作用,並且某些事物(CUA?)會停用標記並將瞬態標記模式恢復爲OLDVAL。任何人都可以解釋發生了什麼,甚至可能更好,如何編寫我的自定義函數,以便它在所有情況下都具有所需的行爲? (emacs的24或25,使CUA模式與否)

回答

0

我相信我有一個答案的開始。 顯然有兩個問題。

第一個必須做與CUA的執行 - 命令後處理程序-1在Emacs 24.3和更早的版本,其中包含此:

;; Disable transient-mark-mode if rectangle active in current buffer. 
    (if (not (window-minibuffer-p (selected-window))) 
     (setq transient-mark-mode (and (not cua--rectangle) 
        (if cua-highlight-region-shift-only 
        (not cua--explicit-region-start) 
         t)))) 

的第二個問題是由一般到「cua-模式「:啓用時,似乎將'shift-select-mode'更改爲'nil'(在emacs 24.3及更早版本中)。 手動強制「按住Shift鍵選擇模式」使CUA模式後,T還似乎不是一種可行的選擇,雖然,作爲一般的換擋選擇(沒有我的自定義[家居]在所有涉及)中,這是完全搞砸了案件。

雖然我隱約明白爲什麼事情不工作,我還是完全不清楚如何寫在我的.emacs自定義功能,可以以24.3的版本工作,以及24.4