在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