Coder Social home page Coder Social logo

vim's Introduction

Vim Version Build Status Slack Status

VSCodeVim is a Visual Studio Code extension that enables Vim keybindings, including:

  • Modes: normal, insert, command, visual, visual line, visual block (with useCtrlKeys, see below)
  • Command combinations (c3w, daw, 2dd, etc)
  • Highly versatile command remapping (jj to esc, : to command panel, etc.)
  • Incremental search with / and ?
  • Marks
  • Vim settings similar to those found in .vimrc
  • Multi-cursor support. Allows multiple simultaneous cursors to receive Vim commands (e.g. allows / search, each cursor has independent clipboards, etc.).
  • The EasyMotion plugin!
  • The Surround.vim plugin!
  • And much more! Refer to the roadmap or everything we support.

Please report missing features/bugs on GitHub, which will help us get to them faster.

Ask us questions, talk about contributing, or just say hi on Slack!

Donations

Donate

Make a donation to VSCodeVim here!

Donations help convince me to work on this project rather than my other (non-open-source) projects. I'd love to work on VSCodeVim full time, but I need money to live!

Configuring VSCodeVim

Below is an example of a settings.json file for VSCode settings applicable to this extension. The following section goes over some supported options in more detail.

{
    "vim.easymotion": true,
    "vim.incsearch": true,
    "vim.useSystemClipboard": true,
    "vim.useCtrlKeys": true,
    "vim.hlsearch": true,
    "vim.insertModeKeyBindings": [
        {
            "before": ["j","j"],
            "after": ["<Esc>"]
        }
    ],
    "vim.otherModesKeyBindingsNonRecursive": [
        {
            "before": ["<leader>","d"],
            "after": ["d", "d"]
        }
    ],
    "vim.leader": "<space>"
}

Supported Options

The following is a subset of the supported configurations; the full list is described in the Contributions tab for this extension, or in our package.json.

useCtrlKeys

  • Enable Vim ctrl keys overriding common VS Code operations (eg. copy, paste, find, etc). Setting this option to true will enable:

    • ctrl+c, ctrl+[ => <Esc>
    • ctrl+f => Full Page Forward
    • ctrl+d => Half Page Back
    • ctrl+b => Half Page Forward
    • ctrl+v => Visual Block Mode
    • etc.
  • Type: Boolean (Default: true)

  • Example:

    "vim.useCtrlKeys": true
    

insertModeKeyBindings/otherModesKeyBindings

  • Keybinding overrides to use for insert and other (non-insert) modes.

Bind jj to <Esc> in insert mode:

  "vim.insertModeKeyBindings": [
       {
           "before": ["j", "j"],
           "after": ["<Esc>"]
       }
  ]

Bind : to show the command palette:

"vim.otherModesKeyBindingsNonRecursive": [
   {
       "before": [":"],
       "after": [],
       "commands": [
           {
               "command": "workbench.action.showCommands",
               "args": []
           }
       ]
   }
]

Bind ZZ to save and close the current file:

    "vim.otherModesKeyBindingsNonRecursive": [
        {
            "before": ["Z", "Z"],
            "after": [],
            "commands": [
                {
                    "command": "workbench.action.files.save",
                    "args": []
                },
                {
                    "command": "workbench.action.closeActiveEditor",
                    "args": []
                }
            ]
        }
    ]

Or bind <leader>w to save the current file:

    "vim.otherModesKeyBindingsNonRecursive": [
        {
            "before": ["leader", "w"],
            "after": [],
            "commands": [
                {
                    "command": "workbench.action.files.save",
                    "args": []
                }
            ]
        }
    ]

insertModeKeyBindingsNonRecursive/otherModesKeyBindingsNonRecursive

  • Non-recursive keybinding overrides to use for insert and other (non-insert) modes (similar to :noremap)

  • Example: Bind j to gj. Notice that if you attempted this binding normally, the j in gj would be expanded into gj, on and on forever. Stop this recursive expansion using insertModeKeyBindingsNonRecursive and/or otherModesKeyBindingNonRecursive.

    "vim.otherModesKeyBindingsNonRecursive": [
    {
        "before": ["j"],
        "after": ["g", "j"]
    }]
    

startInInsertMode

  • Have VSCodeVim start in Insert Mode rather than Normal Mode.
  • We would be remiss in our duties as Vim users not to say that you should really be staying in Normal mode as much as you can, but hey, who are we to stop you?

overrideCopy

  • Override VSCode's copy command with our own, which works correctly with VSCodeVim.
  • If cmd-c or ctrl-c is giving you issues, set this to false and complain at microsoft/vscode#217.
  • Type: Boolean (Default: true)

useSystemClipboard

  • Enable yanking to the system clipboard by default
  • Type: Boolean (Default: false)
  • Note: Linux users must have xclip installed

searchHighlightColor

  • Set the color of search highlights.
  • Type: Color String (Default: rgba(150, 150, 150, 0.3))

useSolidBlockCursor

  • Use a non-blinking block cursor
  • Type: Boolean (Default: false)

Vim settings we support

ignorecase

  • Ignore case in search patterns
  • Type: Boolean (Default: true)

smartcase

  • Override the 'ignorecase' option if the search pattern contains upper case characters
  • Type: Boolean (Default: true)

hlsearch

  • When there is a previous search pattern, highlight all its matches
  • Type: Boolean (Default: false)

incsearch

  • Show the next search match while you're searching.
  • Type: Boolean (Default: true)

autoindent

  • Copy indent from current line when starting a new line
  • Type: Boolean (Default: true)

timeout

  • Timeout in milliseconds for remapped commands
  • Type: Number (Default: 1000)

showcmd

  • Show the text of any command you are in the middle of writing.
  • Type: Boolean (Default: true)

textwidth

  • Width to word-wrap to when using gq.
  • Type: number (Default: 80)

leader

  • What key should <leader> map to in key remappings?
  • Type: string (Default: \)

Configure

Vim options are loaded in the following sequence:

  1. :set {option}
  2. vim.{option} from user/workspace settings.
  3. VSCode configuration
  4. VSCodeVim default values

Note: changes to the user/workspace settings require a restart of VS Code to take effect.

Multi-Cursor Mode

Multi-Cursor mode is currently in beta. Please report things you expected to work but didn't to our feedback thread.

Getting into multi-cursor mode

You can enter multi-cursor mode by:

  • Pressing cmd-d on OSX.
  • Running "Add Cursor Above/Below" or the shortcut on any platform.
  • Pressing gc, a new shortcut we added which is equivalent to cmd-d on OSX or ctrl-d on Windows. (It adds another cursor at the next word that matches the word the cursor is currently on.)

Doing stuff

Now that you have multiple cursors, you should be able to use Vim commands as you see fit. Most of them should work. There is a list of things I know of which don't here. If you find yourself wanting one of these, please add it to our feedback thread.

Each cursor has its own clipboard.

Pressing Escape in Multi-Cursor Visual Mode will bring you to Multi-Cursor Normal mode. Pressing it again will return you to Normal mode.

F.A.Q.

j, k and others don't repeat when I hold them down.

On OS X, open Terminal and run the following command:

defaults write com.microsoft.VSCode ApplePressAndHoldEnabled -bool false         // For VS Code
defaults write com.microsoft.VSCodeInsiders ApplePressAndHoldEnabled -bool false // For VS Code Insider

Help! None of the vim ctrl (e.g. ctrl+f, ctrl+v) commands work

Configure the useCtrlKeys option (see configurations#useCtrlKeys) to true.

How to use easymotion

To activate easymotion, you need to make sure that easymotion is set to true in settings.json. Now that easymotion is active, you can initiate motions using the following commands. Once you initiate the motion, text decorators will be displayed and you can press the keys displayed to jump to that position. leader is configurable and is \ by default.

Motion Command Description
<leader> <leader> s <char> Search character
<leader> <leader> f <char> Find character forwards
<leader> <leader> F <char> Find character backwards
<leader> <leader> t <char> Til character forwards
<leader> <leader> T <char> Til character backwards
<leader> <leader> w Start of word forwards
<leader> <leader> e End of word forwards
<leader> <leader> g e End of word backwards
<leader> <leader> b Start of word backwards

Contributing

This project is maintained by a group of awesome people and contributions are extremely welcome ❤️. For a quick tutorial on how you can help, see our contributing guide.

Awesome Features You Might Not Know About

Vim has a lot of nooks and crannies. VSCodeVim preserves some of the coolest nooks and crannies of Vim. Some of our favorite include:

  • gd - jump to definition. Astoundingly useful in any language that VSCode provides definition support for. I use this one probably hundreds of times a day.
  • gq on a visual selection - Reflow and wordwrap blocks of text, preserving commenting style. Great for formatting documentation comments.

Special Shoutouts to Cool Contributors

  • Thanks to @xconverge for making over 100 commits to the repo. If you're wondering why your least favorite bug packed up and left, it was probably him.
  • Thanks to @Metamist for implementing EasyMotion!
  • Thanks to @sectioneight for implementing text objects!
  • Special props to Kevin Coleman, who created our awesome logo!

Release Notes

Our recent releases and update notes are available here.

vim's People

Contributors

johnfn avatar rebornix avatar jpoon avatar xconverge avatar guillermooo avatar ascandella avatar tienshiao avatar xlaech avatar frarees avatar platzer avatar kimitake avatar aminroosta avatar octref avatar srepollock avatar markrendle avatar ursuscamp avatar rhys-vdw avatar jgoz avatar jamirvin avatar darrenweston avatar tail avatar antonaderum avatar shotaakasaka avatar vikramthyagarajan avatar arussellk avatar pjvds avatar mleech avatar kyfk avatar frederickfogerty avatar edthedev avatar

Watchers

James Cloos avatar KyuWoo Choi avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.