Vim: python indenting like C indenting

Computing/vim tips 2012.02.12 18:14

I set cinoptions as "(0,W4" when I have to edit C/C++ source files.

This cinoptions setting adjusts indenting of your sourcecode as follows:

somevalue = function_foo(argument1,  /* you type Enter key here */
                         arg2, /* And the cursor is automatically located right next to below "(" letter */
                         argument3);

Yes, it automtically indents lines inside parentheses to the column where the starting parenthesis is.

Recently, I've been editing lots of python programs. The original python.vim indent file does not provide this feature. It only indents stupid shiftwidth or shiftwidth * 2. So I had to manually align my source codes every time.
Finally, I've come to think I've had enough of it, and I started to modify the default python.vim indenting scheme.

Here goes python.vim that does cinoptions=(0,W4 feature. This scripts has been modified from the original python.vim script, which can be found in the indent directory in your vim installation location.

orchistro.deltabellun:~$ diff -ub  /Applications/MacVim.app/Contents/Resources/vim/runtime/indent/python.vim .vim/indent/python.vim
--- /Applications/MacVim.app/Contents/Resources/vim/runtime/indent/python.vim    2010-08-16 05:04:06.000000000 +0900
+++ .vim/indent/python.vim    2012-02-12 18:01:29.000000000 +0900
@@ -69,34 +69,17 @@
   endif
 
 
-  " When inside parenthesis: If at the first line below the parenthesis add
-  " two 'shiftwidth', otherwise same as previous line.
-  " i = (a
-  "       + b
-  "       + c)
+    " i = (aasdfasf,
+    "      b,
+    "      c)
   call cursor(a:lnum, 1)
-  let p = searchpair('(\|{\|\[', '', ')\|}\|\]', 'bW',
+    let [l,c] = searchpairpos('(\|{\|\[', '', ')\|}\|\]', 'bW',
       \ "line('.') < " . (a:lnum - s:maxoff) . " ? dummy :"
       \ . " synIDattr(synID(line('.'), col('.'), 1), 'name')"
       \ . " =~ '\\(Comment\\|String\\)$'")
-  if p > 0
-    if p == plnum
-      " When the start is inside parenthesis, only indent one 'shiftwidth'.
-      let pp = searchpair('(\|{\|\[', '', ')\|}\|\]', 'bW',
-      \ "line('.') < " . (a:lnum - s:maxoff) . " ? dummy :"
-      \ . " synIDattr(synID(line('.'), col('.'), 1), 'name')"
-      \ . " =~ '\\(Comment\\|String\\)$'")
-      if pp > 0
-    return indent(plnum) + (exists("g:pyindent_nested_paren") ? eval(g:pyindent_nested_paren) : &sw)
-      endif
-      return indent(plnum) + (exists("g:pyindent_open_paren") ? eval(g:pyindent_open_paren) : (&sw * 2))
+    if l > 0
+        return c
     endif
-    if plnumstart == p
-      return indent(plnum)
-    endif
-    return plindent
-  endif
-
 
   " Get the line and remove a trailing comment.
   " Use syntax highlighting attributes when possible.

Let's compare indending results before applying this script in your .vim/indent/ directory and after applying it.

Original indenting (before):

    avalue = self.some_function(argument1,
            argument2,  # how stupid it is
            argument3)
    blablabla...

Modified indenting (after):

    avalue = self.some_function(argument1,
                                argument2, # it looks good!!
                                argument3)
    blablabla...

For convenience, here is the python.vim file. Put it in your .vim/indent/ directory. If the directory does not exist, create one.

python.vim


----

Edit 1, 2012-04-16
* Fixed some broken English scentences.
* The script works fine most of the time. Sometimes, however, it cannot find correct indenting especially when there's arrays in arguments. I am not going to work on the bug until it starts driving me crazy :$

Trackbacks 0 : Comments 0

Write a comment


date commands

메모 2012.01.28 00:48

$ date
Sat Jan 28 00:44:24 KST 2012

Getting the unixtime of now (BSD date, GNU date):
$ date +%s

1327679054

Getting the unixtime of specific moment (with LC_TIME='C', GNU date):
$ date -d 'Sat Jan 28 00:44:24 KST 2012' +%s

1327679064
$ date -d 'Sat Jan 28 00:50:01' +%s

1327679401
$ date -d 'Sat Jan 28 00:50' +%s
1327679400
$ date -d 'Sat Jan 28' +%s
1327676400

Getting the unixtime of specific moment (with LC_TIME='C', BSD date):
$ date -j 01280050.01  # format: [[[mm]dd]HH]MM[[cc]yy][.ss]
Sat Jan 28 00:50:01 KST 2012
$ date -j 01280050.01 +%s
1327679401

Getting the human readable date from unixtime: (GNU date)
$ date -d@1327679064
Sat Jan 28 00:44:24 KST 2012

Getting the human readable date from unixtime: (BSD date)
$ date -r 1327679064
Sat Jan 28 00:44:24 KST 2012

Trackbacks 0 : Comments 0

Write a comment


How to list defined functions in bash.

메모 2012.01.28 00:39

$ declare -f
foo ()
{
    echo 'foo'
}
ps_indexd ()
{
    ps -e -o user,pid,ppid,lstart,stat,command | head -1;
    ps -e -o user,pid,ppid,lstart,stat,command | grep /nvmail/bin/indexd | grep -v grep
}

$ declare -F
declare -f foo
declare -f ps_indexd

Trackbacks 0 : Comments 0

Write a comment


iTunes Command-F to search local musics

분류없음 2012.01.14 02:53

http://www.macworld.com/article/56833/2007/03/searchtunes.html


defaults write com.apple.iTunes NSUserKeyEquivalents -dict-add "Target Search Field" "@~F"

@:command

~:option

$:shift

^:control


Trackbacks 0 : Comments 0

Write a comment


히라사와 우이 넨도로이드 구입

잡동사니 2011.12.13 00:20

덕을 쌓으며 수행하기 시작한지 어느덧 2년이 훌쩍 넘어가고 있는 와중에, 드디어 또다른 덕업의 세계에 눈을 떴으니, 피규어(정확히는 넨도로이드(ねんどろいど)[각주:1] 를 구입한 것이 그것이다.

웹 서핑 중에 우연히 발견한 이후 북받쳐 오는 뽐뿌의 유혹과 지름신의 강림에 견디지 못해 굴복하고 말았으니, 아래의 사진이 지름의 대상이 되었다:


TVA けいおん!(캐이온!) 1기 12편의 에피소드에 나오는 아래의 장면을 모티브로, 표정 등을 과감하게 데포르메[각주:2]하여 귀여움을 최고로 끌어올린 위의 사진을 보고서는 사지 않고 배길 수 없었다.



그나저나, 개봉된 영화를 보려면 블루레이로 풀릴 때까지 기다려야 하겠군;;



  1. 지점토, 찰흙같은 것을 뜻하는 "넨도ねんど" 와 안드로이드를 결합해서 만들어 낸 합성어인 것으로 추측함. 모델이 되는 캐릭터의 원래 모양을 작고 둥글고 귀여운 형태로 변형시켜 만든 피규어의 통칭인 듯. [본문으로]
  2. 變形, deformer(불), 영어권에서는 deformation 으로 사용되는 모양. 전문 지식이 없어 정확한 정보는 전달할 수 없음을 이해해 주시기 바란다. 영문 위키피디아에 내용이 없는 관계로, 영문 위키피디아의 링크는 제공하지 못한다. 대신, 신빙성은 좀 약하지만, 한글 브리태니커 백과사전의 링크로 설명을 대신한다: http://preview.britannica.co.kr/bol/topic.asp?article_id=b04d4110a (영문 브리태니커 백과사전에서는 찾을 수 없었다) [본문으로]
Trackbacks 0 : Comments 2
  1. BlogIcon MuSe씨 2011.12.13 14:22 신고 Modify/Delete Reply

    냐~~~~ 귀엽다!!!! +_+

Write a comment