2014-02-21 23 views
4

我對elisp相當陌生,但我真正想知道的一件事是要麼等待ace-jump在執行指令之前等待結束,要麼等待從某個位置王牌跳躍,而不是移動我的光標。我的目標是能夠選擇一條具有ace-jump的線,複製它,然後將其粘貼到我目前線的正上方。我開始時嘗試先用ace-jump進行一系列的操作,然後複製到位,但這並不奏效。下面是我爲:用Ace-Jump複製emacs中的一行

(defun ace-jump-yank-line-above() 
    (interactive) 
    (ace-jump-line-mode) 
    (kill-ring-save (line-beginning-position) (line-beginning-position 2)) 
    (yank) 
) 

但是這給了我奇怪的行爲

回答

0

好了,這些都不爲我工作,但我用這些答案創建一個腳本的作品。下面是我使用的代碼:

;; The base function for the line-based ones 
(defun ace-jump-end-do (dfunc afunc) 

    ;; Save where to return to as a marker 
    (setq ace-jump-do-retpos (make-marker)) 
    (set-marker ace-jump-do-retpos (point)) 
    ;; Add our during function to the hook 
    (setq ace-jump-mode-end-hook 
     (list `(lambda() 
       (progn 
       (setq ace-jump-mode-end-hook) 
       (,dfunc) 
       (goto-char ace-jump-do-retpos) 
       (set-marker ace-jump-do-retpos nil) 
       (,afunc) 
       )))) 

    (ace-jump-line-mode) 
) 

;; Copy the line above the current line 
(defun ace-jump-yank-line-above() 
    (interactive) 
    (ace-jump-end-do 
    ;; At the line 
    (lambda() 
    ;; Store the line in a variable 
    (setq line (buffer-substring-no-properties (point-at-bol) (point-at-eol))) 
    ) 

    ;; Upon returning 
    (lambda() 
    (save-excursion 
     (goto-char (point-at-bol)) 
     (insert (concat line "\n")) 
     ) 
    (when (bolp) (goto-char (point-at-bol 2))) 
))) 

不幸的是,這種復位王牌跳每次它被稱爲時間結束鉤。它適用於我,雖然我沒有任何其他東西掛鉤它。如果我遇到問題,我需要找出其他的東西。

2

我用這樣類似的ACE跳躍,而不是王牌跳本身的東西,但東西應該工作(不能可以肯定的呼叫王牌跳線模式):

(defun ace-jump-yank-line-above() 
    (interactive) 
    (let ((loc (point-at-bol)) 
     (line nil)) 
    (save-excursion 
     (ace-jump-line-mode) 
     (setq line (buffer-substring-no-properties 
        (point-at-bol) (point-at-eol))) 
     (goto-char (1- loc)) 
     (if (bobp) 
      (insert (concat line "\n")) 
     (insert (concat "\n" line)))))) 
+0

出於好奇,「ace-jump」是什麼樣子,而不是「ace-jump」本身? – PythonNut

+0

漫長而沉悶的故事;簡短的版本是我正在編寫一個軟件包,以便在後者出來時做ace-jump。從來沒有打擾過釋放它,但也從來沒有打擾切換。 – Dan

+0

出於某種原因,ace-jump不喜歡和保存遊覽一起玩。光標不會返回到它開始的位置。它只停留在甲板跳躍的地方。 – user1539179

4

你可以看看我的項目lispy.el的來源。 它有幾個功能,使用ace-jump-mode後做些事情。 例如lispy-ace-symbol將ace跳轉到符號並標記它。 這裏的執行細節 - 關鍵是設定ace-jump-mode-hook

(defun lispy--ace-do (x bnd &optional filter func no-narrow) 
    "Use `ace-jump-do' to X within BND when FILTER return t. 
When FUNC is not nil, call it after a successful move. 
When NO-NARROW is not nil, don't narrow to BND." 
    (require 'ace-jump-mode) 
    (lispy--recenter-bounds bnd) 
    (unless no-narrow 
    (narrow-to-region (car bnd) (cdr bnd))) 
    (when func 
    (setq ace-jump-mode-end-hook 
      (list `(lambda() 
        (setq ace-jump-mode-end-hook) 
        (,func))))) 
    (let ((ace-jump-mode-scope 'window) 
     (ace-jump-search-filter filter)) 
    (ace-jump-do x)) 
    (widen)) 
0

ace-jump-mode真的很愚蠢......調用它只是進入一些無用的次要模式,在那裏你選擇提示,但它是非阻塞的:之後的任何代碼都會立即執行。

這種交互方式有很大的潛力,而ace-jump-mode完全可以用瘋狂的實現浪費掉。它也不適用於保存遊覽,你需要用各種鉤子和狀態變量來解決這個問題。

我寫了一個新的軟件包解決所有這些問題,你可以在https://github.com/Fuco1/better-jump但願人們發現它會撿起來,但它所及至少。花了我大約2個小時來編寫基本工作原型,它已經涵蓋了ace-link,ace-window和ace-whatever-else-you-can-find(也是ace-jump,顯然:)等軟件包的所有功能)