Tại sao ánh xạ lại <Esc> làm cho con trỏ nhảy?


9

Trong .vimrc:

inoremap ii <esc>                               " ii to go back into command mode

Vấn đề là, sau đó ii, con trỏ nhảy đúng 35 cột. Dòng khác chỉ ảnh hưởng đến Esc:

nnoremap <esc><esc> :noh<return><esc>

Tôi đã cố gắng bình luận nó ra, không giúp đỡ.


Đầy đủ.vimrc :

set nocompatible
filetype off


" Vundle ---------------------------------------------------------------------
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
Plugin 'gmarik/Vundle.vim'
Plugin 'bling/vim-airline'
Plugin 'vim-airline/vim-airline-themes'
Plugin 'scrooloose/nerdtree'
Plugin 'scrooloose/nerdcommenter'
Plugin 'scrooloose/syntastic'
Plugin 'freitass/todo.txt-vim'
Plugin 'plasticboy/vim-markdown'
Plugin 'tpope/vim-fugitive'                     " :GitCommands
Plugin 'tpope/vim-git'                          " allows to see branch in airline
Plugin 'airblade/vim-gitgutter'                 " git status in SL area
Plugin 'ctrlpvim/ctrlp.vim'                     " TODO: learn more about this
Plugin 'Shougo/neocomplete.vim'                 " TAB completion
" Plugin 'tmhedberg/SimpylFold'                 " should we add FastFold?
Plugin 'spf13/vim-autoclose'                    " autoclose brackets(properly)
Plugin 'godlygeek/tabular'                      " V -> : -> /SYMBOL_TO_LINE-UP
Plugin 'terryma/vim-multiple-cursors'           " steep learning curve
Plugin 'Yggdroot/indentLine'                    " shows | intendation
Plugin 'mhinz/vim-startify'                     " start screen
Plugin 'hashivim/vim-vagrant'
Plugin 'pearofducks/ansible-vim'
Plugin 'whatyouhide/vim-gotham'
Plugin 'ryanoasis/vim-devicons'                 " glyph icons everywhere
call vundle#end()


" System ---------------------------------------------------------------------
set lazyredraw                                  " do we need this?
set ttyfast                                     " theoretically make things faster
set mouse=a                                     " enable mouse
set guicursor=a:blinkon0                        " don't blink with the cursor
set termencoding=utf-8                          " terminal is UTF-8
set encoding=utf8                               " ...as well as the editor
set fileformat=unix                             " *nix format
set clipboard=unnamed                           " Fix clipboard in *nix
set wildmenu
set wildmode=longest:full,full
set wildignore=*.o,*.pyc,*.DS_Store
set magic                                       " needed for regexp
set hidden                                      " allow switching buffers w/o saving
set nojoinspaces                                " don't join spaces on paste
set formatoptions-=r formatoptions-=c formatoptions-=o " don't autoextend comments
set lines=40 columns=90                         " default size for GUI
set gdefault                                    " replace all without /g
set virtualedit=all                             " keep cursor horizontal pos. when scrolling

set backup                                      " backups ON
set undofile                                    " persistent undo
set backupdir=~/.vim/backup
set directory=~/.vim/tmp
set undolevels=1000                             " max number of undos
set undoreload=10000                            " max lines to to save for undo
set history=1000                                " 1000 of history (what?)

set incsearch                                   " incremental search
set smartcase                                   " ... and case sensitive if Uppercase is present

set expandtab                                   " spaces instead of tabs
set smarttab                                    " smart tabs/intends
set tabstop=4                                   " TAB = 4 spaces
set softtabstop=4
set smartindent
set autoindent
set shiftwidth=4
set shiftround                                  " round to 4

let NERDSpaceDelims=1                           " add space before comment
let NERDTreeMapOpenInTab='\r'                   " open files in new tab
let g:vim_markdown_folding_disabled=1           " don't fold *.md

let g:neocomplete#enable_at_startup = 1         " NeoComplete
let g:neocomplete#enable_auto_select = 1
let g:neocomplete#enable_smart_case = 1
let g:neocomplete#min_keyword_length = 2        " min symbols before autocomplete


" Visuals --------------------------------------------------------------------
filetype plugin indent on                       " enable filetype plugins
syntax enable                                   " enable syntax highlighting
let python_highlight_all=1                      " full python highlighting
colorscheme gotham256                           " GUI colours
let g:airline_theme = "gotham256"               " airline theme
if has("gui_running")
    set cul
endif

set title                                       " set terminal title
set t_Co=256                                    " 256 colors terminal
set guifont=Meslo\ LG\ S\ Regular\ for\ Powerline\ Nerd\ Font\ Complete\ Windows\ Compatible:h12
set guioptions=L                                " disable right scrlbar
set guioptions=R                                " disable left scrlbar
set number                                      " show line numbers
set nowrap                                      " don't wrap long lines
set fillchars+=vert:\?                          " vertical unicode split
set shortmess+=I                                " remove startup message

set splitbelow                                  " Natural splits
set splitright

set hlsearch                                    " highlight search results
set showmatch                                   " show matching brackets

set noerrorbells                                " disable bells
set novisualbell
set vb t_vb=

set laststatus=2                                " always show airline
let g:airline_powerline_fonts=1                 " use glyph fonts
let g:airline#extensions#tabline#enabled=1      " enable tabline (top)
let g:airline#extensions#tabline#fnamemod=':t'  " filename only

set completeopt-=preview                        " don't show doc. window by default
let g:SimplylFold_docstring_preview=1           " keep docstring unfolded.

let g:gitgutter_sign_added = '?'                " Gitgutter
let g:gitgutter_sign_modified = '•'
let g:gitgutter_sign_removed = '?'
let g:indentLine_char = '¦'                     " intendation vertical lines


" Hotkeys --------------------------------------------------------------------
nnoremap <F1> <nop>                             " F1 does noothing
map <F2> :NERDTreeToggle<CR>                    " F2 to open NerdTree
set pastetoggle=<F3>                            " F3 to switch in paste mode
map <F4> :mksession! ~/.vim/vim_session<CR>     " F4 to write current session
map <F5> :source ~/.vim/vim_session<CR>         " F5 to load prev. session

inoremap ii <esc>                               " ii to go back into command mode
let mapleader = "\<Space>"                      " remap leader key from '\' to Space
map <leader>cd :cd %:p:h<cr>:pwd<cr>            " CWD to the dir of the open buffer
nnoremap <esc><esc> :noh<return><esc>           " 2xESC clears search highlights

nnoremap <C-J> <C-W><C-J>                       " switch splits with CTRL+hjkl
nnoremap <C-K> <C-W><C-K>
nnoremap <C-L> <C-W><C-L>
nnoremap <C-H> <C-W><C-H>

nmap <leader>l :bn<CR>                          " next buffer by Space+l
nmap <leader>h :bp<CR>                          " previous buffer by Space+h
nmap <leader>q :bp <BAR> bd #<CR>               " close buffer by Space+q

vnoremap < <gv                                  " leave txt selected after <>
vnoremap > >gv

set t_ku=OA                                   " fix arrow keys
set t_kd=OB
set t_kr=OC
set t_kl=OD

nmap <leader>f1 :set foldlevel=0<CR>            " change folding levels
nmap <leader>f2 :set foldlevel=1<CR>
nmap <leader>f3 :set foldlevel=2<CR>
nmap <leader>f4 :set foldlevel=3<CR>

nnoremap <silent> <leader>gs :Gstatus<CR>       " GIT shortcuts
nnoremap <silent> <leader>gd :Gdiff<CR>
nnoremap <silent> <leader>gc :Gcommit<CR>
nnoremap <silent> <leader>gb :Gblame<CR>
nnoremap <silent> <leader>gl :Glog<CR>
nnoremap <silent> <leader>gp :Git push<CR>
nnoremap <silent> <leader>gr :Gread<CR>
nnoremap <silent> <leader>gw :Gwrite<CR>
nnoremap <silent> <leader>ge :Gedit<CR>
nnoremap <silent> <leader>ga :Git add %:p<CR>

set backspace=eol,start,indent                  " esoteric backspace fix
set whichwrap+=<,>                              " move to another line with <- ->

if bufwinnr(1)                                  " resize splits with +-
  map + <C-W>+
  map - <C-W>-
endif

" NeoComplete
" <CR>: close popup and save indent.
inoremap <silent> <CR> <C-r>=<SID>my_cr_function()<CR>
function! s:my_cr_function()
    " return neocomplete#close_popup() . "\<CR>"
    " For no inserting <CR> key.
    return pumvisible() ? neocomplete#close_popup() : "\<CR>"
endfunction

" <TAB>: completion.
inoremap <expr><TAB>  pumvisible() ? "\<C-n>" : "\<TAB>"


" Macros ---------------------------------------------------------------------

" Emulate any other editor with tabs
try
 set switchbuf=useopen,usetab,newtab
catch
endtry

" Close vim if NerdTree is the only buffer left
autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTreeType") && b:NERDTreeType == "primary") | q | endif

" Return to last edit position when opening files
autocmd BufReadPost *
    \ if line("'\"") > 0 && line("'\"") <= line("$") |
    \   exe "normal! g`\"" |
    \ endif

" Python with virtualenv support
py << EOF
import os
import sys
if 'VIRTUAL_ENV' in os.environ:
  project_base_dir = os.environ['VIRTUAL_ENV']
  activate_this = os.path.join(project_base_dir, 'bin/activate_this.py')
  execfile(activate_this, dict(__file__=activate_this))
EOF

" Enable omni completion.
autocmd FileType css setlocal omnifunc=csscomplete#CompleteCSS
autocmd FileType html,markdown setlocal omnifunc=htmlcomplete#CompleteTags
autocmd FileType javascript setlocal omnifunc=javascriptcomplete#CompleteJS
autocmd FileType python setlocal omnifunc=pythoncomplete#Complete
autocmd FileType xml setlocal omnifunc=xmlcomplete#CompleteTags

" Enable heavy omni completion.
if !exists('g:neocomplete#sources#omni#input_patterns')
  let g:neocomplete#sources#omni#input_patterns = {}
endif

" format JSON code
com! FormatJSON %!python -m json.tool

" BG fix for tmux
set t_ut=

1
Có lẽ không phải là giải pháp nhưng để tránh một số tác dụng phụ không mong muốn trong ánh xạ của bạn, bạn nên sử dụng inoremap ii <Esc>. Tôi không nghĩ rằng điều đó sẽ giải quyết vấn đề của bạn nhưng đó vẫn là một cách thực hành tốt nhất. Ngoài ra, bạn có thể vui lòng gửi bài đầy đủ của mình .vimrc: điều đó có thể giúp chúng tôi giúp bạn ;-)
statox

@statox, Thay đổi thành inoremap, cùng tác dụng. Đã thêm liên kết đến vimrc. Cảm ơn:]
asv

Câu trả lời:


20

Vấn đề của bạn là bạn đặt bình luận ở cuối dòng cách nhau bởi khoảng trắng. Vim diễn giải những khoảng trắng này như là một phần của lệnh và ánh xạ của bạn.

Nếu bạn thay thế:

inoremap ii <esc>                               " ii to go back into command mode

Bởi

" ii to go back into command mode
inoremap ii <Esc>

Bạn sẽ giải quyết vấn đề của bạn.

Như một quy tắc chung, đừng đặt bình luận ở cuối dòng của bạn trong.vimrc


Và như một phần thưởng Dưới đây là một phương pháp để chuyển đổi của bạn .vimrctrong một định dạng thích hợp.

Chỉnh sửa Sử dụng lệnh này. (So ​​với bản gốc, ký tự dòng mới \rcó thể được sao chép trực tiếp và bạn không phải sử dụng ^M. Cảm ơn @Sato!)

 :%s/\(^.*\)\s\+\(".*\)/\2\r\1

Lệnh gốc

 :%s/\(^.*\)\s\+\(".*\)/\2^M\1

(Để chèn ^Msử dụng đúng cách Ctrl-vEnterđể chèn một ký tự dòng mới thực sự)

Lệnh này sẽ bắt đầu dòng có chứa một nhận xét ở cuối dòng và thay thế dòng đầy đủ bằng hai dòng chứa nhận xét và sau đó là lệnh.

(Lưu ý rằng lệnh dường như gây rối với chức năng my_cr_function, do đó bạn có thể muốn kiểm tra xem nó không tạo ra để nhiều rắc rối trong của bạn .vimrccó thể thay thế %bởi một số dãy và thay đổi của bạn .vimrctừng bước)


@Sato cũng đề xuất liên kết này về cách các bình luận và multiline hoạt động đáng để đọc nó.


2
@fruglemonkey bạn nói đúng nhưng tôi không nghĩ rằng đó là một cách hay để giới thiệu: sử dụng thanh theo cách này là - theo ý kiến ​​của tôi - một nguồn lỗi tiềm năng khó phát hiện. Thật dễ dàng để quên một thanh và dành nhiều thời gian cố gắng tìm ra những gì gây ra vấn đề. Tôi nghĩ rằng việc đưa ra nhận xét trên các dòng riêng biệt sẽ an toàn hơn :-)
statox

3
Đối với những gì nó có giá trị, bài đăng này giải thích chính xác những gì đang diễn ra với các bình luận trong VimL.
Sato Katsura

4
Yon cũng có thể thay thế ^Mtrong chuỗi thay thế bằng \r.
Sato Katsura

4
Đáng buồn là \rkhông hoạt động trong tất cả các bối cảnh, bạn phải sử dụng \ntrong các mẫu tìm kiếm. Nhưng nó làm việc ở đây.
Sato Katsura

1
Nếu bạn đọc liên kết của Sato, bạn sẽ thấy "Một số định nghĩa lệnh cho phép nhận xét trong ngữ cảnh của chúng set ai " Set &autoindenthoạt động, xử lý "giống như dòng mới hoặc thanh, nhưng điều này không áp dụng cho :let." ... Trong một số trường hợp, có thể thêm nhận xét tại cuối dòng nhưng tôi nghĩ rằng tôi chưa bao giờ thấy .vimrcsử dụng chúng tốt , vì vậy tôi sẽ khuyên bạn không nên sử dụng chúng.
statox
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.