find+grep.screen.vimdiff + vi 設定檔+Visual block - Linux

Noah avatar
By Noah
at 2009-10-21T20:08

Table of Contents

http://liwecan.pixnet.net/blog/post/28306253

==


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

包括 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~~~~~

--

--
Tags: Linux

All Comments

Irma avatar
By Irma
at 2009-10-24T18:19
nu那邊 可以試試 :set invnu inv就是切換
Connor avatar
By Connor
at 2009-10-28T16:15
感謝分享^^

使用pietty呼叫gui程式

Madame avatar
By Madame
at 2009-10-21T19:42
想要用pietty呼叫一些有gui的程式 並不是在windows視窗出現, 而是在remote端執行 但是當我打下amule 卻顯示 Error: Unable to initialize gtk, is DISPLAY set properly? 嘗試著google卻沒找到解法 麻煩知道如何操作的版友講 ...

如何讓linux自動sleep/reboot 500次

Hedwig avatar
By Hedwig
at 2009-10-21T19:19
我也來改一下,(本人超弱的) #!/bin/bash # 計算次數 if [ -x /home/count.txt ]; then count=1 else count=`cat /home/count.txt|wc -l` fi # 測試 if [ $count -lt ...

首次登入系統FC圖形介面安裝完當機

Zora avatar
By Zora
at 2009-10-21T18:14
我買鳥哥的書,基礎學習第二版 我從第一章看到第四章才跟鳥哥書一起安裝的 我家電腦是買宏碁產品M35的桌上型電腦, 我的是 AMD athlon(tm) 64 processor 3200+ 2.21GHz,512MB的RAM 顯示卡是NVIDIA FX5500 我用鳥哥書上附的FC4光碟安裝 我把平 ...

Cygwin 中的 Vim

Charlie avatar
By Charlie
at 2009-10-21T17:44
請問有辦法套用 colorscheme 嗎? 我按照網路上的作法下載 colorscheme 並更改 .vimrc 可是都沒有辦法成功, 想請教一下該如何正確設定 或是在 cygwin 底下,vim 的顏色就註定只能是黑白? - ...

IIS on Linux?

Frederic avatar
By Frederic
at 2009-10-21T09:23
剛剛用 netcraft 查某網站的server 居然有 and#34;http://www.xxx.xxx.tw was running Microsoft-IIS on Linuxand#34; IIS 有出 Linux 版本嗎? - ...