- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
给定一个 python 文件,其内容不断重复:
def myFunction(a, b, c):
if a:
print b
elif c:
print 'hello'
我想四处走动并使用熟悉的 vim Action 编辑此文件。例如,使用 (, ), [[, ]], {, } 或使用 di} 之类的命令删除/拉取/更改文本。
在其他语言(如 C++、Java、C# 等)中,花括号比比皆是,因此使用 di} 之类的 Action 可以轻松找到匹配的花括号并作用于该 block 。事实上,如果我在上述文本的 'b' 字符上并在 vim 中执行 di),它会成功删除两个括号之间的文本。
我认为问题在于 python 对代码块的检测。使用 (, ), [[, ]], {, or } 作为 Action 几乎都做同样的事情,带你到开始(在 def 行之上或之上)或结束(在函数的最后一行之后)功能。据我所知,没有办法轻松地告诉 vim“选择这个缩进 block 的所有内容”。在上面的例子中,我想在 if 行的 'i' 中,输入 di} 并让它删除整个 if block (到这个特定函数的末尾)。
我确信应该可以告诉 vim 在缩进的基础上进行这样的 Action (嗯,也许不是那个特定的 Action ,而是一些用户定义的 Action )。关于如何实现这一点的任何想法?
最佳答案
[[
, ]]
, [m
, ]m
和类似的 $VIMRUNTIME/ftplugin/python.vim
now (2018) 重新映射了 Python 语言的 :h ]]
和 :h ]m
下记录的所有内置映射。映射是:
]] 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
:
这个 vim 插件提供类似于内置的 Action :
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)
========== ============================
这个插件提供了类似的 Action ,但略有修改:
The stock Vim 8.0 "class" motions ("]]", "[[", etc.), find blocks that begin at the first column, regardless of whether or not these are class or function blocks, while its method/function motions ("[m", "]m", etc.) find all blocks at any indent regardless of whether or not these are class or function blocks. In contrast, "Pythonsense" class motions work on finding all and only class definitions, regardless of their indent level, while its method/function motions work on finding all and only method/function definitions, regardless of their indent level.
所有详细信息和示例均在 https://github.com/jeetsukumaran/vim-pythonsense#stock-vim-vs-pythonsense-motions 中提供.此外,该插件还定义了文本对象 ic/ac
(class), if/af
(function), id/ad
(docstring) .
对于neovim,您可以使用treesitter 和neovim 插件nvim-treesitter-textobjects .
if/af
& ic
/ac
这些不包含在 $VIMRUNTIME/ftplugin/python.vim
中,但由一些插件提供
有关 python 文本对象的讨论,请参阅 what's the fastest way to select a function of Python via VIM? .
关于python - 在 vim 中编辑 python 文件的更高效的 Action ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/896145/
我需要将文本放在 中在一个 Div 中,在另一个 Div 中,在另一个 Div 中。所以这是它的样子: #document Change PIN
奇怪的事情发生了。 我有一个基本的 html 代码。 html,头部, body 。(因为我收到了一些反对票,这里是完整的代码) 这是我的CSS: html { backgroun
我正在尝试将 Assets 中的一组图像加载到 UICollectionview 中存在的 ImageView 中,但每当我运行应用程序时它都会显示错误。而且也没有显示图像。 我在ViewDidLoa
我需要根据带参数的 perl 脚本的输出更改一些环境变量。在 tcsh 中,我可以使用别名命令来评估 perl 脚本的输出。 tcsh: alias setsdk 'eval `/localhome/
我使用 Windows 身份验证创建了一个新的 Blazor(服务器端)应用程序,并使用 IIS Express 运行它。它将显示一条消息“Hello Domain\User!”来自右上方的以下 Ra
这是我的方法 void login(Event event);我想知道 Kotlin 中应该如何 最佳答案 在 Kotlin 中通配符运算符是 * 。它指示编译器它是未知的,但一旦知道,就不会有其他类
看下面的代码 for story in book if story.title.length < 140 - var story
我正在尝试用 C 语言学习字符串处理。我写了一个程序,它存储了一些音乐轨道,并帮助用户检查他/她想到的歌曲是否存在于存储的轨道中。这是通过要求用户输入一串字符来完成的。然后程序使用 strstr()
我正在学习 sscanf 并遇到如下格式字符串: sscanf("%[^:]:%[^*=]%*[*=]%n",a,b,&c); 我理解 %[^:] 部分意味着扫描直到遇到 ':' 并将其分配给 a。:
def char_check(x,y): if (str(x) in y or x.find(y) > -1) or (str(y) in x or y.find(x) > -1):
我有一种情况,我想将文本文件中的现有行包含到一个新 block 中。 line 1 line 2 line in block line 3 line 4 应该变成 line 1 line 2 line
我有一个新项目,我正在尝试设置 Django 调试工具栏。首先,我尝试了快速设置,它只涉及将 'debug_toolbar' 添加到我的已安装应用程序列表中。有了这个,当我转到我的根 URL 时,调试
在 Matlab 中,如果我有一个函数 f,例如签名是 f(a,b,c),我可以创建一个只有一个变量 b 的函数,它将使用固定的 a=a1 和 c=c1 调用 f: g = @(b) f(a1, b,
我不明白为什么 ForEach 中的元素之间有多余的垂直间距在 VStack 里面在 ScrollView 里面使用 GeometryReader 时渲染自定义水平分隔线。 Scrol
我想知道,是否有关于何时使用 session 和 cookie 的指南或最佳实践? 什么应该和什么不应该存储在其中?谢谢! 最佳答案 这些文档很好地了解了 session cookie 的安全问题以及
我在 scipy/numpy 中有一个 Nx3 矩阵,我想用它制作一个 3 维条形图,其中 X 轴和 Y 轴由矩阵的第一列和第二列的值、高度确定每个条形的 是矩阵中的第三列,条形的数量由 N 确定。
假设我用两种不同的方式初始化信号量 sem_init(&randomsem,0,1) sem_init(&randomsem,0,0) 现在, sem_wait(&randomsem) 在这两种情况下
我怀疑该值如何存储在“WORD”中,因为 PStr 包含实际输出。? 既然Pstr中存储的是小写到大写的字母,那么在printf中如何将其给出为“WORD”。有人可以吗?解释一下? #include
我有一个 3x3 数组: var my_array = [[0,1,2], [3,4,5], [6,7,8]]; 并想获得它的第一个 2
我意识到您可以使用如下方式轻松检查焦点: var hasFocus = true; $(window).blur(function(){ hasFocus = false; }); $(win
我是一名优秀的程序员,十分优秀!