Auto-indent not working on Python's "with" - python

I am using VIM 7.4 on Ubuntu 16.04, and am coding for Python 3.5.
When writing a Python file (.py), the indentation works perfectly, except for the with statement. Namely, I could remap tab to indent by four spaces, VIM automatically indents by four spaces after a colon (:), and so on.
But when it comes to the with ... as syntax, it fails indenting a newline.
Visual example:
if x == 12:
then tab results on an indented newline, but
with open("test.txt", 'r') as file:
then tab resultes on a not indented newline.
I checked a lot of questions, that I won't link because they are too numerous, but here are some of the things I tried:
Adding set autoindent in my .vimrc;
Adding set smartindent in my .vimrc;
Typing filetype indent on in VIM's interpreter;
Typing :set indentkeys? and checking if the colon was in the list (it was).
It is nearly empty, so I doubt it will be useful, but here is my .vimrc:
set nocompatible
set autoindent
set smartindent
set tabstop=8 softtabstop=0 expandtab shiftwidth=4 smarttab
inoremap <S-Tab> <C-d>
How can I fix VIM so it recognizes with...as and indents after this on a newline?

The solution is indeed in the filetype indent on command.
For some reason, typing it in the VIM interpreter will not do anything. Therefore, one could think that this is not the way to fix this.
However, adding the following line to the .vimrc effectively fixed the problem:
filetype indent on

Related

introduce <Tab> in new line while creating a block for python files in vim

I want to introduce a tab character in the new line for creating a new block in vim for python files.
Example
when I write
if(a < 5):
and press Enter, the cursor should come in next line with a tab after if in vertical alignment from the above line. Something like this
if(a < 5):
a = 5
I have configured my .vimrc file like this
set nu
set autoindent
set tabstop=4
syntax enable
set showmatch
colorscheme gruvbox
set bg=dark
"automatically creates a block after :
autocmd FileType python inoremap :<CR> :<CR><Tab>
Note:
1) Last line, I have written for the intended purpose mentioned in my question.
2) autoindent is set.
3) I dont want to use any plugin.
Problem I am facing:
When I press Enter after : , in addition to tab, one extra space is also created which creates wrong indentation.
Thanks in advance for helping
The way you're trying to do this is the hard way. There's a filetype plugin and a Python syntax type and it already knows what to do.
filetype plugin indent on
And don't use set autoindent. It's not very intelligent, it just copies the indent from the previous line. It's the opposite of what you're trying to do.
Files ending in .py should automatically get the right settings. If you need to force the current syntax type in a buffer, you can do that with
:set filetype=python
If you want to use tabs instead of spaces,
" Globally
set noexpandtab
" Python only
autocmd FileType python set noexpandtab
However, I'll note that using tabs in Python is not recommended and goes against published best practices (see PEP 8).
Lastly I'll mention that "plugin" is just a Vim term. All of this ships with Vim by default, this does not create a third-party dependency.

vim expandtab doesn't work after new installation

let mapleader = ","
set number
set textwidth=79 " lines longer than 79 columns will be broken
set shiftwidth=4 " operation >> indents 4 columns; << unindents 4 columns
set tabstop=4 " a hard TAB displays as 4 columns
set expandtab " insert spaces when hitting TABs
set softtabstop=4 " insert/delete 4 spaces when hitting a TAB/BACKSPACE
set shiftround " round indent to multiple of 'shiftwidth'
set cindent " align the new line indent with the previous line
set nobackup
set nowritebackup
set noswapfile
vnoremap < <gv " continue visual selecting after shiftwidh
vnoremap > >gv
nnoremap <C-h> <C-w>h
nnoremap <C-j> <C-w>j
nnoremap <C-k> <C-w>k
nnoremap <C-l> <C-w>l
nnoremap j gj
nnoremap k gk
nnoremap <Leader>r :w \| !clear && ./%<CR>
command W w !sudo tee % > /dev/null
noremap <silent><Leader>/ :nohls<CR>
set clipboard=unnamedplus
set paste
set ignorecase
Somehow after reinstallation of my arch linux, vim stoped work poperly.
After doing the same I did couple days ago with old system - now python complains about indentation.
I have no installed plugins or whatever, why does this broke?
P.S. already viewed same quiestions, but them was about plugins, which I doesn't have.
P.S. Noticed that after : vim won't start newline according cindent
Still indentation brokes after :set paste. Why this happens?
set paste "breaks" the indentation. That is all it does. That is the reason it works. Pasting text into Vim would normally be the same thing as just typing each letter. For example, open a file that has some text in it (in Vim), and make sure that Vim is in normal mode. Copy the following text: d4dAhowdy. Paste it into Vim. You will see that it deletes four lines (d4d), changes to insert mode at the end of the line (A), and types howdy. Pasting into Vim is the same thing as typing the letters; it does not necessarily just paste everything exactly how it comes. Let's say you type:
if this:
that
Once you hit Enter after if this:, Vim would indent the line, so that code would actually appear as:
if this:
that
Using set paste turns that off so that when you paste that code in (with the indentation included), Vim does not auto-indent and everything shows up normally. If you were to set nopaste and then paste the above unindented code, Vim would indent it for you.

macVim: line continuation in python creates unnecessary tab?

Whenever I want to use line continuation in my python script using macVim, I receive the following format:
a = one,\
two,\
three
instead of:
a = one,\
two,\
three
I've rifled through help, and was unable to locate what exactly is causing macVim to append an extra tab upon using line continuation.
Note: I currently have the following in my .vimrc file:
set tabstop=4
set shiftwidth=4
set expandtab
set softtabstop=4
You have your tabs set to 4 and not 2
Make sure that you have
filetype plugin indent on
You can also use something as followed in your .vimrc as a oneliner for defaults instead of adding them on separate lines
Use 2 instead of 4
set ts=2 sts=2 sw=2 noexpandtab
Your settings are almost fine. In Python code, the tab settings should always be
:set tabstop=8 shiftwidth=4 softtabstop=4 expandtab
These settings honour the recommendations in the "Style guide for Python code" known as PEP 8 and are universally followed in Python code. Stick to these settings, or even better, set up an autocommand that sets them automatically. In your vimrc:
autocmd FileType python setlocal ts=8 sw=4 sts=4 et
Now on to your problem: This is caused by the default indentation rules in Vim's indent script for Python. Fortunately, these rules can be customised. In your case you just need to put the following line in your vimrc.
let g:pyindent_continue = '&shiftwidth'
(In newer versions of Vim, use 'shiftwidth()' instead of '&shiftwidth'.)
For more information, look up :h ft-python-indent.

Auto indent doesn't work when using vim coding python

I want to use vim to write python code but there is a problem on auto indention.
First I downloaded the latest python.vim from http://www.vim.org/scripts/script.php?script_id=790 and putted it in the correct dir.
Then I edited my vimrc.
syntax on
set nu
set tabstop=4
set softtabstop=4
set shiftwidth=4
"set cindent
set autoindent
set smartindent
set expandtab
set filetype=python
au BufNewFile,BufRead *.py,*.pyw setf python
Now I find that keywords like 'for', 'if', 'while' can autoindent perfectly. But it doesn't work on 'def', 'try', 'except'.
What should I do? Thank you very much.
I have this line in my vimrc for long time, don't know if there is better way nowadays. but you could at least give it a try.
set cindent
autocmd FileType python setlocal foldmethod=indent smartindent shiftwidth=4 ts=4 et cinwords=if,elif,else,for,while,try,except,finally,def,class
and I have
filetype plugin indent on
too
That vim script you linked to doesn't do any auto-indentation, only syntax highlighting.
The auto-indentation you are observing is the one that's built into vim, it is designed for coding C, and it only recognizes the keywords described here:
http://vimdoc.sourceforge.net/htmldoc/options.html#%27cinwords%27
That's why it works for if and while but not def (there's no def in C).
You turned it on with set cindent.
You may want to try another script like this one:
http://www.vim.org/scripts/script.php?script_id=974

Errors editing python with Vim

When I edit a python file in Vim (using MacVim), and I press o to insert a new line, Vim throws the following errors:
Error detected while processing function <SNR>20_CheckAlign..GetPythonIndent:
line 30:
E121: Undefined variable: dummy
Press ENTER or type command to continue
Error detected while processing function <SNR>20_CheckAlign..GetPythonIndent:
line 30:
E15: Invalid expression: line('.') < 7 ? dummy : synIDattr(synID(line('.'), col('.')
, 1), 'name') =~ '\(Comment\|String\)$'
How do I fix this?
I figured out the problem. It was throwing an error whenever the file's tab settings were different from the editor's tab settings. For example, my test.py file was set to 2 spaces per tab, with tabs expanded into spaces, whereas my editor was set to 4 spaces per tab, no expand.
So the solution workaround was to set Vim's tab settings to the settings of the python file being edited.
Use the following modeline in your python files, that its tab settings are consistent.
# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4
Alternately, you have them set in your .vimrc file too.
set tabstop=4
set shiftwidth=4
set softtabstop=4
set expandtab
These are minimal set of things which you ensure consistency when working with python file.
There are some great vimrc examples available which you can use as well.
Changing the indentation settings did not work for me so I worked around this by modifying the python indentation file (/path/to/vim/indent/python.vim).
In the GetPythonIndent function I simply replaced all instances of dummy with 0. This fixed the problem for me.
Alternatively you could just set s:maxoff to something ridiculously high but this is somewhat less elegant.
To resolve the problem it seems one must edit the function GetPythonIndent() in /path/to/vim/indent/python.vim.
To do this, one must read in the help docs, user_30, indent, indentexpr, and indent-expression (also, C-indenting contains general info that will help explain what's going on).
The simplest solution therefore is to switch indenting off when you are editing a python file, until such time as you have time to deal with this irritating bug:
:set indentexpr=""
You will see in /path/to/vim/indent/python.vim that expression is set to run the buggy function GetPythonIndent:
setlocal indentexpr=GetPythonIndent(v:lnum)
Set it to "" there to save the inconvenience of unsetting it every time you open a python file.
Dani's answer above looks like it might be the better solution, since it would preserve some form of auto-indentation. But this will give you instant relief and save having to read and understand the buggy func.

Categories

Resources