Vim使用=命令时无法正确缩进Python代码

3 投票
2 回答
542 浏览
提问于 2025-04-17 15:26

当我使用 = 命令来给整个 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 个回答

0

你可以正常粘贴内容,使用 :set paste 命令。我有一个非常实用的宏可以做到这一点:

set pastetoggle=<F10>

你可以把它设置成其他任何键,只需要把它添加到你的 .vimrc 文件里就可以了。

2

你应该去掉 filetype onfiletype 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+=.,(
  1. 你完全不需要那个补全机制,因为 Vim 默认的全能补全功能已经足够强大了。

  2. 由于那个补全机制的实现方式,以及你的字典文件可能是怎么写的,Vim 必须把 .( 视为关键字字符。

  3. 你的自定义语法文件可能根本不是那样写的,所以这个设置可能根本不起作用。

  4. iskiskeyword 的简写,表示定义什么是关键字字符的选项。

你似乎是从别人那里复制了设置,却没有理解他们的意思。你自己 ~/.vimrc 中的答案就足以说明这个想法是多么错误。

撰写回答