這一篇是紀錄一些指令與設定,

包括 find+grep.screen.vimdiff + vi 設定檔+Visual block

 

====尋找檔案===================================

尋找資料夾與子資料夾內, "檔名" 有 AAA 的所有檔案

    $ find . -name *AAA*

----------------------------------------------------------------------

尋找資料夾與子資料夾內, "檔案內容" 有 AAA 的所有檔案

    $ grep -r AAA *

----------------------------------------------------------------------

grep 得到的結果通常太多了,所以實際上是使用下列複合的指令

 

找出目錄及子目錄中,所有呼叫或定義 func_name 的 .c or .h

    $ find . -name "*.[ch]" -exec grep -Hwn "func_name" {} \;

----------------------------------------------------------------------

列出資料夾中,所有呼叫 func_name 的 .c or .h

    $ grep -m 1 -Hw "func_name" *.[ch] | cut -d':' -f1

 

----------------------------------------------------------------------

找出兩天內有變更過的 .c or .h 檔案

    $ find . -type f -mtime -2 -name "*.[ch]"

 

----插個花------------------------------------------------------------------

將編譯時包括 waring 的訊息(STDOUT+STDERR)輸出至 msg.txt

    $ make &> msg.txt


==== Screen ===================================

screen 模式,等於讓 pietty 可以開分頁

1. pietty 連線進入主機後

2. 下 screen 這個指令進入 screen 模式 (會在 分頁 0)

    就開始可以操作分頁了!

3. Ctrl+a  + c  建立新的screen (多一個 分頁 1)

4. Ctrl+a  + n 切換至下一個screen; Ctrl+a + p 切換至前一個screen

5. exit 離開這個 分頁

----------------------------------------------------------------------

另外有一些方便管理的指令,

1. Ctrl+a  +  A (先按 Ctrl+a ,放開沒關係,再按 shift+a)

    可以 rename 這個 分頁 的名字,不然預設都是 "2$* bash" 之類的,很難分

2. Ctrl+a => 打指令  :sessionname myName

    可以將整個 screen 的 session 設成我要的 name,跟以下的指令配合

3. Ctrl+a  +  d   可以暫時離開 screen 的界面 (Detached)

4. 當你 Detached 後,下 screen -ls 的指令可以看到

    There is a screen on:
        28833.myName.localhost   (Detached)

5. 你可以靠 screen -r 28833 或是 (如果沒有改過 session 的 name 的話)

                 screen -r myName  來重新 attached 回 screen 的界面

6. Ctrl+a  =>  :quit   可以關閉這個 screen session 的所有分頁並跳出

----------------------------------------------------------------------

基於使用習慣,我會希望在畫面的最下面一行顯示分頁,

而非預設的在視窗的 windows_name 的部份顯示,

因此,我會去修改 /etc/screenrc 這個檔案,

將原本 241 行 mark 掉,改成 243 行 的寫法:

    241 #hardstatus string "[screen %n%?: %t%?] %h"

    242 # Add by WeCan

    243 hardstatus alwayslastline '%-Lw%{= BW}%50>%n%f* %t%{-}%+Lw%< %0C'

事實上,在多人共用的主機上,較正確的做法是在個人的家目錄底下,

新增一個檔案 .screenrc

然後在裡面加上這一行

hardstatus alwayslastline '%-Lw%{= BW}%50>%n%f* %t%{-}%+Lw%< %0C'

 

==== vimdiff ====================================

在比對檔案的部份,除了 diff、sdiff 之外,我覺得 vimdiff 是個好用的指令

不過…因為我是在 windows 上,用 pittey 去連我的 linux server,

所以有兩台主機,不是一台,

因此,我是直接在 linux 上架 SAMBA,

(讓 windows 可以像連網芳一樣連 linux,
 ex: 在"我的電腦"的網址列打 \\wecan 就連過去linux那台了)

要比對檔案就直接開網芳從 linux 上把檔案拉過來,

直接用 WinMerge 這個軟體去看去比對、去修改,
(在 windows 底下我覺得很好用的比對檔案軟體)

so,如果也有兩台電腦的情況下,我覺得這樣是不錯的方法,

一邊 windows 這邊開圖型界面的程式比對,一邊用 linux 做修改,

軟體的界面會比較 friendly ,至少有好拉動的 bar,

還有一個隱含的好處是…  至少會備份一份起來! XD

 

不過…如果是只有一台 Linux 的情況,

尤其當你想要 "參照 b 檔案,編輯 a 檔案" 的時候,

我會推荐下面的做法,

    $ vimdiff a_file b_file

 

vimdiff 有 "有顏色標示"."可以直接編輯"."畫面分割清楚" 等優點

其中顏色標示的部份,不僅會把不同的行標出來,

同一行中還會把不同的地方標出來,(不容易眼殘)

另外,有差異、或是沒有這一行…等,也會有不同的顏色顯示

 

預設的情況下,會把相同的部份給隱藏,只把有差異部份的前後n行顯示出來

(隱藏,或者說"折疊"的部份,可以靠一些指令展開或再度收起,如:
 zo 將游標所在處的折疊打開.open
 zc 將游標所在處已打開的內容再度折疊起來.close
 zr 將全文的所有折疊依層次通通打開.reduce
 zm 將全文已打開的折疊依層次通通再折疊起來.more)

 

可以下指令 :set nu 來顯示行號,事實上,

我是透過待會會說到的設定檔,讓 vi 每次開啟檔案就會預設帶入行號

 

另外,其實也不止可以編輯 a 檔案,

可以靠 "連按兩次 ctrl+w" 切換你要編輯的文件,

這部份,可以參考 :help vsp 這個功能。(落落長  重要的部份不多  囧)

(其實 vimdiff = vi + :vsp filename + :set scb diff …  把一些設定給包起來)

vimdiff的功能其實很強大,不過有時還是愛用 WinMerge,

因為 vimdiff …或者說 vi 這種文字界面,要不停的換 page 找地方還是很麻煩,

視窗界面的 WinMerge 拉一拉就好了,很方便  哈哈~

 

==== vi 設定檔 ====================================

在使用 vi 編輯一個檔案的時候,會預先讀入一些設定檔,

幫助格式的設定、文件類型的辨別… 等等,

在編輯一個 .c 檔案時,vi 會先跑的 script 的 typical flow 大概如下:

  1: /etc/vimrc
  2: /usr/share/vim/vim63/syntax/syntax.vim
  3: /usr/share/vim/vim63/syntax/synload.vim
  4: /usr/share/vim/vim63/syntax/syncolor.vim
  5: /usr/share/vim/vim63/filetype.vim
  6: /wecan/.vimrc
  7: /usr/share/vim/vim63/plugin/explorer.vim
  8: /usr/share/vim/vim63/plugin/gzip.vim
  9: /usr/share/vim/vim63/plugin/netrw.vim
 10: /usr/share/vim/vim63/plugin/rrhelper.vim
 11: /usr/share/vim/vim63/plugin/tohtml.vim
 12: /usr/share/vim/vim63/syntax/c.vim

在這裡的重點是第六項,

我們可以在自己使用者的家目錄下建立一個 .vimrc 檔案,

來依照自己的喜好預設 vi 開啟時的行為。 (客製化正夯!

 

事實上,其實我會把自己的設定弄在這個檔案,而非之前說的 vi /etc/vimrc,

讓系統預設的永遠保持原來的,會是比較安全的做法,

而放在自己家目錄底下的 .vimrc 只會影響該帳號的使用者,不會影響其他帳號

(ps1. 可透過指令 cd ~ 切換至使用者之家目錄)
(ps2. 取名為 .xxxx 即為隱藏屬性的檔案,需透過 ls -a 方能列出)

 

以下,分享個人 .vimrc 的內容,

其中開頭有 " 的為註解文字,

在 diff 中將 wrap 打開可能會有問題,會在文末再補註

不過我算是大費周章的才終於寫出這個指令,

(trace 了 vi 開檔,建立 buffer、create window、進入vim、
 開第二個window…的各個時間點,然後找到了從來沒用過沒看過的 windo 指令)

所以… 用 mark 掉的方式當作紀念吧

=========================================================

" 設定 vi 編輯器為黑底控顏色
set bg=dark

" 預設編輯檔案時會顯示行號
set nu

" 按 F7 可以切換是否顯示行號
" (有行號較易閱讀,要複制時需要將行號拿掉,用快速鍵可以節省時間)
map <F7> :set nu!<BAR>set nu?<CR>
" 按 F8 可以切換是否高亮度顯示搜尋字串
" (有時搜尋某個 patten 後,在下一個文件還是會高亮顯示,很煩 = =)
map <F8> :set hls!<BAR>set hls?<CR>

" 給 vimdiff 用 (比較 A 檔 與 B 檔 的差異)
if has("diff")
   " 設定超過的部份會自動換行,適合搭配顯示行號使用
   " (方便能看得出來是在同一行的東西,但是可能會有問題)
   " au VimEnter * windo set wrap
   " 設定各種差異時,標示的顏色
   " Add 代表新增的一行, Delete 代表刪除的一行,
   " Change 代表有差異的一行,Text 代表有差異的這一行中,具有差異的部份
   hi DiffAdd ctermfg=Grey ctermbg=DarkBlue guifg=Grey
   hi DiffDelete ctermfg=Grey ctermbg=DarkRed guifg=Grey
   hi DiffChange ctermfg=Black ctermbg=DarkGreen guifg=Black
   hi DiffText ctermfg=Black ctermbg=DarkCyan guifg=Black
endif

" 設定按 Tab 的時候,是跳四格(預設是八格)
set tabstop=4
" 設定將 Tab 展開成空格(這樣在不同的電腦、編輯器中,所見結果皆同)
set et
" 設定在 Makefile 裡不將 tab 展開 (Makefile 裡必需是 Tab 不能是空格)
au BufEnter ?akefile*,*.mk  set noet

" 判斷 c 的格式,在括號後會自動縮排
set cin
" 每次縮排的空格為 4 個字元
set shiftwidth=4

" 解決貼上時,因為 set tabstop 與 set cin 可能造成的問題
set paste

" 在右下角顯示組合指令目前的輸入狀態
(例如在 vi 中跳到 7 行之後, 7+j 會先顯示出 7,確保你沒有誤按到其他鍵)
set showcmd

" 程式編輯完後,寫回磁碟之前,讓 vim 將每一行之後的空白拿掉,以節省空間
au FileType c,cpp,h au BufWritePre <buffer> :call
setline(1,map(getline(1,"$"),'substitute(v:val,"\\s\\+$","","":q:

==================================================

不過,在 diff 中,預設把 wrap 打開是有可能造成問題的,
當你在 vi 中,

:h diff (看 diff 的 help 檔)
/wrap (搜尋 wrap 這個 patten)
n (找 next)

會看到這樣的說明…
The alignment of text will go wrong when:
- 'wrap' is on,
  some lines will be wrapped and occupy two or more screen lines

實際使用上,會有左右可能差了幾行而不是真正對齊的問題,
因此,在需要 wrap 的時候,我會直接在 vi 中對兩個視窗分別下指令把 wrap 打開

BTW,使用 vimdiff 要離開的時候,
可以透過 :wqa or :qa! 同時把檔案關閉並(儲存 or 不儲存)

 

==== Visual block ==============================

當對一個相似的區塊做類似的修改時,

Vi 的 Visual block 是個好用的功能

                  MODULE_PARA(aaa          module_param(aaa

( 例如要把    MODULE_PARA(bbb   改成  module_param(bbb  時)

                  MODULE_PARA(ccc            module_param(ccc

1. 移至起始點

2. Ctrl+V 進入block visual mode

3. 選取範圍

4. 按 c 來 change 文字,or 按 i 來 insert 文字

5. 按 <ESC> 回到正常模式,即可見所得結果

http://en.wikibooks.org/wiki/Learning_the_vi_editor/Vim/Modes

==================================================

囧rz~~~~  筆記得好累  囧rz~~~~~

LiWeCan 發表在 痞客邦 PIXNET 留言(1) 人氣()


留言列表 (1)

發表留言
  • JY
  • Wow~內容好多!
    一定花了不少時間整理