用 vim 將 camel case 改成 underscore-based

昨天改這改到很累, 想到可以用 map 處理:
:map e a_<ESC>l~

接著用 /[a-z][A-Z] 搜可能是 camel case 的部份, 確定是的話就按 e 修正。接著按 n 跳到下個地方。遇到一片連續的 camel case, 就 nenenenenen ..... 用力的敲下去, 很有快感!

或是用 record 也 OK, 操作如下:
  1. qe  # 錄到 e 裡
  2. a_<ESC>l~ # 這裡是真的按 ESC 鍵
  3. q
之後一樣先搜到可疑之處, 若是的話按 @e 重播剛才錄下的操作。

2010-03-28 更新

感謝 keitheis 提供直接用 ex mode substitution 的作法, 簡化後的寫法如下:
:% s/\(\l\)\(\u\)/\1_\l\2/gc

關鍵在於後面的 \l (小寫 L) 會把下一個字元轉成小寫 (\u 則是轉大寫), 所以先用 regular expression (regexp) 記好前面的小寫 (\1) 和後面的大寫 (\2), 就很容易啦。之所以看起來這麼亂, 是因為 vim 的 regexp  語法大多要多加反斜線 。詳見 substitute 和 sub-replace-special

留言

  1. 上次沒張貼成功的……牛刀 :P
    %s/\(\l\w\{-}\)\(\u\w\)\(\l\w\+\)/\1_\l\2\3/gc

    回覆刪除

張貼留言

這個網誌中的熱門文章

(C/C++ ) 如何在 Linux 上使用自行編譯的第三方函式庫

熟悉系統工具好處多多

virtualbox 使用 USB 裝置