当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《更高效的动作在vim中编辑python文件》经验,为你挑选了3个好方法。

给出一个python文件,下面不断重复:

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

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

在其他语言(如C++,Java,C#等)中,你有大括号,因此使用像di这样的运动可以很容易地找到匹配的大括号并对该块进行操作.事实上,如果我在上面的文本中使用'b'字符并在vim中执行di),它会成功删除两个parens之间的文本.

我认为问题在于python检测代码块.使用(,),[[,]],{或}作为动作几乎都做同样的事情,带你到开始(在def线上方或在def线上)或结束(在函数的最后一行之后)功能.据我所知,没有办法轻易告诉vim"为这个缩进块选择所有东西." 在上面的例子中,我想进入if行的'i',输入di}并删除整个if块(到这个特定函数的末尾).

我确信应该可以告诉vim在缩进的基础上进行这样的动作(好吧,也许不是那个特定的动作,而是一些用户定义的动作).有关如何实现这一点的任何想法?



1> Hotschke..:

括号映射[[,]],[m,]m和类似

$VIMRUNTIME/ftplugin/python.vim现在(2018)重新映射记录下所有内置的映射:h ]]:h ]mPython语言.映射是:

]] 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

以下带注释的示例源代码说明了不同的映射

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

在提交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:

插件python-mode

这个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)
==========  ============================

插件Pythonsense

这个插件提供了类似的动作,但略有修改:

库存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函数的最快方法是什么?.



2> Rudiger Wolf..:
python.vim

围绕python代码块进行导航变得更加容易.

快捷键:

]t - 跳到块的开头

]e - 跳到块结束

]v - 选择(可视线模式)块

]< - 向左移动块

]> - 向右移动块

]# - 评论选择

]u - 取消注释选择

]c - 选择当前/上一课程

]d - 选择当前/上一个功能

] - 使用相同/更低的缩进跳转到上一行

] - 使用相同/更低的缩进跳转到下一行

python_match.vim

延伸%:

% - 循环使用if/elif/else,try/except/catch,for/continue/break

g% - 向对面移动 %

[% - 移动到当前代码块的开头

]% - 移动到当前代码块的末尾

以上所有动作均适用于Normal,Visual和Operator-pending模式,因此:

d]% - 删除直到当前块结束

v]%d - 应该这样做,通过可视模式,以便您可以看到正在删除的内容

V]%d - 以上,但有线选择



3> tzot..:

当你拥有时,可以很容易地移动缩进块set foldmethod=indent.例如,如果您def main():在以下代码段中排在第一位:

def main():
+-- 35 lines: gps.init()-----------------------------------------------------

if __name__ == "__main__": main()

然后dj获取整个主要功能,它可以粘贴到其他地方.

推荐阅读
手机用户2402851335
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有