2012-09-22: 現在插入的 HTML 不一定有 <div class="separator">
部分,script 也改為沒有這個 div 也能取代。
Blogger 文章編輯器「上傳圖片」自動插入的 HTML 為:
做了一支 bookmarklet 把它改成以下格式:
將 bookmarklet 加進書籤 →
清理 blogger 插入的圖片標籤
在文章編輯器的 HTML 模式執行就立刻取代,不保證原文的安全,請自己保重。
封存
2012-09-22: 現在插入的 HTML 不一定有 <div class="separator">
部分,script 也改為沒有這個 div 也能取代。
Blogger 文章編輯器「上傳圖片」自動插入的 HTML 為:
做了一支 bookmarklet 把它改成以下格式:
將 bookmarklet 加進書籤 →
清理 blogger 插入的圖片標籤
在文章編輯器的 HTML 模式執行就立刻取代,不保證原文的安全,請自己保重。
var $textarea = document.getElementById('postingHtmlBox'), pattern = [ '(<div class="separator" style="clear: both; text-align: center;">\n)?', '<a href="(.+)"', ' imageanchor="1" style=".*"><img border="0" height=".+" width=".+" ', 'src="(.+)" /></a>(</div>)?' ].join(''), re = new RegExp(pattern, 'g'); if ($textarea) { $textarea.value = $textarea.value.replace(re, function (str, p1, p2, p3, p4, p5) { return [ '<a href="', p2, '">', '<img src="', p3, '" alt="" /></a>' ].join(''); }); } else { alert('錯誤,找不到 textarea#postingHtmlBox。'); }
建議用 Vundle 裝 → Bundle 'bootleq/vim-cycle'
。
不然就用老方法,把所有檔案放到 runtimepath(預設在 ~/.vim)即可。
檔案在 https://github.com/bootleq/vim-cycle
要特別做的只有「哪些字能 cycle」設定,否則預設的字很少。
把 doc 287-341 行的範例 加進 vimrc,再視需要修改就可以了,應該很容易看懂。
進階選項再看 doc。
預設會加一個快速鍵 <Leader>a,其中 <Leader> 預設是 \ 所以實際是按 \a。
(註:用 a 是取 Advance、Add 的 a,類似預設的 CTRL-A 功能)
按 <Leader>a 會把目前游標上的字換成下一個,以下舉例說明;若有特別標示,表示游標位置。
true
→ false
Yes
→ No
+
→ -
==
→ !=
可是
→ 可否
Sunday
→ Monday
→ Tuesday
→ Wednesday
→
Thursday
→ Friday
→ Saturday
→ Sunday
Rails Metal
→ Thrash
→ Technical Death
$li.addClass('foo')
→ $li.removeClass('foo')
- jQuery element Attributesposition: 'upperLeft'
→ position: 'upperRight'
- MooTools Element.Position:render_with_me
→ :render_without_me
- Rails alias_method_chain<em>example</em>
→ <strong>example</strong>
「例子」
→ 『例子』
→ (例子)
"例子"
。
另外在 <Leader>a 前可以加 [count],例如 2\a 會 cycle 到第二個的候選,
Monday
就會變成 Wednesday
而不是 Tuesday
。
還有在 visual mode 也可以用 <Leader>a,這樣就不會自動搜尋關鍵字,而是直接用選取的字來 cycle,遇到混淆時可以試試。
要怎麼把 Yes
換成 No
?
標準答案是 ciw 再輸入 "No"。
更快的方法是寫 script 處理,很久以前看到一篇
Toggling yes-no,
把常用組合先定義好,只要一個鍵就能把 Yes
換成 No
,再按一次就換回來,真是聰明啊~
這方法我用了很久,當時改出來的設定如這個 gist。
因為覺得方便,又有蠻多地方想改善,所以打算寫成 plugin。
搜尋 toggle 才發現真多人寫過,不過似乎大同小異,除了
SwapIt.vim:
some words
(原本的實作方式辦不到)。<H1>example</H1>
變成 <H2>example</H2>
(一次換掉前後 tag)。
我比較同意 SwapIt 的設計,認定 swap 這個功能,用力加強它。
SwapIt 的問題是實作還未成熟,所以我也 fork 它準備貢獻。
但是送第二個 pull request 前,覺得有點走不下去:
另外對 SwapIt 這個名字也有點在意,至少我搜尋的時候就沒想到 swap 這關鍵字。
想起來最適合的字是 Cycle(因為是在一組字中循環,例如 top right bottom left),但是在 GitHub 一搜就發現已經有同名 plugin 了
——zef/vim-cycle——很精簡,程式聰明漂亮,可惜作者太忙比較沒空更新。
結果我的 plugin 還是叫 cycle,這樣好嗎?
我把碰到的困難告訴兩位開發者 Michael Brown 和 Zef,他們都很開放,表示基本上不介意我這麼做(我想還是有點情緒干擾吧); 而雖然大家目標類似,但個人考量的點(有趣的是想法從 coding style 與用法設計就看得出來)還是不容易統合,變成一個專案。
這種情況下,我就先開發再說了,把手上的問題解決。
目前 0.1.0 版本已經是堪用階段:
bootleq/vim-cycle - GitHub
之後會再寫一篇簡易使用說明。
最近在寫 plugin,對之前的 coding style(主要用在 vimrc)有些不同意了。
其中一些比較確定、通用的部分是關於可讀性的,整理如下:
指的是選項、指令名稱的簡寫,例如:
function!
→ fun!
setlocal textwidth=78
→ setl tw=78
execute "normal! dd"
→ exe "norm! dd"
例子可能不夠極端(還是看得懂),但是已經失去字面上的意思(最簡單的可讀)了。
此外還有一致性的問題,完全一樣的意思卻不能預期用哪個敘述。
例如想找函數定義,直接搜尋 func!
卻找不到 function!
,問題是什麼?
其實不必問了,這完全是可以避免的問題。
總之除非有足夠理由(例如故意用 fun!
定義比較 funny 的函數),還是一律用完整寫法吧。
縮排和可讀性的關係是,縮排亂掉的時候會很難讀。
首先要訂好自己的縮排規範,用空白還是 Tab、要空幾格,然後確實遵守。
再來要了解每個人的規則會不一樣:
減輕問題的方式是在每個檔案加上 modeline:
例如一律用空白,確保排版不會被 Tab 弄亂
" vim: expandtab softtabstop=2 shiftwidth=2
如果還是偏好 Tab(也許為了減少字數)
" vim: noexpandtab tabstop=8 shiftwidth=8
" modeline {{{ " vim: expandtab softtabstop=2 shiftwidth=2 foldmethod=marker
在註解中使用 marker(預設是 {{{
和 }}}
)整理程式碼是很普遍的作法,
script 稍大時幾乎都會用上,否則會覺得難爬。
對以下常見的 folding:
規範一個通用的格式。
以下是我的例子。 從 Utils: 開始是一個叫做 Utils 的 section,用大寫字和冒號形成一個 vimCommentTitle(來自預設的 syntax 上色),又更顯目一點。
" Utils: {{{ function! s:save_reg(name) "{{{ let s:save_reg = [getreg(a:name), getregtype(a:name)] endfunction "}}} function! s:restore_reg(name) "{{{ if exists('s:save_reg') call setreg(a:name, s:save_reg[0], s:save_reg[1]) endif endfunction "}}} " }}} Utils
手動 fold 有很多層的時候,我曾經把深層的程式加一級縮排:
" MAPPINGS {{{1 ================================================== let maplocalleader = "," noremap <Leader><LocalLeader> <LocalLeader> " 各種移動 {{{2 noremap <expr> <Space> repeat('<ScrollWheelDown>', 2)
看起來似乎更清楚,但這個超過註解該做的事了。
理想上要專注於程式本身的表達能力才對。
寫下 aaa, bbb, ccc, ...
這樣的敘述時,除非真的很簡單,否則不要擠在同一行,難讀又難改。
請用 backslash (\
) 拆開。
call setline( \ a:before.line, \ substitute( \ getline(a:before.line), \ '\%' . a:before.col . 'c' . s:escape_pattern(a:before.text), \ s:escape_sub_expr(a:after.text), \ '' \ ) \ )
這裡的縮排比較詭異,不是由 indent 選項而是由一個變數控制,見 ft-vim-indent,預設是 shiftwidth 的三倍。
let g:vim_indent_cont = &shiftwidth * 3
我沒有設這個變數,backslash 之後的縮排也是手動做的,規則是至少空一格,其餘每一層就縮一級。
單純是「採用預設值」這個考量。
可以考慮多用 hash(Vim 裡面叫 Dictionary)作為函數的參數,例如原本是:
function Img(src, alt, size, class)
或接受任意個參數的
function Img(src, alt, size, ...)
都可以改成
function Img(src, options)
就不必記參數的順序,或再解析 a:0、a:1(額外的參數會被轉成 a:N)了。
存取 options 的時候,盡量用點(.
)取代方括號([]
),
例如 options.size
就比 options['size']
簡單明瞭。
不過因為 Vim script 的特性,也有一些像陷阱的東西。
例如取值的時候要用 get(options, 'size')
比較安全,沒有 'size' 這個 key 的時候才會回 0
,而不是報錯。
還有在 value 不是 Number 時,直接 if get(options, 'key')
會有型別轉換的細節要注意,
通常會加一道 if type(get(options, 'key')) == type(xxx)
檢查,比較麻煩。
要填滿整行的話,會用 textwidth=78,和 Vim doc 一樣。
但是程式內文就不必了,因為怕太長其實是硬體問題,我認為不用管它,也解決不了它。
Vim 對變數名稱有一些意見,例如 user function 第一個字要大寫,大小寫變數存進 session 時的規則也不同。
原則上使用 underscore_names 安全又簡單,可惜有時候必須大寫,還是會破例。
具體用字則是愈短、愈直接愈好,scope、autoload 和 Dictionary 可以善加利用,
例如 s:width
、su#do()
、contribute.till_die
。
原則是和 Vim doc 一致,也就是用 <C-X> 而不用 <C-x>。
不過這樣會失去大小寫的區別。
Vim 的 regexp pattern 對哪些字元有特殊意義(需要跳脫)和別家解釋不太一樣, 在 pattern 前加上 \v \m \M \V 又有不同解讀, 在 plugin 或一些內建 function 裡還會一律視為 \m。
這個因應情境有很多變數,所以目前也沒有規範。
神奇的解法!
取得BlogId >> data:blog.blogId
不妙,我也沒留底了
大大
檔案已失聯,跪求檔案
Yeah it really works but its better to keep a towel or any kind of cloth below the stained cloth nor the stain will be absorbed by the other side of that cloth.And it really doesn't matter whether the stain is of 1 week or 1 month.
Alec is awesome! I fix nearly everything that I possibly can in my home and use youtube almost exclusively. Most posts are a constant ramble and yammering and words filling dead air space. It 's unnecessary and confusing. Alec speaks only when necessary and demonstrates each fix quickly and accurately. Camera person is completely tuned in to every move Alec makes. Thanks! Just spot on