Hatena::Groupvim

bless {category => 'vim'}, shift

2010-01-16<C-k>でEmacsっぽく行末までを削除 at インサートモード・コマンドライン このエントリーのブックマークコメント

追記:

よりEmacsっぽく、インサートモードで行末にいる時は次の行を連結するようにした。

インサートモード

inoremap <C-k> <C-o>D

冒頭で言ったように、よりEmacsっぽくするならこんな感じ。

func! s:kill_line()
    let curcol = col('.')
    if curcol == col('$')
        join!
        call cursor(line('.'), curcol)
    else
        normal! D
    endif
endfunc
inoremap <C-k>  <C-o>:<C-u>call <SID>kill_line()<CR>

join!、normal!ってのがなんかいいですね(ぇ

コマンドラインモード

let g:vimrc_saved_cmdline = ''
func! s:save_front()
    let g:vimrc_saved_cmdline = strpart(getcmdline(), 0, getcmdpos() - 1)
    return ''
endfunc
cnoremap <Plug>(vimrc-save-front) <C-r>=<SID>save_front()<CR>
cnoremap <Plug>(vimrc-delete-all) <End><C-u>
cnoremap <Plug>(vimrc-insert-saved) <C-r>=g:vimrc_saved_cmdline<CR>
cmap <C-k> <Plug>(vimrc-save-front)<Plug>(vimrc-delete-all)<Plug>(vimrc-insert-saved)

id:thincaさんから一行でできると教えていただきました。

cnoremap <C-k> <C-\>e getcmdpos() == 1 ? '' : getcmdline()[:getcmdpos()-2]<CR>

(2012/04/04 追記)

ふと今の設定も載せてみる。

上の設定冗長すぎる・・・2年前か・・・

inoremap <expr> <C-k> "\<C-g>u".(col('.') == col('$') ? '<C-o>gJ' : '<C-o>D')
cnoremap <C-k> <C-\>e getcmdpos() == 1 ? '' : getcmdline()[:getcmdpos()-2]<CR>

thincathinca2010/01/16 18:07> コマンドラインモード
cnoremap <C-k> <C-\>egetcmdline()[:getcmdpos()-2]<CR>

tyrutyru2010/01/16 20:16まさかワンライナーでできるとはw id:thinca++
行頭にいる(getcmdpos() == 1)時置き換えできてなかったのでちょっと修正して追記してみました。

# 文字列をスライスで取り出せるのをすっかり忘れてた...
# あと<C-r>=と<C-\>eって同じかと思ってたけど、<C-r>=は挿入して、<C-\>eは全部を置き換えるのか...これは便利。

thincathinca2010/01/16 20:24ああ、すいません。その場で作って良くテストもせずに書き込みました…。
修正どうもです。

KuanishKuanish2013/03/02 23:37It's really great that peolpe are sharing this information.

KuanishKuanish2013/03/02 23:37It\'s really great that peolpe are sharing this information.

トラックバック - http://vim.g.hatena.ne.jp/tyru/20100116