簡體   English   中英

如何使用 emacs 重構 C++ 源代碼?

[英]How can I refactor C++ source code using emacs?

我主要對 C++ 和方法/類名/簽名自動更改感興趣。

在最近的 Emacs 版本 (24) 中,Semantic 能夠做到這一點。

  1. 可能激活語義模式Mx 語義模式 RET
  2. 使用Cc, g調出 Symref 緩沖區。
  3. Cc Ce打開所有參考文獻。
  4. R重命名。

如果你可以在 elisp 中編程,你可以從CEDET 庫中尋找 cedet + srecode 的組合——它為這項任務提供了所有工具——查找函數的調用者,獲取簽名等。但是你需要自己創建重構工具,使用這些工具

我經常這樣做,所以我也在焦急地等待其他答復。

我知道的唯一技巧是非常基本的。 以下是我在重構代碼時在 Emacs 中最好的朋友:

M-x query-replace

這允許您進行全局搜索和替換。 當您將方法和常用數據移動到其他類或命名空間時,您會經常這樣做。

C-x 3

這為您提供了一個並排顯示兩個緩沖區的顯示。 然后,您可以繼續在其中加載不同的文件,並使用Cx o將 cursor 從一個移動到另一個。 這是非常基本的東西,但我之所以提到它是因為它使下一個...

C-x (
(type any amount of stuff and/or emacs commands here)
C-x )

這就是在 emacs 中定義宏的方式。 任何時候你發現自己需要對一堆代碼一遍又一遍地做同樣的事情(而且對於查詢替換來說太復雜了),這就是救命稻草。 如果你搞砸了,你可以點擊Cg來停止宏定義,然后撤消( C-_ )直到你回到你開始的地方。 調用宏的鍵是Cx e 如果您想多次執行此操作,可以Esc並先輸入一個數字。 例如: Esc 100 Cx e將嘗試調用您的宏 100 次。

(注意:在 Windows 上,您可以通過按 Esc 鍵或按住 Alt 來獲得“Meta”)。

我想說,當前的(2021)state 是使用 emacs lsp-mode和合適的語言服務器。

使用提供“語言服務器協議”(lsp)並連接到lsp-modeclangdccls ,您可以使用以下方式重構名稱:

Mx lsp-重命名

為了簡化此設置,我建議將Spacemacsc-c++lsp層一起使用(並使用clangd )。

對於介於重構工具和簡單正則表達式之間的某個地方,從 Emacs 22 開始,您可以在替換文本中嵌入任意 elisp 表達式,這使您可以進行非常強大的文本操作。 Steve Yegge 不久前寫了一篇很好的文章

我的一個朋友在玩xrefactory ,說它工作得很好。 不過它並不便宜。

構建 cscope 符號。

查找要重構的符號。

進入 cscope window,並在第一次出現 cursor 后啟動宏

  • ret
  • cf你的符號開始
  • 導航到符號的開頭
  • 修改單詞
  • cx o(返回 cscope)
  • n(用於下一個 cscope 符號)

你現在必須 cx ce

我完全同意查找和替換工作正常。 然而,cedet 的一個非常好的特性是“semantic-symref-list”。

在方法上使用 cursor,運行此命令,您將看到一個緩沖區,其中列出了代碼中引用此標記的所有位置。

您仍然可以使用查找和替換技巧,這將確認您已更改所有引用。

我一直在為我的 C++ 完成使用cquery ,它使用 Microsoft LSP 進行 IDE <-> 工具通信。 cquery服務器使用 clang 后端滿足 LSP 協議的請求。

lsp-emacs是 package ,它位於 emacs 和cquery后端 (cquery-emacs) 之間,它公開了一個lsp-rename ZC1C425268E68385D1AB5074C17A94F。 順便說一下, cquery作為一個補全系統,一直非常可靠和快速,強烈推薦。

試一試,按照cquery github 上的入門指南進行操作: https://github.com/cquery-project/cquery/wiki/Emacs

完成 cquery設置后:

  1. Hover 您的 cursor 在您想要重命名的標識符(類、變量等)上。
  2. Mx lsp-rename
  3. 輸入標識符的名稱。
  4. 執行C-x s (保存一些緩沖區),這將提示您保存重構所觸及的所有緩沖區。

您可能應該通過所有修改過的緩沖區 go 並檢查使用任何工具/語言重構后所做的工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM