在vim中编辑python文件的更有效的动作

给一个python文件,下面重复一遍:

def myFunction(a, b, c): if a: print b elif c: print 'hello' 

我想移动并使用熟悉的vim动作编辑这个文件。 例如,使用(,),[[,]],{,}或使用像di}这样的命令删除/延伸/更改文本。

在其他语言(如C ++,Java,C#等)中,大量使用大括号,因此使用像di这样的移动可以轻松地find匹配的大括号,并在该块上执行操作。 而事实上,如果我在上面的文本的'b'字符上,并且在vim中做了di),它就成功地删除了这两个parens之间的文本。

这个问题是python检测代码块,我想。 使用(,),[[,]],{,或}作为运动几乎是做同样的事情,把你带到开始(在函数的最后一行之后)或结束function。 据我所知,没有办法容易地告诉vim“为这个缩进块select所有的东西”。 在上面的例子中,我想在if行的“i”中键入di,并删除整个if块(到此特定函数的末尾)。

我相信应该有可能告诉vim在这种运动的缩进基础上进行操作(也许不是特定的运动,而是一些用户定义的动作)。 任何想法如何做到这一点?

python.vim

使Python代码块浏览更容易。

快捷键:

  • ]t – 跳转到块的开始
  • ]e – 跳转到块结束
  • ]v – select(视线模式)模块
  • ]< – 将块移到左侧
  • ]> – 将块移到右侧
  • ]# – 评论select
  • ]u – 取消注释select
  • ]c – select当前/上一课
  • ]d – select当前/前一个function
  • ]<up>一级]<up> – 跳转到具有相同/较低缩进的上一行
  • ]<down> – 跳转到下一行,使用相同/较低的缩进

python_match.vim

扩展%

  • % – 通过if / elif / else循环,尝试/ except / catch,for / continue / break
  • g% – 移动%
  • [% – 移到当前代码块的开头
  • ]% – 移到当前代码块的末尾

所有上述运动都可以使用普通,可视和运营商待定模式,所以:

  • d]% – 删除直到当前块结束
  • v]%d – 应该这样做,通过可视化模式,以便您可以看到什么被删除
  • V]%d – 在上面,但用行select

python模式

这个vim插件提供了类似于内置的动作:

 2.4 Vim motion ~ *pymode-motion* Support Vim motion (See |operator|) for python objects (such as functions, class and methods). `C` — means class `M` — means method or function *pymode-motion-keys* ========== ============================ Key Command (modes) ========== ============================ [[ Jump to previous class or function (normal, visual, operator) ]] Jump to next class or function (normal, visual, operator) [M Jump to previous class or method (normal, visual, operator) ]M Jump to next class or method (normal, visual, operator) aC Select a class. Ex: vaC, daC, yaC, caC (normal, operator) iC Select inner class. Ex: viC, diC, yiC, ciC (normal, operator) aM Select a function or method. Ex: vaM, daM, yaM, caM (normal, operator) iM Select inner func. or method. Ex: viM, diM, yiM, ciM (normal, operator) ========== ============================ 

在2016-09-08更新vim8运行时文件

现在包括$VIMRUNTIME/ftplugin/python.vim

 ]] Jump forward to begin of next toplevel [[ Jump backwards to begin of current toplevel (if already there, previous toplevel) ]m Jump forward to begin of next method/scope [m Jump backwords to begin of previous method/scope 

请参阅ftplugin / python.vim@abd468ed0 。

但是,如果您使用textobjects aC,iC,aM,iM ,则仍然需要插件python-mode

在2017年11月2日更新vim8运行时文件

内置函数已经被延长了第二次,并匹配现在所有的内置映射,logging在:h ]]:h ]m 。 新的映射是:

 ][ Jump forward to end of current toplevel [] Jump backward to end of previous of toplevel ]M Jump forward to end of current method/scope [M Jump backward to end of previous method/scope 

请参阅ftplugin/python.vim@01164a6546

一个例子来说明不同的映射

 class Mapping: # [[[[ def __init__(self, iterable): self.items_list = [] self.__update(iterable) def update(self, iterable): for item in iterable: self.items_list.append(item) __update = update # [] class Reverse: # [[ or [m[m def __init__(self, data): # [m self.data = data self.index = len(data) # [M def __iter__(self): # <--- CURSOR return self # ]M def __next__(self): # ]m if self.index == 0: raise StopIteration self.index = self.index - 1 return self.data[self.index] # ][ class MappingSubclass(Mapping): # ]] or ]m]m def update(self, keys, values): for item in zip(keys, values): self.items_list.append(item) 

有关python的textobjects的讨论,请参阅通过VIMselectPython函数的最快方法是什么? 。

当您set foldmethod=indent时,移动缩进块非常容易。 例如,如果您在以下代码片段中的def main():行:

 def main(): +-- 35 lines: gps.init()----------------------------------------------------- if __name__ == "__main__": main() 

那么dj占据了整个主要function,并可以粘贴到别处。

为了解决您的最后一段,以下脚本定义了一个新的“indent”文本对象,您可以对其执行操作。 例如, 删除在光标所在的行相同级别缩进的一切。

有关更多信息,请参阅插件的文档: http : //www.vim.org/scripts/script.php? script_id= 3037

chapa.vim

一个多语言vim插件,用于移动(或直观地select)下一个/上一个类,方法或函数; 开箱即用支持python和javascript。

 " Function Movement nmap <buffer> fnf <Plug>ChapaNextFunction nmap <buffer> fpf <Plug>ChapaPreviousFunction " Class Movement nmap <buffer> fnc <Plug>ChapaNextClass nmap <buffer> fpc <Plug>ChapaPreviousClass " Method Movement nmap <buffer> fnm <Plug>ChapaNextMethod nmap <buffer> fpm <Plug>ChapaPreviousMethod