More than 5 years have passed since last update.

posted at

updated at

vim-mode-plus for Atom editor vimconf-2016

1 / 16

I'm t9md

t9md__t9md_.png Presentation1.png

  1. Was normal Vim user
  2. Was advanced Emacs user.
  3. Was advanced Vim user
    • vim-chef, vim-xmpfilter, textmanip, choosewin, quickhl, smalls...
  4. Am Atom with vim-mode-plus user
    • vim-mode-plus, cursor-history, open-this, quick-highlight, project-folder...

What makes me editor addict :syringe: is difficulties and limitless enhanceability of Emacs.

What is the vim-mode-plus?

Started by forking vim-mode maintained by GitHub :octocat:
- Forked at 2015.08
- Public release at 2015.09.28
- Now 104 releases(!!) from initial release at 2016.11.04(about 1 release/4 days)
- Now de facto vim keybinding in Atom?

vim-mode's README was updated yesterday(2016.11.04)

Current Status - DEPRECATED in favor of vim-mode-plus

  • It's honor to be used by really talented programmers(jordwalke, chenglou, rtfeldman).
  • Happy to be mentioned in JavaScriptAir 034

What I did from when I forked

  • :art: Refactoring
    • Rewrote every lines of codes. Greatly reduced complexity.
  • :gift: Add lot's of new features:
    • incremental-search
    • visual-block-mode
    • surround
    • any-pair text-object
    • occurrence operator-modifier
    • persistent-selection
  • :bow: Off course, thanks to great vim-mode
    • Sincerely, I feel I couldn't do anything without original vim-mode.
  • Gifs

History of commit graphs



High speed tutorial from beginner to expert in 7 steps

High speed tour from beginner to expert in 7 steps

[Vim/vim-mode-plus for Atom] 秒速で初心者からエキスパートになる。 たった7ステップで。

Editing in the vim-world

The editing is transforming state of text by mutation.
initial-text -> mutate -> final-text
Mutating text with operator and target by telling vim to "do what on which target".

Subjects, Verbs and Objects basic operation unit

  • Subject is You.
  • Verb: is Operator
    • Specify what to do. The verb requires an object(=target).
    • Do mutation(Delete :scissors:, Yank :clipboard:, CamelCase :camel:)
  • Objects: is Target(Motion or TextObject)
    • Specify where, which to apply an operators on.
    • i w(inner-word text-object), j(from-here-to-next-line)

How operation-stack of vim-mode-plus is working.

Motion is complete?


Operator is complete?


class DeleteToLastCharacterOfLine extends Delete
  target: 'MoveToLastCharacterOfLine'
  execute: ->
    if @isMode('visual', 'blockwise')
      swrap.setReversedState(@editor, false)

Operation life in operation-stack

execute operation when it's complete!


OperationStack code

    top = @peekTop()
    if top.isComplete()
      if @mode is 'normal' and top.isOperator()

      # Temporary set while command is running
      if commandName = top.constructor.getCommandNameWithoutPrefix?()
        @addToClassList(commandName + "-pending")

vim-mode-plus original features


  • Maximize current pane
  • Incremental search
  • flashOnOperate and flashOnUndoRedo :sparkles:
  • StayOn family(stayOnTransformString, stayOnYank, stayOnDelete) :sparkles:
  • Motions: MoveDownToEdge, MoveToNextNumber, MoveToNextString
  • TextObject: AnyPair, Indentation, Entire(All), Fold, Function, Comment
  • Operator: Lots of string transformer(Sort, CamelCase, SnakeCase, Surround, ToggleLineComments, ReplaceWithRegister etc..)
  • Operator: Meta string transformer (TransformStringBySelectList).
  • Narrowed selection. cmd-d(select-occurrence), ctrl-cmd-c(change-occurrence).
  • Super granular keymap scopes(e.g. mapping only effective when toggle-line-comments-pending)
  • Persistent-selection: works as like normal visual-selection but you can make selection persist.

Keep cursor position by operator.

  • Side-effect-less operator by stayOnYank, stayOnDelete and stayOnTransformString
  • In pure-Vim, y i p move cursor to start of yanked area.
  • I want cursor move only when I said so. Don't move unless I said so :gun:.


  • But cursor movement convinces user the success of an operator.
  • Just dont-move-cursor is not enough, flashOnOperate :flashlight: compliment user's confidence.

Occurrence modifier, preset-occurrence, persistence-selection

  • As like you can force-wise of operator by d v j, o modifies operator's behavior to works on occurrences within target.
  • A preset-occurrence allows you to set occurrence preliminarily.
  • ctrl-o in incremntal-search allows you to set preset-occurrence by regex pattern
    • e.g. / ^ # * $ ctrl-o g U i e uppercases all lines starts with #.
  • Also a persistent-selection allows you to pre-specify a target of operator.

Sometimes, replacing single-char in bulk is faster :dash: than repeating operator.

Repeat(.) delete-surround


delete-surround with multiple cursor


preset-occurrence for single quote ' then apply delete operator.


So what am I doing in vim-mode-plus?

  • :rotating_light: :warning: vim-mode-plus is not trying to be complete-Vim

    • Impossible and no motivation for that.
    • Atom is NOT Vim.
  • :rocket: vim-mode-plus is aggressively evaluating how effective-editing-would-be.

    • How is it like when xxx is yyy.
    • Is zzz feature is really practically(not conceptually) useful?
  • :thought_balloon: :moyai: :zzz: Thinking about Vim deeply further than I was pure-Vim user.

    • And always found pure-Vim's really careful and maniac decision for developer's intuitiveness/productivities.

:tada: :tada: Thanks!! :tada: :tada:

Vim!! You are great!

Atom! You are great!

Vim-mode! Without you, I don't think I could create vim-mode-plus from scratch.

Japanese Vim community! Love friendly atmosphere and lots of super aggressive/good plugin authors and contributers to core.

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
What you can do with signing up