给出一个python文件,下面不断重复:
def myFunction(a, b, c):
if a:
print b
elif c:
print 'hello'
Run Code Online (Sandbox Code Playgroud)
我想使用熟悉的vim移动来移动并编辑此文件.例如,使用(,),[[,]],{,}或使用像di这样的命令删除/ yanking /更改文本.
在其他语言(如C++,Java,C#等)中,你有大括号,因此使用像di这样的运动可以很容易地找到匹配的大括号并对该块进行操作.事实上,如果我在上面的文本中使用'b'字符并在vim中执行di),它会成功删除两个parens之间的文本.
我认为问题在于python检测代码块.使用(,),[[,]],{或}作为动作几乎都做同样的事情,带你到开始(在def线上方或在def线上)或结束(在函数的最后一行之后)功能.据我所知,没有办法轻易告诉vim"为这个缩进块选择所有东西." 在上面的例子中,我想进入if行的'i',输入di}并删除整个if块(到这个特定函数的末尾).
我确信应该可以告诉vim在缩进的基础上进行这样的动作(好吧,也许不是那个特定的动作,而是一些用户定义的动作).有关如何实现这一点的任何想法?
Hot*_*hke 32
[[
,]]
,[m
,]m
和类似$VIMRUNTIME/ftplugin/python.vim
现在(2018)重新映射记录下所有内置的映射:h ]]
和:h ]m
Python语言.映射是:
]] 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
][ 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
Run Code Online (Sandbox Code Playgroud)
以下带注释的示例源代码说明了不同的映射
class Mapping: # [[[[
def __init__(self, iterable):
pass
def update(self, iterable):
pass
__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):
pass
Run Code Online (Sandbox Code Playgroud)
在提交abd468ed0(2016-09-08),01164a6546b4(2017-11-02)和 7f2e9d7c9cd(2017-11-11)中添加并改进了映射.
如果您还没有此文件的新版本,可以下载并将其放入~/.vim/ftplugin/python.vim
.此文件夹优先于之前$VIMRUNTIME/ftplugin
.
之前,这些映射已添加到$VIMRUNTIME
,出现了该插件python-mode
提供[[
,]]
,[M
,和]M
.此外python-mode
还定义了文本对象aC
,iC
,aM
,和iM
:
这个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)
========== ============================
Run Code Online (Sandbox Code Playgroud)
这个插件提供了类似的动作,但略有修改:
库存Vim 8.0"类"运动("]]","[["等),查找从第一列开始的块,无论它们是否为类或功能块,而其方法/功能运动("[m","] m"等)查找任何缩进的所有块,无论这些块是类还是功能块.相比之下,"Pythonsense"类动作用于查找所有和唯一的类定义,无论它们的缩进级别如何,而其方法/函数动作用于查找所有且唯一的方法/函数定义,而不管它们的缩进级别如何.
所有细节和示例均在https://github.com/jeetsukumaran/vim-pythonsense#stock-vim-vs-pythonsense-motions上给出.另外,这个插件定义了文本对象ic/ac
(类),if/af
(函数),id/ad
(docstring).
有关python的textobjects的讨论,请参阅通过VIM选择Python函数的最快方法是什么?.
Rud*_*olf 20
围绕python代码块进行导航变得更加容易.
快捷键:
]t
- 跳到块的开头]e
- 跳到块结束]v
- 选择(可视线模式)块]<
- 向左移动块]>
- 向右移动块]#
- 评论选择]u
- 取消注释选择]c
- 选择当前/上一课程]d
- 选择当前/上一个功能]<up>
- 使用相同/更低的缩进跳转到上一行]<down>
- 使用相同/更低的缩进跳转到下一行延伸%
:
%
- 循环使用if/elif/else,try/except/catch,for/continue/breakg%
- 向对面移动 %
[%
- 移动到当前代码块的开头]%
- 移动到当前代码块的末尾以上所有动作均适用于Normal,Visual和Operator-pending模式,因此:
d]%
- 删除直到当前块结束v]%d
- 应该这样做,通过可视模式,以便您可以看到正在删除的内容V]%d
- 以上,但有线选择当你拥有时,可以很容易地移动缩进块set foldmethod=indent
.例如,如果您def main():
在以下代码段中排在第一位:
def main():
+-- 35 lines: gps.init()-----------------------------------------------------
if __name__ == "__main__": main()
Run Code Online (Sandbox Code Playgroud)
然后dj
获取整个主要功能,它可以粘贴到其他地方.