[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 03/18 19:04 / Filesize : 368 KB / Number-of Response : 974
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Vim6スクリプトお勉強スレ



1 名前:名無しさん@お腹いっぱい。 [01/12/17 12:15]
みんなでスクリプトを覚えよう

372 名前:MiMi@Vim%Chalice ◆fI1wYbzaMQ mailto:sage [03/05/18 00:20]
違うアプローチで作ってみました.
挿入モードで演算子を入力するとスペースを挿入します.
# コマンドモードに戻る必要はありません.

●注意事項
  プログラミング言語の仕様に+と++のような同じ文字を使った
  二種類の演算子がある場合は両方をmapして下さい.
  第2引数でスペースを入れるかどうかを指定します.
  これにより,++の時はスペースを入れない,==の時はスペースを入れる
  といった使い分けが出来ます.
  スペースを入れない仕様は意味が無さそうですが,+をmapして++をmapしないと,
  ++が入力できなくなってしまうので仕方なくこういう仕様にしました.

●1点だけごめんなさい項目があります.
  行頭ではmapした記号を入力できません.
  ただし,一般的にはインデントを入れるので気にならないでしょう.

" 両側にスペースを入れたい演算子をmappingする
inoremap <buffer> <silent> + <Esc>:call InsertSpaceOnBothSides('+', 1)<CR>a
inoremap <buffer> <silent> - <Esc>:call InsertSpaceOnBothSides('-', 1)<CR>a
inoremap <buffer> <silent> * <Esc>:call InsertSpaceOnBothSides('*', 1)<CR>a
inoremap <buffer> <silent> / <Esc>:call InsertSpaceOnBothSides('/', 1)<CR>a
inoremap <buffer> <silent> % <Esc>:call InsertSpaceOnBothSides('%', 1)<CR>a
inoremap <buffer> <silent> = <Esc>:call InsertSpaceOnBothSides('=', 1)<CR>a

inoremap <buffer> <silent> ++ <Esc>:call InsertSpaceOnBothSides('++', 0)<CR>a
inoremap <buffer> <silent> -- <Esc>:call InsertSpaceOnBothSides('--', 0)<CR>a
inoremap <buffer> <silent> == <Esc>:call InsertSpaceOnBothSides('==', 1)<CR>a

373 名前:MiMi@Vim%Chalice ◆fI1wYbzaMQ mailto:sage [03/05/18 00:20]
" 演算子の両側にスペースを入れる
function! InsertSpaceOnBothSides(operator, isspace)
  let pre_str  = strpart(getline("."), 0, col(".")) " 行の前半
  let post_str = strpart(getline("."), col("."))    " 行の後半

  if a:isspace == 1
    if strpart(pre_str, strlen(pre_str)-1, 1) != ' '
      let pre_str = pre_str . ' '       " 前半最後にスペース挿入
    endif
    if strpart(post_str, 0, 1) != ' '
      let post_str = ' ' . post_str     " 後半最初にスペース挿入
    endif
  endif

  " 前半と後半の間に演算子を挿入
  call setline(".", pre_str . a:operator . post_str)

  " 次の挿入位置へ移動
  if post_str == matchstr(post_str, '\s*$', 0)  " 演算子挿入位置が行末の時
    let motion_cmd = 'normal $'     " 行末へ
  else
    let motion_cmd = 'normal 2wh'   " 演算子を飛ばして次の単語の1文字前へ
  endif
  execute motion_cmd
endfunction






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](;´∀`)<368KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef