GithubHelp home page GithubHelp logo

vscodevim / vim Goto Github PK

View Code? Open in Web Editor NEW
13.3K 127.0 1.3K 19.17 MB

:star: Vim for Visual Studio Code

Home Page: http://aka.ms/vscodevim

License: MIT License

TypeScript 99.07% JavaScript 0.91% Dockerfile 0.02% Shell 0.01%
vim typescript keybindings vscode-extension vscode

vim's Introduction


VSCodeVim

Vim emulation for Visual Studio Code

VSCodeVim is a Vim emulator for Visual Studio Code.

  • ๐Ÿšš For a full list of supported Vim features, please refer to our roadmap.
  • ๐Ÿ“ƒ Our change log outlines the breaking/major/minor updates between releases.
  • Report missing features/bugs on GitHub.
Table of Contents (click to expand)

๐Ÿ’พ Installation

VSCodeVim can be installed via the VS Code Marketplace.

Mac

To enable key-repeating, execute the following in your Terminal, log out and back in, and then restart VS Code:

$ defaults write com.microsoft.VSCode ApplePressAndHoldEnabled -bool false              # For VS Code
$ defaults write com.microsoft.VSCodeInsiders ApplePressAndHoldEnabled -bool false      # For VS Code Insider
$ defaults write com.vscodium ApplePressAndHoldEnabled -bool false                      # For VS Codium
$ defaults write com.microsoft.VSCodeExploration ApplePressAndHoldEnabled -bool false   # For VS Codium Exploration users
$ defaults delete -g ApplePressAndHoldEnabled                                           # If necessary, reset global default

We also recommend increasing Key Repeat and Delay Until Repeat settings in System Preferences -> Keyboard.

Windows

Like real vim, VSCodeVim will take over your control keys. This behavior can be adjusted with the useCtrlKeys and handleKeys settings.

โš™๏ธ Settings

The settings documented here are a subset of the supported settings; the full list is described in the Contributions tab of VSCodeVim's extension details page, which can be found in the extensions view of VS Code.

Quick Example

Below is an example of a settings.json file with settings relevant to VSCodeVim:

{
  "vim.easymotion": true,
  "vim.incsearch": true,
  "vim.useSystemClipboard": true,
  "vim.useCtrlKeys": true,
  "vim.hlsearch": true,
  "vim.insertModeKeyBindings": [
    {
      "before": ["j", "j"],
      "after": ["<Esc>"]
    }
  ],
  "vim.normalModeKeyBindingsNonRecursive": [
    {
      "before": ["<leader>", "d"],
      "after": ["d", "d"]
    },
    {
      "before": ["<C-n>"],
      "commands": [":nohl"]
    },
    {
      "before": ["K"],
      "commands": ["lineBreakInsert"],
      "silent": true
    }
  ],
  "vim.leader": "<space>",
  "vim.handleKeys": {
    "<C-a>": false,
    "<C-f>": false
  },

  "// To improve performance",
  "extensions.experimental.affinity": {
    "vscodevim.vim": 1
  }
}

VSCodeVim settings

These settings are specific to VSCodeVim.

Setting Description Type Default Value
vim.changeWordIncludesWhitespace Include trailing whitespace when changing word. This configures the cw action to act consistently as its siblings (yw and dw) instead of acting as ce. Boolean false
vim.cursorStylePerMode.{Mode} Configure a specific cursor style for {Mode}. Omitted modes will use default cursor type Supported cursors: line, block, underline, line-thin, block-outline, and underline-thin. String None
vim.digraphs.{shorthand} Set custom digraph shorthands that can override the default ones. Entries should map a two-character shorthand to a descriptive string and one or more UTF16 code points. Example: "R!": ["๐Ÿš€", [55357, 56960]] Object {"R!": ["๐Ÿš€", [0xD83D, 0xDE80]]
vim.disableExtension Disable VSCodeVim extension. This setting can also be toggled using toggleVim command in the Command Palette Boolean false
vim.handleKeys Delegate configured keys to be handled by VS Code instead of by the VSCodeVim extension. Any key in keybindings section of the package.json that has a vim.use<C-...> in the when argument can be delegated back to VS Code by setting "<C-...>": false. Example: to use ctrl+f for find (native VS Code behavior): "vim.handleKeys": { "<C-f>": false }. String "<C-d>": true
"<C-s>": false
"<C-z>": false
vim.overrideCopy Override VS Code's copy command with our own, which works correctly with VSCodeVim. If cmd-c/ctrl-c is giving you issues, set this to false and complain here. Boolean false
vim.useSystemClipboard Use the system clipboard register (*) as the default register Boolean false
vim.searchHighlightColor Background color of non-current search matches String findMatchHighlightBackground ThemeColor
vim.searchHighlightTextColor Foreground color of non-current search matches String None
vim.searchMatchColor Background color of current search match String findMatchBackground ThemeColor
vim.searchMatchTextColor Foreground color of current search match String None
vim.substitutionColor Background color of substitution text when vim.inccommand is enabled String "#50f01080"
vim.substitutionTextColor Foreground color of substitution text when vim.inccommand is enabled String None
vim.startInInsertMode Start in Insert mode instead of Normal Mode Boolean false
vim.useCtrlKeys Enable Vim ctrl keys overriding common VS Code operations such as copy, paste, find, etc. Boolean true
vim.visualstar In visual mode, start a search with * or # using the current selection Boolean false
vim.highlightedyank.enable Enable highlighting when yanking Boolean false
vim.highlightedyank.color Set the color of yank highlights String rgba(250, 240, 170, 0.5)
vim.highlightedyank.duration Set the duration of yank highlights Number 200

Neovim Integration

โš ๏ธ Experimental feature. Please leave feedback on neovim integration here.

To leverage neovim for Ex-commands,

  1. Install neovim
  2. Modify the following configurations:
Setting Description Type Default Value
vim.enableNeovim Enable Neovim Boolean false
vim.neovimPath Full path to neovim executable. If left empty, PATH environment variable will be automatically checked for neovim path. String
vim.neovimUseConfigFile If true, Neovim will load a config file specified by vim.neovimConfigPath. This is necessary if you want Neovim to be able to use its own plugins. Boolean false
vim.neovimConfigPath Path that Neovim will load as config file. If left blank, Neovim will search in its default location. String

Here's some ideas on what you can do with neovim integration:

Key Remapping

Custom remappings are defined on a per-mode basis.

"vim.insertModeKeyBindings"/"vim.normalModeKeyBindings"/"vim.visualModeKeyBindings"/"vim.operatorPendingModeKeyBindings"

  • Keybinding overrides to use for insert, normal, operatorPending and visual modes.
  • Keybinding overrides can include "before", "after", "commands", and "silent".
  • Bind jj to <Esc> in insert mode:
    "vim.insertModeKeyBindings": [
        {
            "before": ["j", "j"],
            "after": ["<Esc>"]
        }
    ]
  • Bind ยฃ to goto previous whole word under cursor:
    "vim.normalModeKeyBindings": [
        {
            "before": ["ยฃ"],
            "after": ["#"]
        }
    ]
  • Bind : to show the command palette, and don't show the message on the status bar:
    "vim.normalModeKeyBindings": [
        {
            "before": [":"],
            "commands": [
                "workbench.action.showCommands",
            ],
            "silent": true
        }
    ]
  • Bind <leader>m to add a bookmark and <leader>b to open the list of all bookmarks (using the Bookmarks extension):
    "vim.normalModeKeyBindings": [
        {
            "before": ["<leader>", "m"],
            "commands": [
                "bookmarks.toggle"
            ]
        },
        {
            "before": ["<leader>", "b"],
            "commands": [
                "bookmarks.list"
            ]
        }
    ]
  • Bind ctrl+n to turn off search highlighting and <leader>w to save the current file:
    "vim.normalModeKeyBindings": [
        {
            "before":["<C-n>"],
            "commands": [
                ":nohl",
            ]
        },
        {
            "before": ["leader", "w"],
            "commands": [
                "workbench.action.files.save",
            ]
        }
    ]
  • Bind { to w in operator pending mode makes y{ and d{ work like yw and dw respectively:
    "vim.operatorPendingModeKeyBindings": [
        {
            "before": ["{"],
            "after": ["w"]
        }
    ]
  • Bind L to $ and H to ^ in operator pending mode makes yL and dH work like y$ and d^ respectively:
    "vim.operatorPendingModeKeyBindings": [
        {
            "before": ["L"],
            "after": ["$"]
        },
        {
            "before": ["H"],
            "after": ["^"]
        }
    ]
  • Bind > and < in visual mode to indent/outdent lines (repeatable):
    "vim.visualModeKeyBindings": [
        {
            "before": [
                ">"
            ],
            "commands": [
                "editor.action.indentLines"
            ]
        },
        {
            "before": [
                "<"
            ],
            "commands": [
                "editor.action.outdentLines"
            ]
        },
    ]
  • Bind <leader>vim to clone this repository to the selected location:
    "vim.visualModeKeyBindings": [
        {
            "before": [
                "<leader>", "v", "i", "m"
            ],
            "commands": [
                {
                    "command": "git.clone",
                    "args": [ "https://github.com/VSCodeVim/Vim.git" ]
                }
            ]
        }
    ]

"vim.insertModeKeyBindingsNonRecursive"/"normalModeKeyBindingsNonRecursive"/"visualModeKeyBindingsNonRecursive"/"operatorPendingModeKeyBindingsNonRecursive"

  • Non-recursive keybinding overrides to use for insert, normal, and visual modes
  • Example: Exchange the meaning of two keys like j to k and k to j to exchange the cursor up and down commands. Notice that if you attempted this binding normally, the j would be replaced with k and the k would be replaced with j, on and on forever. When this happens 'maxmapdepth' times (default 1000) the error message 'E223 Recursive Mapping' will be thrown. Stop this recursive expansion using the NonRecursive variation of the keybindings:
    "vim.normalModeKeyBindingsNonRecursive": [
        {
            "before": ["j"],
            "after": ["k"]
        },
        {
            "before": ["k"],
            "after": ["j"]
        }
    ]
  • Bind ( to 'i(' in operator pending mode makes 'y(' and 'c(' work like 'yi(' and 'ci(' respectively:
    "vim.operatorPendingModeKeyBindingsNonRecursive": [
        {
            "before": ["("],
            "after": ["i("]
        }
    ]
  • Bind p in visual mode to paste without overriding the current register:
    "vim.visualModeKeyBindingsNonRecursive": [
        {
            "before": [
                "p",
            ],
            "after": [
                "p",
                "g",
                "v",
                "y"
            ]
        }
    ],

Debugging Remappings

  1. Adjust the extension's logging level to 'debug' and open the Output window:

    1. Run Developer: Set Log Level from the command palette.
    2. Select Vim, then Debug
    3. Run Developer: Reload window
    4. In the bottom panel, open the Output tab and select Vim from the dropdown selection.
  2. Are your configurations correct?

    As each remapped configuration is loaded, it is logged to the Vim Output panel. Do you see any errors?

    debug: Remapper: normalModeKeyBindingsNonRecursive. before=0. after=^.
    debug: Remapper: insertModeKeyBindings. before=j,j. after=<Esc>.
    error: Remapper: insertModeKeyBindings. Invalid configuration. Missing 'after' key or 'commands'. before=j,k.

    Misconfigured configurations are ignored.

  3. Does the extension handle the keys you are trying to remap?

    VSCodeVim explicitly instructs VS Code which key events we care about through the package.json. If the key you are trying to remap is a key in which vim/vscodevim generally does not handle, then it's most likely that this extension does not receive those key events from VS Code. In the Vim Output panel, you should see:

    debug: ModeHandler: handling key=A.
    debug: ModeHandler: handling key=l.
    debug: ModeHandler: handling key=<BS>.
    debug: ModeHandler: handling key=<C-a>.

    As you press the key that you are trying to remap, do you see it outputted here? If not, it means we don't subscribe to those key events. It is still possible to remap those keys by using VSCode's keybindings.json (see next section: Remapping more complex key combinations).

Remapping more complex key combinations

It is highly recommended to remap keys using vim commands like "vim.normalModeKeyBindings" (see here). But sometimes the usual remapping commands are not enough as they do not support every key combinations possible (for example Alt+key or Ctrl+Shift+key). In this case it is possible to create new keybindings inside keybindings.json. To do so: open up keybindings.json in VSCode using CTRL+SHIFT+P and select Open keyboard shortcuts (JSON).

You can then add a new entry to the keybindings like so:

{
  "key": "YOUR_KEY_COMBINATION",
  "command": "vim.remap",
  "when": "inputFocus && vim.mode == 'VIM_MODE_YOU_WANT_TO_REBIND'",
  "args": {
    "after": ["YOUR_VIM_ACTION"]
  }
}

For example, to rebind ctrl+shift+y to VSCodeVim's yy (yank line) in normal mode, add this to your keybindings.json:

{
  "key": "ctrl+shift+y",
  "command": "vim.remap",
  "when": "inputFocus && vim.mode == 'Normal'",
  "args": {
    "after": ["y", "y"]
  }
}

If keybindings.json is empty the first time you open it, make sure to add opening [ and closing ] square brackets to the file as the keybindings should be inside a JSON Array.

Vim modes

Here are all the modes used by VSCodeVim:

Mode
Normal
Insert
Visual
VisualBlock
VisualLine
SearchInProgressMode
CommandlineInProgress
Replace
EasyMotionMode
EasyMotionInputMode
SurroundInputMode
OperatorPendingMode
Disabled

When rebinding keys in keybindings.json using "when clause context", it can be useful to know in which mode vim currently is. For example to write a "when clause" that checks if vim is currently in normal mode or visual mode it is possible to write the following:

"when": "vim.mode == 'Normal' || vim.mode == 'Visual'",

Vim settings

Configuration settings that have been copied from vim. Vim settings are loaded in the following sequence:

  1. :set {setting}
  2. vim.{setting} from user/workspace settings.
  3. VS Code settings
  4. VSCodeVim default values
Setting Description Type Default Value
vim.autoindent Copy indent from current line when starting a new line Boolean true
vim.gdefault When on, the :substitute flag g is default on. This means that all matches in a line are substituted instead of one. When a g flag is given to a :substitute command, this will toggle the substitution of all or one match. Boolean false
vim.hlsearch Highlights all text matching current search Boolean false
vim.ignorecase Ignore case in search patterns Boolean true
vim.incsearch Show the next match while entering a search Boolean true
vim.inccommand Show the effects of the :substitute command while typing String replace
vim.joinspaces Add two spaces after '.', '?', and '!' when joining or reformatting Boolean true
vim.leader Defines key for <leader> to be used in key remappings String \
vim.maxmapdepth Maximum number of times a mapping is done without resulting in a character to be used. This normally catches endless mappings, like ":map x y" with ":map y x". It still does not catch ":map g wg", because the 'w' is used before the next mapping is done. Number 1000
vim.report Threshold for reporting number of lines changed. Number 2
vim.shell Path to the shell to use for ! and :! commands. String /bin/sh on Unix, %COMSPEC% environment variable on Windows
vim.showcmd Show (partial) command in status bar Boolean true
vim.showmodename Show name of current mode in status bar Boolean true
vim.smartcase Override the 'ignorecase' setting if search pattern contains uppercase characters Boolean true
vim.textwidth Width to word-wrap when using gq Number 80
vim.timeout Timeout in milliseconds for remapped commands Number 1000
vim.whichwrap Allow specified keys that move the cursor left/right to move to the previous/next line when the cursor is on the first/last character in the line. See :help whichwrap. String b,s

.vimrc support

โš ๏ธ .vimrc support is currently experimental. Only remaps are supported, and you may experience bugs. Please report them!

Set vim.vimrc.enable to true and set vim.vimrc.path appropriately.

๐Ÿ–ฑ๏ธ Multi-Cursor Mode

โš ๏ธ Multi-Cursor mode is experimental. Please report issues in our feedback thread.

Enter multi-cursor mode by:

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

Once you have multiple cursors, you should be able to use Vim commands as you see fit. Most should work; some are unsupported (ref PR#587).

  • 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.

๐Ÿ”Œ Emulated Plugins

vim-airline

โš ๏ธ There are performance implications to using this plugin. In order to change the status bar, we override the configurations in your workspace settings.json which results in increased latency and a constant changing diff in your working directory (see issue#2124).

Change the color of the status bar based on the current mode. Once enabled, configure "vim.statusBarColors". Colors can be defined for each mode either as string (background only), or string[] (background, foreground).

    "vim.statusBarColorControl": true,
    "vim.statusBarColors.normal": ["#8FBCBB", "#434C5E"],
    "vim.statusBarColors.insert": "#BF616A",
    "vim.statusBarColors.visual": "#B48EAD",
    "vim.statusBarColors.visualline": "#B48EAD",
    "vim.statusBarColors.visualblock": "#A3BE8C",
    "vim.statusBarColors.replace": "#D08770",
    "vim.statusBarColors.commandlineinprogress": "#007ACC",
    "vim.statusBarColors.searchinprogressmode": "#007ACC",
    "vim.statusBarColors.easymotionmode": "#007ACC",
    "vim.statusBarColors.easymotioninputmode": "#007ACC",
    "vim.statusBarColors.surroundinputmode": "#007ACC",

vim-easymotion

Based on vim-easymotion and configured through the following settings:

Setting Description Type Default Value
vim.easymotion Enable/disable easymotion plugin Boolean false
vim.easymotionMarkerBackgroundColor The background color of the marker box. String '#0000'
vim.easymotionMarkerForegroundColorOneChar The font color for one-character markers. String '#ff0000'
vim.easymotionMarkerForegroundColorTwoCharFirst The font color for the first of two-character markers, used to differentiate from one-character markers. String '#ffb400'
vim.easymotionMarkerForegroundColorTwoCharSecond The font color for the second of two-character markers, used to differentiate consecutive markers. String '#b98300'
vim.easymotionIncSearchForegroundColor The font color for the search n-character command, used to highlight the matches. String '#7fbf00'
vim.easymotionDimColor The font color for the dimmed characters, used when #vim.easymotionDimBackground# is set to true. String '#777777'
vim.easymotionDimBackground Whether to dim other text while markers are visible. Boolean true
vim.easymotionMarkerFontWeight The font weight used for the marker text. String 'bold'
vim.easymotionKeys The characters used for jump marker name String 'hklyuiopnm,qwertzxcvbasdgjf;'
vim.easymotionJumpToAnywhereRegex Custom regex to match for JumpToAnywhere motion (analogous to Easymotion_re_anywhere) String \b[A-Za-z0-9]|[A-Za-z0-9]\b|_.|#.|[a-z][A-Z]

Once easymotion is active, initiate motions using the following commands. After you initiate the motion, text decorators/markers 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> b Start of word backwards
<leader><leader> l Matches beginning & ending of word, camelCase, after _, and after # forwards
<leader><leader> h Matches beginning & ending of word, camelCase, after _, and after # backwards
<leader><leader> e End of word forwards
<leader><leader> ge End of word backwards
<leader><leader> j Start of line forwards
<leader><leader> k Start of line backwards
<leader><leader> / <char>... <CR> Search n-character
<leader><leader><leader> bdt Til character
<leader><leader><leader> bdw Start of word
<leader><leader><leader> bde End of word
<leader><leader><leader> bdjk Start of line
<leader><leader><leader> j JumpToAnywhere motion; default behavior matches beginning & ending of word, camelCase, after _ and after #

<leader><leader> (2s|2f|2F|2t|2T) <char><char> and <leader><leader><leader> bd2t <char>char> are also available. The difference is character count required for search. For example, <leader><leader> 2s <char><char> requires two characters, and search by two characters. This mapping is not a standard mapping, so it is recommended to use your custom mapping.

vim-surround

Based on surround.vim, the plugin is used to work with surrounding characters like parentheses, brackets, quotes, and XML tags.

Setting Description Type Default Value
vim.surround Enable/disable vim-surround Boolean true

t or < as <desired> or <existing> will enter tag entry mode. Using <CR> instead of > to finish changing a tag will preserve any existing attributes.

Surround Command Description
y s <motion> <desired> Add desired surround around text defined by <motion>
d s <existing> Delete existing surround
c s <existing> <desired> Change existing surround to desired
S <desired> Surround when in visual modes (surrounds full selection)

Some examples:

  • "test" with cursor inside quotes type cs"' to end up with 'test'
  • "test" with cursor inside quotes type ds" to end up with test
  • "test" with cursor inside quotes type cs"t and enter 123> to end up with <123>test</123>

vim-commentary

Similar to vim-commentary, but uses the VS Code native Toggle Line Comment and Toggle Block Comment features.

Usage examples:

  • gc - toggles line comment. For example gcc to toggle line comment for current line and gc2j to toggle line comments for the current line and the next two lines.
  • gC - toggles block comment. For example gCi) to comment out everything within parentheses.

vim-indent-object

Based on vim-indent-object, it allows for treating blocks of code at the current indentation level as text objects. Useful in languages that don't use braces around statements (e.g. Python).

Provided there is a new line between the opening and closing braces / tag, it can be considered an agnostic cib/ci{/ci[/cit.

Command Description
<operator>ii This indentation level
<operator>ai This indentation level and the line above (think if statements in Python)
<operator>aI This indentation level, the line above, and the line after (think if statements in C/C++/Java/etc)

vim-sneak

Based on vim-sneak, it allows for jumping to any location specified by two characters.

Setting Description Type Default Value
vim.sneak Enable/disable vim-sneak Boolean false
vim.sneakUseIgnorecaseAndSmartcase Respect vim.ignorecase and vim.smartcase while sneaking Boolean false

Once sneak is active, initiate motions using the following commands. For operators sneak uses z instead of s because s is already taken by the surround plugin.

Motion Command Description
s<char><char> Move forward to the first occurrence of <char><char>
S<char><char> Move backward to the first occurrence of <char><char>
<operator>z<char><char> Perform <operator> forward to the first occurrence of <char><char>
<operator>Z<char><char> Perform <operator> backward to the first occurrence of <char><char>

CamelCaseMotion

Based on CamelCaseMotion, though not an exact emulation. This plugin provides an easier way to move through camelCase and snake_case words.

Setting Description Type Default Value
vim.camelCaseMotion.enable Enable/disable CamelCaseMotion Boolean false

Once CamelCaseMotion is enabled, the following motions are available:

Motion Command Description
<leader>w Move forward to the start of the next camelCase or snake_case word segment
<leader>e Move forward to the next end of a camelCase or snake_case word segment
<leader>b Move back to the prior beginning of a camelCase or snake_case word segment
<operator>i<leader>w Select/change/delete/etc. the current camelCase or snake_case word segment

By default, <leader> is mapped to \, so for example, d2i\w would delete the current and next camelCase word segment.

Input Method

Disable input method when exiting Insert Mode.

Setting Description
vim.autoSwitchInputMethod.enable Boolean denoting whether autoSwitchInputMethod is on/off.
vim.autoSwitchInputMethod.defaultIM Default input method.
vim.autoSwitchInputMethod.obtainIMCmd The full path to command to retrieve the current input method key.
vim.autoSwitchInputMethod.switchIMCmd The full path to command to switch input method, with {im} a placeholder for input method key.

Any third-party program can be used to switch input methods. The following will walkthrough the configuration using im-select.

  1. Install im-select (see installation guide)

  2. Find your default input method key

    • Mac:

      Switch your input method to English, and run the following in your terminal: /<path-to-im-select-installation>/im-select to output your default input method. The table below lists the common English key layouts for MacOS.

      Key Description
      com.apple.keylayout.US U.S.
      com.apple.keylayout.ABC ABC
      com.apple.keylayout.British British
      com.apple.keylayout.Irish Irish
      com.apple.keylayout.Australian Australian
      com.apple.keylayout.Dvorak Dvorak
      com.apple.keylayout.Colemak Colemak
    • Windows:

      Refer to the im-select guide on how to discover your input method key. Generally, if your keyboard layout is en_US the input method key is 1033 (the locale ID of en_US). You can also find your locale ID from this page, where the LCID Decimal column is the locale ID.

  3. Configure vim.autoSwitchInputMethod.

    • MacOS:

      Given the input method key of com.apple.keylayout.US and im-select located at /usr/local/bin. The configuration is:

      "vim.autoSwitchInputMethod.enable": true,
      "vim.autoSwitchInputMethod.defaultIM": "com.apple.keylayout.US",
      "vim.autoSwitchInputMethod.obtainIMCmd": "/usr/local/bin/im-select",
      "vim.autoSwitchInputMethod.switchIMCmd": "/usr/local/bin/im-select {im}"
    • Windows:

      Given the input method key of 1033 (en_US) and im-select.exe located at D:/bin. The configuration is:

      "vim.autoSwitchInputMethod.enable": true,
      "vim.autoSwitchInputMethod.defaultIM": "1033",
      "vim.autoSwitchInputMethod.obtainIMCmd": "D:\\bin\\im-select.exe",
      "vim.autoSwitchInputMethod.switchIMCmd": "D:\\bin\\im-select.exe {im}"

The {im} argument above is a command-line option that will be passed to im-select denoting the input method to switch to. If using an alternative program to switch input methods, you should add a similar option to the configuration. For example, if the program's usage is my-program -s imKey to switch input method, the vim.autoSwitchInputMethod.switchIMCmd should be /path/to/my-program -s {im}.

ReplaceWithRegister

Based on ReplaceWithRegister, an easy way to replace existing text with the contents of a register.

Setting Description Type Default Value
vim.replaceWithRegister Enable/disable ReplaceWithRegister Boolean false

Once active, type gr (say "go replace") followed by a motion to describe the text you want replaced by the contents of the register.

Motion Command Description
[count]["a]gr<motion> Replace the text described by the motion with the contents of the specified register
[count]["a]grr Replace the [count] lines or current line with the contents of the specified register
{Visual}["a]gr Replace the selection with the contents of the specified register

vim-textobj-entire

Similar to vim-textobj-entire.

Adds two useful text-objects:

  • ae which represents the entire content of a buffer.
  • ie which represents the entire content of a buffer without the leading and trailing spaces.

Usage examples:

  • dae - delete the whole buffer content.
  • yie - will yank the buffer content except leading and trailing blank lines.
  • gUae - transform the whole buffer to uppercase.

vim-textobj-arguments

Similar to the argument text object in targets.vim. It is an easy way to deal with arguments inside functions in most programming languages.

Motion Command Description
<operator>ia The argument excluding separators.
<operator>aa The argument including separators.

Usage examples:

  • cia - change the argument under the cursor while preserving separators like comma ,.
  • daa - will delete the whole argument under the cursor and the separators if applicable.
Setting Description Type Default Value
vim.argumentObjectOpeningDelimiters A list of opening delimiters String list ["(", "["]
vim.argumentObjectClosingDelimiters A list of closing delimiters String list [")", "]"]
vim.argumentObjectSeparators A list of object separators String list [","]

๐ŸŽฉ VSCodeVim tricks!

VS Code has a lot of nifty tricks and we try to preserve some of them:

  • gd - jump to definition.
  • gq - on a visual selection reflow and wordwrap blocks of text, preserving commenting style. Great for formatting documentation comments.
  • gb - adds another cursor on the next word it finds which is the same as the word under the cursor.
  • af - visual mode command which selects increasingly large blocks of text. For example, if you had "blah (foo [bar 'ba|z'])" then it would select 'baz' first. If you pressed af again, it'd then select [bar 'baz'], and if you did it a third time it would select "(foo [bar 'baz'])".
  • gh - equivalent to hovering your mouse over wherever the cursor is. Handy for seeing types and error messages without reaching for the mouse!

๐Ÿ“š F.A.Q.

  • None of the native Visual Studio Code ctrl (e.g. ctrl+f, ctrl+v) commands work

    Set the useCtrlKeys setting to false.

  • Moving j/k over folds opens up the folds

    Try setting vim.foldfix to true. This is a hack; it works fine, but there are side effects (see issue#22276).

  • Key repeat doesn't work

    Are you on a Mac? Did you go through our mac-setup instructions?

  • There are annoying intellisense/notifications/popups that I can't close with <esc>! Or I'm in a snippet and I want to close intellisense

    Press shift+<esc> to close all of those boxes.

  • How can I use the commandline when in Zen mode or when the status bar is disabled?

    This extension exposes a remappable command to show a VS Code style quick-pick version of the commandline, with more limited functionality. This can be remapped as follows in VS Code's keybindings.json settings file.

    {
      "key": "shift+;",
      "command": "vim.showQuickpickCmdLine",
      "when": "editorTextFocus && vim.mode != 'Insert'"
    }

    Or for Zen mode only:

    {
      "key": "shift+;",
      "command": "vim.showQuickpickCmdLine",
      "when": "inZenMode && vim.mode != 'Insert'"
    }
  • How can I move the cursor by each display line with word wrapping?

    If you have word wrap on and would like the cursor to enter each wrapped line when using j, k, โ†“ or โ†‘, set the following in VS Code's keybindings.json settings file.

    {
      "key": "up",
      "command": "cursorUp",
      "when": "editorTextFocus && vim.active && !inDebugRepl && !suggestWidgetMultipleSuggestions && !suggestWidgetVisible"
    },
    {
      "key": "down",
      "command": "cursorDown",
      "when": "editorTextFocus && vim.active && !inDebugRepl && !suggestWidgetMultipleSuggestions && !suggestWidgetVisible"
    },
    {
      "key": "k",
      "command": "cursorUp",
      "when": "editorTextFocus && vim.active && !inDebugRepl && vim.mode == 'Normal' && !suggestWidgetMultipleSuggestions && !suggestWidgetVisible"
    },
    {
      "key": "j",
      "command": "cursorDown",
      "when": "editorTextFocus && vim.active && !inDebugRepl && vim.mode == 'Normal' && !suggestWidgetMultipleSuggestions && !suggestWidgetVisible"
    }

    Caveats: This solution restores the default VS Code behavior for the j and k keys, so motions like 10j will not work. If you need these motions to work, other, less performant options exist.

  • I've swapped Escape and Caps Lock with setxkbmap and VSCodeVim isn't respecting the swap

    This is a known issue in VS Code, as a workaround you can set "keyboard.dispatch": "keyCode" and restart VS Code.

  • VSCodeVim is too slow!

    You can try adding the following setting, and reload/restart VSCode:

    "extensions.experimental.affinity": {
      "vscodevim.vim": 1
    }

    Caveats: One issue with using the affinity setting is that each time you update your settings file, the Vim plugin will reload, which can take a few seconds.

โค๏ธ 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.

Buy Us A Coffee

Special shoutouts to:

  • 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!
  • Shoutout to @chillee aka Horace He for his contributions and hard work.

vim's People

Contributors

ascandella avatar berknam avatar captaincaius avatar chillee avatar daipeihust avatar dependabot[bot] avatar elazarcoh avatar guillermooo avatar hyhugh avatar j-fields avatar jbaiter avatar johnfn avatar jpoon avatar jpotterm avatar kamikazezirou avatar maxfie1d avatar mikew avatar mmmeri avatar rebornix avatar renovate-bot avatar renovate[bot] avatar shawnaxsom avatar sql-koala avatar tagniam avatar tienshiao avatar tyru avatar westim avatar xconverge avatar xlaech avatar xmbhasin avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

vim's Issues

gulp error

I just tried to run gulp as README using master branch, and got the following error at command line scanner (section?).

  1. command line scanner can expect one of set:
    TypeError: undefined is not a function
    src\cmd_line\scanner.js:101:87
    :

What is wrong? or can I ignore this error?

Keybinding discussion (non-US mostly)

Hi!

(Note: This became quite long. but the question have quite a lot of history in it so I had a hard time making it shorter...)

We have started using vscode as our developing tool at work, and since im a long time vim user I've been looking for a good vim-extension. As far as I can tell this is the best and most ambitious project.

However the keybindings for non-us keyboard are not optimal. I know this is mostly because of vscode using Electron (Atom has the same problem), and I know you have had some discussion about it already: #49 here discusses it and @guillermooo even created an issue over at vscodes repository.

There's also the issue over at vscode repo that discusses this at length: microsoft/vscode#713

The end result of that issue created the Keybinding widget (which is great), and also fixed key-bindings in general for non-us keybindings.

When I tried using the Keybinding widget I noticed that the "<"-key was still not working on my (Swedish) keyboard. So I submitted an issue (microsoft/vscode#1794) and it got fixed to the master branch just the day after. I have built vscode from source and testet that it works. Great!

pressing the < key in using the Keybinding widget will result in this:

{
    "key": "oem_102",
    "command": "commandId",
    "when": "editorTextFocus"
}

Now I have noticed that you guys have the keyboard.ts file that tries to handle keybindings for different layouts, this also works fine - except for when there are keys that you havent declared in package.json since these wont be handled (and so never gets to be "translated").

So if i tried to create a swedish KeyMapper in keyboard.ts i would do this:

this.mappings = {
            'oem_102': '<',
            'shift_oem_102': '>'
        };

But that wouldnt execute because oem_102 would never be handled and and sent to that translate function i just created.

This isnt just a problem with oem_102 but really with every key that isnt handled in package.json

Sooooo, I guess my question is: How do you want to handle translating keys that arent in package.json? Should we simply add lines in package.json like this:

{ "key": "oem_102", "command": "extension.vim_oem_102", "when": "editorTextFocus" },
{ "key": "Shift+oem_102", "command": "extension.vim_shift_oem_102", "when": "editorTextFocus" }

And then do the mapping I did above (+ actually writing the command as well of course)?
This seems to work fine (only way to test at the moment is to run from source), and it will allow me to indent using the actual < button on my keyboard.

Contributing

Was going to do an extension myself, would love to contribute.

Are you guys starting from a reference project or from scratch? I was thinking of porting the atom vim-mode extension to vscode.

VSC can't handle '<' key in key binding (package.json)

Using Spanish (Spain) keyboard layout.

Tried < and Shift+>. The former doesn't get forwarded from package.json, but the latter does.

< gets inserted into the buffer every time. > doesn't (as the rest of the tested keys, in this situation).

Ctrl+C does not put you in command mode

In vim you can use Ctrl+C as the key combination to switch to command mode from any other mode, but it is not supported with your extension, please support it. Thank you

Tests: unit tests are failing on Windows

I suspect this is due to the differences in CRLF among the platforms. It maybe easier to test against the current location of the cursor rather then checking for the text.

  1) Mode Insert Can handle 'o':
      AssertionError: 'text' == 'text\n'
      + expected - actual
      -text
      +text

      at Object.assertTextEditorText (d:\Source\VSCodeVim\test\testUtils.ts:12:9)
      at d:\Source\VSCodeVim\test\mode\modeInsert.test.ts:48:34
      at Object.p [as _notify] (c:\Program Files (x86)\Microsoft VS Code\resources\app\out\vs\workbench\node\vs\workbench\node\vs\base\common\winjs.base.raw.js:1440:1)
      at Object.__dirname.undefined.L.enter (c:\Program Files (x86)\Microsoft VS Code\resources\app\out\vs\workbench\node\vs\workbench\node\vs\base\common\winjs.base.raw.js:1127:1)
      at [object Object].__dirname.undefined.t.Class.define._run (c:\Program Files (x86)\Microsoft VS Code\resources\app\out\vs\workbench\node\vs\workbench\node\vs\base\common\winjs.base.raw.js:1343:1)
      at [object Object].__dirname.undefined.t.Class.define._completed (c:\Program Files (x86)\Microsoft VS Code\resources\app\out\vs\workbench\node\vs\workbench\node\vs\base\common\winjs.base.raw.js:1311:1)
      at Object.p [as _notify] (c:\Program Files (x86)\Microsoft VS Code\resources\app\out\vs\workbench\node\vs\workbench\node\vs\base\common\winjs.base.raw.js:1440:1)
      at Object.__dirname.undefined.L.enter (c:\Program Files (x86)\Microsoft VS Code\resources\app\out\vs\workbench\node\vs\workbench\node\vs\base\common\winjs.base.raw.js:1127:1)
      at [object Object].__dirname.undefined.t.Class.define._run (c:\Program Files (x86)\Microsoft VS Code\resources\app\out\vs\workbench\node\vs\workbench\node\vs\base\common\winjs.base.raw.js:1343:1)
      at [object Object].__dirname.undefined.t.Class.define._completed (c:\Program Files (x86)\Microsoft VS Code\resources\app\out\vs\workbench\node\vs\workbench\node\vs\base\common\winjs.base.raw.js:1311:1)

2) Mode Insert Can handle 'O':
      AssertionError: '\r\ntext' == '\ntext'
      + expected - actual
      -
      +
       text

      at Object.assertTextEditorText (d:\Source\VSCodeVim\test\testUtils.ts:12:9)
      at d:\Source\VSCodeVim\test\mode\modeInsert.test.ts:59:34
      at Object.p [as _notify] (c:\Program Files (x86)\Microsoft VS Code\resources\app\out\vs\workbench\node\vs\workbench\node\vs\base\common\winjs.base.raw.js:1440:1)
      at Object.__dirname.undefined.L.enter (c:\Program Files (x86)\Microsoft VS Code\resources\app\out\vs\workbench\node\vs\workbench\node\vs\base\common\winjs.base.raw.js:1127:1)
      at [object Object].__dirname.undefined.t.Class.define._run (c:\Program Files (x86)\Microsoft VS Code\resources\app\out\vs\workbench\node\vs\workbench\node\vs\base\common\winjs.base.raw.js:1343:1)
      at [object Object].__dirname.undefined.t.Class.define._completed (c:\Program Files (x86)\Microsoft VS Code\resources\app\out\vs\workbench\node\vs\workbench\node\vs\base\common\winjs.base.raw.js:1311:1)
      at Object.p [as _notify] (c:\Program Files (x86)\Microsoft VS Code\resources\app\out\vs\workbench\node\vs\workbench\node\vs\base\common\winjs.base.raw.js:1440:1)
      at Object.__dirname.undefined.L.enter (c:\Program Files (x86)\Microsoft VS Code\resources\app\out\vs\workbench\node\vs\workbench\node\vs\base\common\winjs.base.raw.js:1127:1)
      at [object Object].__dirname.undefined.t.Class.define._run (c:\Program Files (x86)\Microsoft VS Code\resources\app\out\vs\workbench\node\vs\workbench\node\vs\base\common\winjs.base.raw.js:1343:1)
      at [object Object].__dirname.undefined.t.Class.define._completed (c:\Program Files (x86)\Microsoft VS Code\resources\app\out\vs\workbench\node\vs\workbench\node\vs\base\common\winjs.base.raw.js:1311:1)

Implement `e`

I'd like to have the "e" motion implemented.I've submitted a pull request that imlements the feature.

run all tests in CI server(s)

The idea is to do this in the CI server(s):

  • install code
  • install vim ext
  • start vs code
  • run tests in vs code
  • redirect test output to file
  • read output from file and determine success/failure

Test runner

Anyone know how to properly test motion commands as in test/motion.test.ts? I see the comment in the gulp file that tests with dependencies on vscode do not run, but is there a way to get this to work? Would be nice to have all tests run before merging PR

request "true" command/normal mode for VS Code

Tracking this here. I suspect handling key strokes they way we're doing now doesn't cut it. There must be an explicit "command/normal" mode where key presses are not inserted as characters in the buffer.

Also, we need a block caret.

I don't think these things will block us for now, but I'm adding this issue to track this.

  • request command mode for VS Code
  • request block caret

bad experience for users with non-US keyboard layouts

Currently, the extension is unusable for users having non-US keyboard layouts enabled.

As it seems there's no solution in sight from VSC POV, we could try the following:

  • map all keys in a US keyboard layout
  • translate from US layout to other layouts prior to handling key
  • have a setting to determine which keyboard layout should be used internally for the translation by the extension

Other options that I've discarded:

I think having a package.json per keyboard layout won't work because we can't load those selectively. Similarly, we couldn't even load the keybindings sections selectively because all the keybindings have to be lumped together in there.

If we could create a custom context for the when key in a keybinding, though ("when": "kbdLayout_es_ES"), we could use package.json, but we'd have to load a huge amount of key bindings.

Therefore, it seems that having a translation layer in the code would be more flexible (we can load only the keyboard layout we're interested in based on a setting).

Example:

// In ModeHandler class
...
key = this.config.activeKeyboardLayout.translate(key);
// eventually
key = this.config.mappings.resolve(key);
modeHandler.handleKey(key);

Macro support

It may take a long time before anyone can get to this, which is fine, but it would be great if this plugin eventually supported Vim macros.

Add support for motion with jkl;

Many of Vim users prefer the ergonomic jkl; over the historic hjkl mapping..

Would it be possible to add support for the former too, please?

I also use VsVim extension with Visual Studio, and it is easy to configure it there with vimrc (or the specific vsvimrc file).

TextEditor.Insert cannot make several insertions in one go

Add this to extension.ts:

    vscode.commands.registerCommand('extension.vim_Insert', () => {
        TextEditor.Insert("a");
        TextEditor.Insert("b");
        TextEditor.Insert("c");  
    });    

Add this to packages.json:

...
  "contributes": {
    "commands": [
        {
          "title": "Vim Insert",
          "command": "extension.vim_Insert"
        }
    ],
...

If I try to use this command in an empty buffer, only a gets inserted.

This is an issue for mappings, where iabc should insert abc into the buffer, but currently VSCodeVim will only insert a. (Unmerged branch.)

Visual Selection of Text lines

The visual selection mode does not seem to work. I tried 'v' shift-v in the command mode to highlight characters and lines but did not work for me. Is that functionality missing? The documentation mentions visual mode several times so I am assumed that it works. If it is not available yet then what is the alternate way of selecting text in executing vim commands on the selected text?

Question about tests

I just forked and cloned the repo. when I run the gulp command, the only test suites that are run are the command-line lexer and the command line scanner suites. Is there a reason the other tests are being run?

Is there a way to run all of the tests?

alt-gr key combination not available

Hi,
I wanted to finish up the german keybindings, because atm I'm not able to type any curlyies or brackets. I wanted to start adding keybindings for them to the package.json, but after some search in the docs it seams that alt-gr isn't supported at all as a meta key. Does anybody have an idea how this could be realized?

convention for module names

We have these_names.ts and thisNames.ts. Which one do we want to use? Can we follow a TS guideline or VSC team guideline instead of creating a new one?

.vimrc?

Can you read default vimrc?

character position does not always persist on commands "j","k"

When applying motions commands in normal mode, such as to the end of a line: "$", beginning of a word: "w", or to the first character of a line "0" followed by the up or down commands "j", "k", the character position is off be the change from the previous command ("$", "0", "^", "w", "b", etc).

let's use these two lines below for clarification, and success criteria:

Alpha one test
Bravo two

If I am on "A" and I apply command "e", that will take me to the "a" character at the end of the word "Alpha", now if apply command "j" to move down a line I should land on the "o" character on "Bravo" but instead I land back on the "B" character in "Bravo".

If the line I am moving to has a populated character at that position, such as the previous example moving from "a" in "Alpha" down to "o" in "Bravo" I should land on the character directly below me.

If lets say I am on the last "t" in "test" I should, if I apply command "j" , be moved to the last character in the line below me "o", since the line below does not contain any character directly below the "t" in "test"

Alpha one test
    |        |
    |       /
    |     /
Bravo two

I hope that makes since, if not let me know and I will try to further clarify

renaming extension.ts to vim.ts

Maybe we can rename extension.ts and whatever else necessary to call it vim.ts so that we can have command names like vim.actions.d, vim.motion.dollar, etc. Also, vim.core.handleKey, etc.

Minor thing, but would look consistent and we wouldn't have to type extension as often :-)

add appveyor ci

@jpoon I don't seem to be able to add authorize apps for this repo. GH permissions drive me mad; I don't know what's missing. Could you please? I've added a first config file; it may fail, but that's ok; I'll debug later.

Block cursor in command mode

Hi, I'm interested in implementing this feature and studied the API. I didn't find anything and asked on the official issue tracker of vscode, but no answer so far. Does someone of you know, how I can get it done, to manipulate the cursor shape?

normal mode keyhandler

Ok, I thought I would just add a bunch of normal mode stuff, but ran into an issue, which is probably aware of. But I thought I would note it just to be aware.

Adding to src/mode/modeNormal.ts

"0" : () => { Cursor.move(Cursor.lineBegin()); },

works as expected but when trying to add:

"$" : () => { Cursor.move(Cursor.lineEnd()); },

The $ doesn't seem to pass through to the normal mode keyhandler at all when debugging it never fires the HandleKeyEvent in /src/mode/modeNormal.ts, so it isn't trap able.

I hope that is an accurate statement and enough of an explanation. Though I just started looking into this extension, so I don't know yet if the extension is the reason I think someone might be aware is the Cursor.lineEnd() function is already created, so I think someone might have already hit this.

I then thought I had it because the extension itself needed to register that key event so I added to extenstion.ts :

 registerCommand(context, 'extension.vim_$', () => handleKeyEvent("$"));

Then I found the keybindings in package.json so I added to the end of the keybindings:

     {
        "key": "$",
        "command": "extension.vim_$",
        "when": "editorTextFocus"
      }

But still no joy with all of that I still never get into the handleKeyEvents for the $
I am still researching but at first glance $ doesn't seem to be register-able, or I am missing something stupid.

Richard

implement forward commands

/** Ooops, more correctly called "find" motion, as "F" searches in a backwards pattern, while "f" searches in a forward pattern**/

f + character to move forward to.
example

function something () {
    var anObj = {
        prop: value
    };
    var anArray = [ "string", { prop: val, prop1: [1, 2, 3] } ];
}

if we are at the top, anywhere on the function line, and press ( f { ), the cursor should move to the first matching character, which happens to be at the end of the first line, but to complete this functionality if you press ";" while on the { on the top line, you should now move to the next occurrence of that character, which happens to be on the next line down, and press ";" again and you should move to the { in the array a couple lines below.

Not sure how to implement a command that requires user input, but will take a look and see what I can do. Does anyone else have any interest on working on this one?

Will take a look at how atom implements this feature.

discussion: goals for first public version

@jpoon

Perhaps we can set a few goals for a first release? Without going into much detail, I propose:

  • to implement 10-20 normal mode motions
  • to implement 10-20 normal mode actions (among them, .)
  • to implement 10-20 command line commands (among them, :normal)
  • to implement support for mappings (at least global and for normal mode)
  • to implement support for macros

Let me know what you think. This is by no means complete or maybe even feasible, but I'm just trying to get the ball rolling.

I'm I ignoring stuff like the neovim integration for now. FWIW, I'm not fond of the idea right now. But feel free to comment on that too.

Fat cursor during Normal mode

It is possible for my VS code to be bugged, but when I am in Normal mode the cursor is the same as is in insertion mode. I think its quite more comfortable when there is a visual distinction in the cursor as well, and not only in the information bar at the bottom.
It would be nice to have this feature - if not by default, at least in the configuration level.

coding style

@jpoon

Just a couple remarks:

  • VSCode team seem to favor tabs over spaces
  • When to use double quotes vs single quotes

Minor issues, but I'm not sure our choice is conscious?

Set TSD_GITHUB_TOKEN in AppVeyor

Build failures with GitHub API in trying to download TSDs. Created an OAuth token and set it as an environment variable in appveyor.yml.

Preferably would like to keep the token private by moving it in AppVeyor project settings.

Assigning to @guillermooo as only you have the POWER! โœŠ

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.