LoginSignup
6
6

More than 5 years have passed since last update.

vim-mode で visual-blockwise 操作

Last updated at Posted at 2015-05-30

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 っぽい操作感で使える。

操作

  1. ctrl-v で visual-block モードに入り
  2. jkhl で選択範囲を拡張する

Limitation

  • j, k は選択範囲を 拡大 しか出来ない.
  • Esc で visual-mode 抜けた後に multi-cursor が残る.

Code

vim-mode では ctrl-vvim-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'
6
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6