素材網站下載/口碑營銷的主要手段有哪些
確切地說,你不需要在IDE里面編寫或者閱讀代碼。
IDE用于Render資源文件比較合適,但處理文本,并不劃算。
這的文本文件,包括源代碼,配置文件,文檔等非二進制文件。
先說說IDE帶的便利:
- 函數或者變量的自動補全
- 函數或者類定義的跳轉
但這些便利,是有代價的。
IDE需要不斷地掃描項目中的源碼,這是一個詞法與語法分析的過程,與編譯過程類似,只是不產生機器碼而已。
這是一個非常耗時的過程,使用過Android Studio或者Eclipse的同學應該體驗深刻,項目啟動時實在太慢了。
啟動之后,文件已經有修改,特別是Git分支切換或者版本回滾時,整個機器卡殼幾十秒鐘是時常的事。
而且IDE還要求文件是可以編譯的,如果項目外文件或者項目文件不完整,還不能實現這兩個功能。
插一個真事,有一次搞ROS開發(fā),ROS包基本都是Cpp與Python,關鍵是ROS沒有IDE,而且開源的項目文件非常多,有幾個同事就瞎眼了。
經常找不到代碼在哪里,時不時要問我,哪個功能在哪里,就算知道代碼也找不到文件。這就是長期依賴IDE的后果。
所以,為這樣兩個功能,把機器搞得龜速,值得嗎?
解決方案
這個問題,要權衡利弊,以退為進 – 放棄IDE,停止這種耗時掃描
對付文本文件,直接可以采用蠻力搜索。
具體地說,想找某個符號定義,直接在整個目錄中搜索。對于庫中的符號,第一次手輸,之后使用字符串補全。
注意,這里對編程語言,項目能不能編譯,是沒有要求的。
看似暴力,但直接了當,邏輯簡單,綠色無污染。
因為單個文本文件,很少會超過10M, 而整個項目的所有文本文件累計很少會超過50M。
grep整個目錄通常就幾秒的事情,而且大部分情況是一瞬間的事。
這樣做的結果是:
- 不再依賴于任何IDE
- 不再依賴于項目管理
- 不再受限于編程語言
這個思想不限于Emacs,我這前使用Vim也是這樣干的。
不管Emacs還是Vim都是跨平臺的,意味著你從Windows到Unix甚至Mac都是如履平地的。
有什么比這個更加有吸引力?
Vim可以使用Quickfix實現同樣的功能。
這里只介紹Emacs的方案。
grep的關鍵一點是,可以反復地對結果進行篩選,這個非常非常重要。
想像一下grep一次給你1000條件記錄,有多大意義?
但如果可以再次在這個1000中篩選,那就非常不一樣。
簡單反復篩選可以做到萬里挑一!
舉例
按這個思想,在QMK項目中,找程序入口,
這是一個相當規(guī)模的開源項目, 除去lib下的文件都有30000多個,這是wc統(tǒng)計的結果:
think@DESKTOP-70MSAQ1 MINGW64 /f/AA-MyWork/QMK/keychron/qmk_firmware (mykeyboard-v1)
$ git ls-files | wc -l
37042
從三萬個文件中找出一個函數,并不容易:
-
搜索main, 得到7000多條記錄
-
搜索.c以過濾非C文件:
-
搜索void int, 原因main函數的參數或返回值無非這兩個
-
搜索全字匹配main:
至此,只有不到70項,可以肉眼找到程序入口了。
這個過程中的 所有buffer都是保留 ,意味著如果我第二步篩選的條件錯了,還可以回到第一步結果中搜索,直到你滿意。
這是包括Vim在內的很多軟件無法做到的,但這個在試錯過程中,又非常重要。
具體實現
代碼非常簡單,主要還是調用Emacs的grep與occur命令,再切換到結果窗口. 開頭幾行只為了保存歷史。
(global-set-key (kbd (concat custom-user-prefix-key "/")) 'ich/grep)
(global-set-key (kbd (concat custom-user-prefix-key "l")) 'ich/occur)(defun ich/grep ( pattern directory )(interactive(list(custom/select-a-pattern "Please input a pattern (grep): ")(custom/select-a-directory "Please select a directory (grep): ")) )(custom/search-history-add pattern)(custom/save-search-history)(setq old-directory default-directory)(cd directory) (grep (concat "rg . -n -H --no-heading -i -e " pattern))(cd old-directory) (setq find nil)(setq i 0)(while (and (not find) (< i (length (window-list))))(if (equal "*grep*" (buffer-name))(setq find t)(other-window 1))(setq i (1+ i)))(if find(quit-window))(switch-to-buffer "*grep*"))(defun ich/occur ( pattern )(interactive(list(custom/select-a-pattern "Please input a pattern (occur): ")))(custom/search-history-add pattern)(custom/save-search-history)(occur pattern)(setq find nil)(setq i 0)(while (and (not find) (< i (length (window-list))))(if (equal "*Occur*" (buffer-name))(setq find t)(other-window 1))(setq i (1+ i)))(if find(quit-window))(switch-to-buffer "*Occur*"))