2009-07-06 68 views
92

什麼是實現類似代碼摺疊的最佳方式,或者組織模式使用的循環類型。在elisp中創建這種類型的行爲最好的解決方案是什麼?編輯: 對不起,我不清楚。我想在elisp中編寫一些與代碼摺疊非常相似的東西,或者實際上最類似於可以擴展的層次結構的org模式。我想知道實現這種影響的最佳方法。我想我聽說emacs覆蓋是一個很好的解決方案,但我不知道。如何在Emacs中實現代碼摺疊效果?

至於摺疊我只使用內置的設置選擇性顯示

編輯號2:

感謝您的答案,但我想我問錯了問題,所以讓我嘗試更多清楚我正在嘗試做什麼。我想創建以下內容

當你把一個函數放在一個函數上並調用這個elisp函數時,它將把函數定義從任何地方(我正在考慮爲此使用find-tag)展開並展開它在當前緩衝區中。這個想法是,如果你不得不跳轉到不同的緩衝區來讀取函數定義,我覺得它的上下文切換到另一個文件。所以我希望它像代碼摺疊一樣行爲,只是它從緩衝區拉入外部代碼。這提出了一些問題,因爲它不能將代碼粘貼到緩衝區中,或者如果有人保存它,它將保存拉入的代碼。所以我想知道是否有辦法在緩衝區內創建一個也不是緩衝區的區域。我認爲這是有道理的。

+0

您正在尋找的東西,當你用函數CALL中的點來調用它時,它會跳轉到函數定義?有點像獲得關於elisp函數的幫助會讓你跳到elisp代碼?我不認爲如果沒有「項目」的概念,你就可以做到這一點例如,你怎麼知道你想跳到哪個「交換」功能? – 2009-07-30 19:12:52

+1

另請參閱:http://stackoverflow.com/questions/382781/emacs-equivalent-of-vims-foldmethod-indent/448724#448724其中選擇性顯示被調整了一些摺疊式效果。 – 2010-02-17 14:31:26

+0

我建議你刪除你的`EDIT NB 2`,併爲它提出一個新的問題。 – Stefan 2017-06-08 13:09:16

回答

132

摺疊通常與emacs的不必要的,因爲它具有明確實施人們在摺疊代碼時手動執行的操作的工具。

大多數人通過簡單的增量搜索取得了很好的成功。請參閱某處的「foo」?鍵入C-sfoo,找到定義,按回車鍵,讀取它,然後按C-xC-x回到原來的位置。簡單而且非常有用。

大多數模式支持i菜單M-ximenu將讓你跳轉到名稱的函數定義(等)。您還可以將它綁定到鼠標單擊以獲取功能菜單(或將其添加到菜單欄;有關更多詳細信息,請參閱「信息」頁面)。它提供了哪些函數模式的數據,這可以讓您看到模式行中當前處於哪個函數。 (爲什麼你的功能這麼長,雖然?)

還有speedbar,它以圖形方式顯示imenu信息(和其他東西)。

如果你希望得到您的文件的概述,嘗試的Mxoccur」給定一個正則表達式,它會創建與當前緩衝區每個匹配新的緩衝區,你可以搜索‘(defun定義’來獲得點擊結果會將你移動到文件中的那個位置

所以無論如何,想一想你真正想達到的目標,而Emacs可能會實現這個目標。不完美的工具,讓你摺疊和展開不斷的東西。

20

我使用大綱次要模式折我的Python代碼。不需要像摺疊模式那樣放置{{{和}},它使用塊定義的位置。

http://www.gnu.org/software/emacs/manual/html_node/emacs/Outline-Mode.html http://www.emacswiki.org/emacs/OutlineMinorMode

我敢肯定,它與emacs的。我再補充這我的.emacs

;;======= Code folding ======= 
(add-hook 'python-mode-hook 'my-python-outline-hook) 
; this gets called by outline to deteremine the level. Just use the length of the whitespace 
(defun py-outline-level() 
    (let (buffer-invisibility-spec) 
    (save-excursion 
     (skip-chars-forward " ") 
     (current-column)))) 
; this get called after python mode is enabled 
(defun my-python-outline-hook() 
    ; outline uses this regexp to find headers. I match lines with no indent and indented "class" 
    ; and "def" lines. 
    (setq outline-regexp "[^ \t]\\|[ \t]*\\(def\\|class\\) ") 
    ; enable our level computation 
    (setq outline-level 'py-outline-level) 
    ; do not use their \[email protected] prefix, too hard to type. Note this overides some bindings. 
    (setq outline-minor-mode-prefix "\C-t") 
    ; turn on outline mode 
    (outline-minor-mode t) 
    ; initially hide all but the headers 
    ;(hide-body) 
    ; make paren matches visible 
    (show-paren-mode 1) 
) 
+6

看起來像`outline-mode`在emacs 24中支持python開箱即用 - 無需自定義的大綱級功能。這就是我需要添加到我的`user.el`中的全部內容:`(加鉤子'python-mode-hook'outline-minor-mode)` – scytale 2012-05-09 09:40:15

+0

哦,你一定要覆蓋`outline-minor-mode-prefix ` - 默認的鍵盤綁定很糟糕 - 我使用`(setq outline-minor-mode-prefix(kbd「C - ;」))` – scytale 2012-05-09 09:42:06

11

您可以通過使用與CEDET按照init文件代碼還可以獲得代碼摺疊:

(global-semantic-folding-mode t) 

這段代碼的評估後,小三角形將出現在fringle區域,因此您可以使用它摺疊代碼&。該方法是更精確,因爲它使用句法信息,從源代碼中提取

78

隱藏式顯示模式(hs-minor-mode)使用默認鍵綁定C-c @ C-M-h觸發摺疊(hs-hide-all

1

我相信您的「項目」與摺疊的比較不是很好,因爲摺疊是關於在保持緩衝區內容完整(文本)的同時更改外觀。您的項目將涉及顯示額外的文本,同時保持緩衝區內容完整,AFAIU。所以。它不能作爲文本插入和摺疊的組合來實現(然後,緩衝區內容將被改變)。

但也許,它的確可以使用相同的機制,因爲摺疊是用「覆蓋」來完成的......考慮「前串」和「後串」overlay properties;也許,你可以把你的函數定義放到屬於這個零長度覆蓋的字符串中。查看outline-flag-region函數以查看在大綱模式中如何使用疊加層。

9

hs-minor-mode很漂亮。

與fold-dwim配合使用時會更加美觀(按照我的意思)。然後是fold-dwim-org,它爲代碼摺疊提供組織模式,如鍵綁定!兩者都可以通過果醬安裝(我認爲elpa)。

19

另一種方法對皮膚的貓:

碰巧,你不需要任何包裝或額外的配置 這一點。只要到任何的源文件,類型

M-1 C-X $和魔術發生!

像往常一樣,它是白色的魔法:C-x $將帶回您的代碼。

我們可以使用Emacs的幫助系統,發現這是怎麼回事:章ķCX $ 告訴我們,以上組合鍵調用 集選擇性顯示,這需要一個數值參數的函數 (M-1前綴傳遞1作爲該參數的值),並且,不出所料,將變量selective-display設置爲該參數的值爲 。

minor emacs wizardry blog

只是爲了完整性:M-3 C-X $將顯示更深層次的嵌套代碼等。

FWIW我今天做了一個基於smth的小助手。發現here使得F5切換代碼基於當前光標位置摺疊:

(global-set-key (kbd "<f5>") 'set-selective-display-dlw) 

(defun set-selective-display-dlw (&optional level) 
"Fold text indented same of more than the cursor. 
If level is set, set the indent level to LEVEL. 
If 'selective-display' is already set to LEVEL, clicking 
F5 again will unset 'selective-display' by setting it to 0." 
    (interactive "P") 
    (if (eq selective-display (1+ (current-column))) 
     (set-selective-display 0) 
    (set-selective-display (or level (1+ (current-column)))))) 
1

vimish-fold也是一個很好的和簡單的解決方案。

https://github.com/mrkkrp/vimish-fold

在首頁:

這是爲了像在Vim中執行文本摺疊的包裝。它具有以下功能:

  • 活動區域的摺疊;
  • 良好的視覺反饋:很明顯文本的哪一部分被摺疊;
  • 默認爲持久性:當您關閉文件時,摺疊不會消失;
  • 持久性可以很好地擴展,您可以處理數百個有很多摺疊但沒有不利影響的文件;
  • 它不會打破縮進或什麼;
  • 摺疊可以從摺疊狀態切換到展開和非常容易回來;
  • 現有褶皺之間的快速導航;
  • 你可以用鼠標展開褶皺(對於初學者而言不僅適用於他們);
  • 對於avy軟件包的粉絲:您可以使用avy以最少的按鍵次數摺疊文本!

使用優秀use-package我安裝在我的配置使用這個片段激活:

(use-package vimish-fold 
    :ensure t 
    :config (vimish-fold-global-mode t)) 
1

如果使用hs-minor-mode,它可能是一個好主意,還設定了更方便快捷,例如:

(eval-after-load 'hideshow 
'(progn 
    (global-set-key (kbd "C-+") 'hs-toggle-hiding)))