Take the 2-minute tour ×
Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

Whenever I open a file with vim, the vim session starts with 2c having been automatically/programmatically 'pressed'. This means that if I start off trying to move down the file by pressing j, then the action 2cj is executed which means that two lines get deleted. Thus, each time I start vim session, I have to hit <esc> before proceeding as normal. This is getting tedious and screwing with my vim muscle memory.

I have looked up and down my .vimrc file many times and I cannot understand what could possibly be causing this. Perhaps it doesn't even have anything to do with the .vimrc file. Nevertheless, this is my .vimrc file:

" vim settings

" Vundle Settings - https://github.com/gmarik/vundle

set nocompatible " not compatible with vi
filetype off
set rtp+=~/.vim/bundle/vundle/
call vundle#rc()

" let vundle manage vundle
Bundle 'gmarik/vundle'

" my vim plugins
"Bundle 'kien/ctrlp.vim'
"Bundle 'scrooloose/nerdtree'
"Bundle 'mileszs/ack.vim'
" Bundle 'scrooloose/syntastic'
"Bundle 'Raimondi/delimitMate'
"Bundle 'tpope/vim-commentary'
"Bundle 'tpope/vim-endwise'
Bundle 'tpope/vim-fugitive'
"Bundle 'othree/html5.vim'
"Bundle 'pangloss/vim-javascript'
"Bundle 'itspriddle/vim-jquery'
"Bundle 'tpope/vim-markdown'
"Bundle 'mmalecki/vim-node.js'
"Bundle 'Lokaltog/vim-powerline'
"Bundle 'tpope/vim-ragtag'
"Bundle 'tpope/vim-surround'
" Bundle 'sjl/vitality.vim'
"Bundle 'duff/vim-scratch'
"Bundle 'cakebaker/scss-syntax.vim'
"Bundle 'kchmck/vim-coffee-script'
"Bundle 'groenewege/vim-less'
"Bundle 'nono/vim-handlebars'
"Bundle 'tsaleh/vim-matchit'
"Bundle 'benmills/vimux'
"Bundle 'mattn/zencoding-vim'
"Bundle 'int3/vim-taglist-plus'

filetype plugin indent on

" => General

"""" Abbreviations
abbr funciton function
abbr teh the
abbr tempalte template

"set winwidth=120

set autoread " detect when a file is changed

" make backspace behave in a sane manner
set backspace=indent,eol,start

" set a map leader for more key combos
let mapleader = ","
let g:mapleader = ","

" change history to 1000
set history=10000

" Tab control
set smarttab
set expandtab
set shiftwidth=4
set tabstop=4
set softtabstop=4

" faster redrawing
set ttyfast

" allow matching of if/end, etc. with %
" runtime macros/matchit.vim

" highlight conflicts
match ErrorMsg '^\(<\|=\|>\)\{7\}\([^=].\+\)\?$'

" Enable file type detection and do language dependent indenting
filetype plugin indent on

" file type specific settings
if has("autocmd")
    autocmd FileType yaml setlocal ts=2 sts=2 sw=2 expandtab
    autocmd FileType make setlocal ts=8 sts=8 sw=8 noexpandtab
    autocmd FileType ruby setlocal ts=2 sts=2 sw=2 expandtab
    autocmd FileType html setlocal ts=4 sts=4 sw=4 expandtab
    autocmd FileType jade setlocal ts=2 sts=2 sw=2 noexpandtab
    "autocmd WinEnter * setlocal cursorline
    "autocmd WinLeave * setlocal nocursorline

    " automatically resize panes on resize
    autocmd VimResized * exe "normal! \<c-w>="
    autocmd BufWritePost .vimrc source $MYVIMRC
    " save all files on focus lost, ignoring warnings about untitled buffers
    autocmd FocusLost * silent! wa
    autocmd BufNewFile,BufRead *.json set filetype=javascript
    autocmd BufNewFile,BufRead *.ejs set filetype=html

" code folding settings
set foldmethod=syntax " fold based on indent
set foldnestmax=10 " deepest fold is 10 levels
set nofoldenable " don't fold by default
set foldlevel=1

" => User Interface

set wildmenu " enhanced command line completion
set hidden " current buffer can be put into background
set showcmd " show incomplete commands
set noshowmode " don't show which mode disabled for PowerLine
set wildmode=list:longest " complete files like a shell
set scrolloff=10 " lines of text around cursor
set shell=/bin/zsh
set ruler " show postiion in file
set cmdheight=1 " command bar height

set title " set terminal title

" Searching
set ignorecase " case insensitive searching
set smartcase " case-sensitive if expresson contains a capital letter
set hlsearch
set incsearch " set incremental search, like modern browsers
set nolazyredraw " don't redraw while executing macros

set magic " Set magic on, for regex

set showmatch " show matching braces
set mat=2 " how many tenths of a second to blink

" switch to line when editing and block when not
" let cursor_to_bar   = "\<Esc>]50;CursorShape=1\x7"
" let cursor_to_block = "\<Esc>]50;CursorShape=0\x7"
" let &t_SI = cursor_to_bar
" let &t_EI = cursor_to_block

" error bells
set noerrorbells
set visualbell
set t_vb=
set tm=500

" switch syntax highlighting on
syntax on

set background=dark
colorscheme Tomorrow-Night-Bright

" set number " show line numbers
set relativenumber " show relative line numbers

set wrap " turn on line wrapping
"set nowrap "turn off line wrapping
set wrapmargin=8 " wrap lines when coming within n characters from side
set linebreak " set soft wrapping
set showbreak=… " show ellipsis at breaking

set autoindent " automatically set indent of new line

set encoding=utf8
set t_Co=256 " Explicitly tell vim that the terminal supports 256 colors"
    lang en_US

" => Files, backups, and undo

"set nobackup
"set nowritebackup
"set noswapfile
set backupdir=~/.vim-tmp,~/.tmp,~/tmp,/var/tmp,/tmp
set directory=~/.vim-tmp,~/.tmp,~/tmp,/var/tmp,/tmp

" => StatusLine
set laststatus=2 " show the satus line all the time

" the status line is set by the powerline plugin

" => Mappings
" General mappings/shortcuts for functionality
" Additional, plugin-specific mappings are located under
" the plugins section

" clear search results on escape
nnoremap <silent> <esc> :nohlsearch<cr><esc>

" remap esc
inoremap jk <esc>

" remove extra whitespace
nmap <leader><space> :%s/\s\+$<cr>

" shortcut to save
nmap <leader>, :w<cr>

" set paste toggle
set pastetoggle=<F6>

" toggle paste
map <leader>v :set paste!<cr>

" edit ~/.vimrc
map <leader>e :e! ~/.vimrc<cr>

" clear highlighted search
noremap <space> :set hlsearch! hlsearch?<cr>

" toggle invisible characters
set invlist
set listchars=tab:▸\ ,eol:¬,trail:⋅,extends:❯,precedes:❮
set showbreak=↪
nmap <leader>l :set list!<cr>

" Textmate style indentation
vmap <leader>[ <gv
vmap <leader>] >gv
nmap <leader>[ <<
nmap <leader>] >>

" buffer shortcuts
nmap <leader>n :bn<cr> " go to next buffer
nmap <leader>p :bp<cr> " go to prev buffer
nmap <leader>q :bd<cr> " close the current buffer
" switch between current and last buffer
nmap <leader>. <c-^>

" enable . command in visual mode
vnoremap . :normal .<cr>

" Window movement shortcuts
" move to the window in the direction shown, or create a new window
function! WinMove(key)
    let t:curwin = winnr()
    exec "wincmd ".a:key
    if (t:curwin == winnr())
        if (match(a:key,'[jk]'))
            wincmd v
            wincmd s
        exec "wincmd ".a:key

map <silent> <C-h> :call WinMove('h')<cr>
map <silent> <C-j> :call WinMove('j')<cr>
map <silent> <C-k> :call WinMove('k')<cr>
map <silent> <C-l> :call WinMove('l')<cr>

map <leader>wc :wincmd q<cr>

" equalize windows
map <leader>= <C-w>=

" toggle cursor line
nnoremap <leader>i :set cursorline!<cr>

" scroll the viewport faster
nnoremap <C-e> 3<C-e>
nnoremap <C-y> 3<C-y>

" moving up and down work as you would expect
nnoremap <silent> j gj
nnoremap <silent> k gk

" toggle search result highlighting on/off
map  <F12> :set hls!<CR>
imap <F12> <ESC>:set hls!<CR>a
vmap <F12> <ESC>:set hls!<CR>gv

function! ToggleNuMode()
    if (&rnu == 1)
        setlocal nu
        setlocal rnu

nnoremap <leader>/ :call ToggleNuMode()<cr>

" find out what syntax stack a statement belongs to
nmap <leader>s :call <SID>SynStack()<cr>
function <SID>SynStack()
    if !exists("*synstack")
    echo map(synstack(line('.'), col('.')), 'synIDattr(v:val, "name")')

function! ApplyLocalSettings(dirname)
    " convert windows paths to unix style
    let l:curDir = substitute(a:dirname, "\\", "/", "g")

    " walk to the top of the dir tree
    let l:parentDir = strpart(l:curDir, 0, strridx(l:curDir, "/"))
    if isdirectory(l:parentDir)
        call ApplyLocalSettings(l:parentDir)

    " now walk back down the path and source .vimsettings as you find them.
    " child directories can inherit from their parents
    let l:settingsFile = a:dirname . "/.vimrc.local"
    if filereadable(l:settingsFile)
        exec ":source" . l:settingsFile
" autocmd! BufEnter * call ApplyLocalSettings(expand("<afile>:p:h"))

" smart tab completion
function! Smart_TabComplete()
    let line = getline('.')                         " current line

    let substr = strpart(line, -1, col('.')+1)      " from the start of the current
    " line to one character right
    " of the cursor
    let substr = matchstr(substr, "[^ \t]*$")       " word till cursor
    if (strlen(substr)==0)                          " nothing to match on empty string
        return "\<tab>"
    let has_period = match(substr, '\.') != -1      " position of period, if any
    let has_slash = match(substr, '\/') != -1       " position of slash, if any
    if (!has_period && !has_slash)
        return "\<C-X>\<C-P>"                         " existing text matching
    elseif ( has_slash )
        return "\<C-X>\<C-F>"                         " file matching
        return "\<C-X>\<C-O>"                         " plugin matching
inoremap <tab> <c-r>=Smart_TabComplete()<CR>

" => Plugins

" Powerline settings
" must have modified font installed to enable fancy
" let g:Powerline_symbols = 'fancy'

" let g:Powerline_stl_path_style = 'filename'

" close NERDTree after a file is opened
let g:NERDTreeQuitOnOpen=1
" Toggle NERDTree
nmap <silent> <leader>k :NERDTreeToggle<cr>
" expand to the path of the file in the current buffer
nmap <silent> <leader>y :NERDTreeFind<cr>

" map fuzzyfinder (CtrlP) plugin
nmap <silent> <leader>t :CtrlP<cr>
nmap <silent> <leader>r :CtrlPBuffer<cr>

" Fugitive Shortcuts
nmap <silent> <leader>gs :Gstatus<cr>

" CtrlP ignore patterns
let g:ctrlp_custom_ignore = {
            \ 'dir': '\.git$\|node_modules$\|\.hg$\|\.svn$',
            \ 'file': '\.exe$\|\.so$'
            \ }

" search the nearest ancestor that contains .git, .hg, .svn
let g:ctrlp_working_path_mode = 2

I don't expect that anyone will read through all of that, but I am not really sure what part of it could possibly be causing this issue.

Does anyone have any insight into what could possible be causing these key presses to get automatically added at the beginning of a vim session?


I am on a Mac with OS X 10.8 and I use apple's default Terminal program. I am also using oh-my-zsh, but I don't imagine this affects anything.

share|improve this question
add comment

1 Answer

up vote 1 down vote accepted

It could be the termresponse sequence from your terminal. Try starting vim as

$ vim --cmd 'set t_RV='

You might also try executing this within vim:

:echo v:termresponse

to see if it contains 2c.

I used to have a similar problem when I ran vim on a server in the back room from a terminal emulator on my desktop machine. It took so long for the termresponse sequence to get back to vim from the terminal that part of it was accepted as if it had come from the keyboard. I wound up disabling the termresponse query and setting 'ttymouse' "manually" in my ~/.vimrc. See

:help 'ttymouse'
:help t_RV
:help v:termresponse


I found the ~/.vimrc file from that system. Here is what I had in it to fix that problem.

set t_RV= ttymouse=xterm2   " Temporary (?) kludge to avoid problems
                            " when starting vim with "-c grep
                            " something" where the termresponse puts
                            " vim into insert mode.  [2006-01-18]
                            " 'ttymouse' must be set to "xterm2"
                            " manually to get the mouse to drag window
                            " borders because vim needs the
                            " termresponse to set it correctly
                            " automatically.
share|improve this answer
the first command gives me "Error detected while processing pre-vimrc command line: E14: Invalid address" and the second command echos an empty string. Not sure where this leaves me... –  jbranchaud Feb 18 '13 at 4:29
Sorry. I left off the "set". Correcting the answer now. –  garyjohn Feb 18 '13 at 4:38
The line you provided from your .vimrc magically worked. I added it in and vim is now starting up normally. Do you know what is going on here? I am happy it works, but I would be even happier with an explanation. –  jbranchaud Feb 18 '13 at 4:40
I can give only a simple explanation because I don't understand the entire process. I'm troubleshooting another problem with the termresponse behavior now, time permitting. When vim starts, it sends an escape sequence to the terminal, specified by 't_RV'. The terminal responds with an escape sequence containing an identifier string. I don't understand the contents of that string. Under "normal" circumstances, Vim recognizes the terminal response and processes it accordingly. Under some circumstances, though, Vim thinks the sequence came from the keyboard and processes it as key codes. –  garyjohn Feb 18 '13 at 4:56
add comment

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.