2015/06/01 追記
結局、いろいろ改善してパッケージにした。
vim-mode-visual-block
----- 追記ここまで
今現在、Atom の vim-mode は visual-block mode をサポートしていない。
将来実装する予定で、visual-block を activate するキーマップだけが設定されている。
キーマップが設定されているので、動くと思って混乱している人もいるようだ(無理もない。。)。
Atom には multi-cursor 機能があり、これを使うことで、visual-block の use-case の基本的なものはカバーできる(俺にとっては)。
更に以下の Code の設定をすると、visual-block mode っぽい操作感で使える。
操作
-
ctrl-v
で visual-block モードに入り - jkhl で選択範囲を拡張する
Limitation
-
j
,k
は選択範囲を 拡大 しか出来ない. -
Esc
で visual-mode 抜けた後に multi-cursor が残る.
Code
vim-mode では ctrl-v
で vim-mode:activate-blockwise-visual-mode
が実行され、
@submode
だけは設定される。
vim-mode は service として、VimState を expose しているので、この @submode
はユーザースクリプト
からも参照可能。
なので、この値を見て、普通の j
, k
なのか、addSelection
すべきかを判断している。
init.coffee
class VimVisualBlock
constructor: ->
atom.commands.add 'atom-text-editor',
'user:visual-blockwise-j': (event) => @blockOperation(event, 'j')
'user:visual-blockwise-k': (event) => @blockOperation(event, 'k')
getVimService: ->
@vimService ?= atom.packages
.getActivePackage('vim-mode')
.mainModule.provideVimMode()
isVisualBlockMode: (editor) ->
{mode, submode} = @getVimService().getEditorState(editor)
(mode is 'visual') and (submode is 'blockwise')
blockOperation: (event, direction) ->
editor = atom.workspace.getActiveTextEditor()
if @isVisualBlockMode editor
switch direction
when 'j' then editor.addSelectionBelow()
when 'k' then editor.addSelectionAbove()
else
event.abortKeyBinding()
new VimVisualBlock()
keymap.cson
'atom-text-editor.vim-mode.visual-mode':
'j': 'user:visual-blockwise-j'
'k': 'user:visual-blockwise-k'