<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Calvin's Tech Space

    成于堅忍,毀于浮躁

       :: 首頁 :: 聯系 :: 聚合  :: 管理
    在VIM下使用gg=G格式化shell代碼時,如果代碼中有heredoc,經過格式化后會造成代碼運行失敗。如下:
    do
    ??? echo "Deploying..."
    ??? ssh $USER@$HOST <<-EOF
    cd clat
    mv client client-bak-`date +%Y%m%d`
    tar zxf `basename $TARGET_DEPLOY_ZIP` -C .
    exit
    EOF

    ??? echo ""


    格式化后會成這樣:
    do
    ??? echo "Deploying..."
    ??? ssh $USER@$HOST <<-EOF
    ???? cd clat
    ???? mv client client-bak-`date +%Y%m%d`
    ???? tar zxf `basename $TARGET_DEPLOY_ZIP` -C .
    ???? exit

    ??? EOF
    ??? echo ""
    done


    vim對heredoc的代碼進行了縮進(四個空格),這樣會導執行出錯。

    解決:修改vim格式化shell腳本的規則,格式化時忽略heredoc。

    將如下腳本保存到.vim/indent/sh.vim:
    (來源:http://vim.1045645.n5.nabble.com/bash-heredoc-in-a-for-loop-indented-incorrectly-td1177006.html)
    " Vim indent file
    " Language:??? Shell Script
    " Maintainer:?????? Nikolai Weibull <[hidden email]>
    " Latest Revision:? 2006-04-19

    if exists("b:did_indent")
    ? finish
    endif
    let b:did_indent = 1

    setlocal indentexpr=GetShIndent()
    setlocal indentkeys+==then,=do,=else,=elif,=esac,=fi,=fin,=fil,=done,=EOF,=END
    setlocal indentkeys-=:,0#

    if exists("*GetShIndent")
    ? finish
    endif

    let s:cpo_save = &cpo
    set cpo&vim

    function GetShIndent()
    ? let lnum = prevnonblank(v:lnum - 1)
    ? if lnum == 0
    ??? return 0
    ? endif

    ? " Add a 'shiftwidth' after if, while, else, case, until, for, function()
    ? " Skip if the line also contains the closure for the above
    ? let ind = indent(lnum)
    ? let line = getline(lnum)
    ? if line =~ '^\s*\(if\|then\|do\|else\|elif\|case\|while\|until\|for\)\>'
    ??????? \ || line =~ '^\s*\<\k\+\>\s*()\s*{'
    ??????? \ || line =~ '^\s*{'
    ??? if line !~ '\(esac\|fi\|done\)\>\s*$' && line !~ '}\s*$'
    ????? let ind = ind + &sw
    ??? endif
    ? endif

    ? if line =~ '^.*<<.*\(EOF\|END\)'
    ??? let ind = 0
    ? endif
    ? if line =~ '^"\?\(EOF\|END\)"\?$'
    ??? let ind = indent(search('>.*EOF', 'b'))
    ? endif
    ? " Subtract a 'shiftwidth' on a then, do, else, esac, fi, done
    ? " Retain the indentation level if line matches fin (for find)
    ? let line = getline(v:lnum)
    ? if (line =~ '^\s*\(then\|do\|else\|elif\|esac\|fi\|done\)\>' || line =~ '^\s*}')
    ??????? \ && line !~ '^\s*fi[ln]\>'
    ??? let ind = ind - &sw
    ? endif

    ? return ind
    endfunction

    let &cpo = s:cpo_save
    unlet s:cpo_save

    不過delimiter只能是EOF或者END。

    posted on 2011-05-26 18:23 calvin 閱讀(453) 評論(0)  編輯  收藏 所屬分類: VIM
    主站蜘蛛池模板: 91香蕉国产线在线观看免费| a毛片免费全部播放完整成| 国产成人免费高清激情明星| 亚洲一区中文字幕久久| 9420免费高清在线视频| 亚洲国产一区二区三区青草影视| 国产精品九九久久免费视频| 浮力影院亚洲国产第一页| 久久国产一片免费观看| 亚洲日韩精品射精日| 久久免费线看线看| 内射干少妇亚洲69XXX| 欧美好看的免费电影在线观看| 最新亚洲卡一卡二卡三新区| 免费观看的av毛片的网站| 香港特级三A毛片免费观看| 亚洲一级Av无码毛片久久精品 | 日韩免费高清视频| 自拍偷自拍亚洲精品偷一| 亚洲福利精品一区二区三区| 91在线视频免费观看| 久久亚洲精品人成综合网| 好吊妞在线新免费视频| 日日躁狠狠躁狠狠爱免费视频| 亚洲精品国产品国语在线| 97碰公开在线观看免费视频| 亚洲а∨精品天堂在线| 亚洲中文字幕不卡无码| 亚洲视频在线免费看| 免费国产va在线观看| 久久精品国产精品亚洲蜜月| 欧美最猛性xxxxx免费| eeuss影院免费直达入口| 久久久婷婷五月亚洲97号色| 日韩一品在线播放视频一品免费| 久久久久女教师免费一区| 久久精品国产亚洲AV无码麻豆| 四虎成人精品一区二区免费网站 | 一区二区三区福利视频免费观看| 亚洲一区精彩视频| 亚洲小说区图片区另类春色|