Vim使用=命令时无法正确缩进Python代码
当我使用 = 命令来给整个 Python 文件或者某一部分缩进时,它并没有正确地缩进。以下是我的 vimrc 配置:
set nocompatible
syntax on
set ruler
set tabstop=2
set softtabstop=2
set shiftwidth=2
set expandtab
set smarttab
set hlsearch
set incsearch
set ignorecase
set autoindent
" turn on line numbers:
set number
" Toggle line numbers and fold column for easy copying:
nnoremap <F2> :set nonumber!<CR>:set foldcolumn=0<CR>
nnoremap <F4> :set nospell!<CR>
nnoremap <F3> :set invpaste paste?<Enter>
imap <F3> <C-O><F3>
set pastetoggle=<F3>
filetype on
filetype plugin indent on
filetype plugin on
" Execute file being edited with <Shift> + e:
map <buffer> <S-e> :w<CR>:!/usr/bin/env python % <CR>
let g:solarized_termcolors=256
set background=dark
colorscheme solarized
"set spell spelllang=en_us
set backspace=indent,eol,start
autocmd FileType python set complete+=k~/.vim/syntax/python.vim isk+=.,(
autocmd VimEnter * NERDTree
另外,当我用 w 或 b 这样的命令在我的 Python 文件中循环时,或者在删除内容时,它也不会正确删除。比如说,在删除某个单词之前,它不会停在 . 或 ( 这些符号上,甚至会把这些符号也删掉。
2 个回答
你可以正常粘贴内容,使用 :set paste
命令。我有一个非常实用的宏可以做到这一点:
set pastetoggle=<F10>
你可以把它设置成其他任何键,只需要把它添加到你的 .vimrc
文件里就可以了。
你应该去掉 filetype on
和 filetype plugin on
,只保留 filetype plugin indent on
这一行就可以了。
编辑
关于 .
和 (
的问题,几乎肯定是由 iskeyword
引起的。我模糊记得有人遇到过同样的问题,因为他/她在某个错误的信息博客上看到需要基于字典的补全。由于他/她的字典文件中的条目是 .method(
的形式,所以他/她需要 .
被视为关键字字符。
在编辑 Python 文件时,试试这个命令:
:verbose set iskeyword?
它应该返回一个用逗号分隔的值列表,其中包括 .
和 (
以及设置的位置。很可能是某个第三方的 Python ftplugin,因为默认的 ftplugin 不会更改 iskeyword
。
导致 .
/(
问题的这一行是:
autocmd FileType python set complete+=k~/.vim/syntax/python.vim isk+=.,(
你完全不需要那个补全机制,因为 Vim 默认的全能补全功能已经足够强大了。
由于那个补全机制的实现方式,以及你的字典文件可能是怎么写的,Vim 必须把
.
和(
视为关键字字符。你的自定义语法文件可能根本不是那样写的,所以这个设置可能根本不起作用。
isk
是iskeyword
的简写,表示定义什么是关键字字符的选项。
你似乎是从别人那里复制了设置,却没有理解他们的意思。你自己 ~/.vimrc
中的答案就足以说明这个想法是多么错误。