在Vim中反转一个单词

时间:2009-11-05 12:17:10

标签: python regex vim

如何在Vim中翻转单词?最好使用正则表达式或正常模式命令,但也欢迎其他方法:

  

word =>卓尔

感谢您的帮助! PS:我在Windows XP中

Python内置于我的vim中,但不支持Perl。

10 个答案:

答案 0 :(得分:6)

以下是基于其工作原理的另一种(pythonic)解决方案:

:echo join(reverse(split('hello', '.\zs')), '')
olleh

如果要替换缓冲区中的所有单词,

:%s/\(\<.\{-}\>\)/\=join(reverse(split(submatch(1), '.\zs')), '')/g

首先在单词中创建一个字符列表,然后将其反转并连接起来形成单词。 substitute命令查找每个单词,然后将单词传递给表达式并将结果用作替换。

答案 1 :(得分:4)

假设你已经为vim内置了perl支持,你可以这样做:

command! ReverseWord call ReverseWord()
function! ReverseWord()
perl << EOF
    $curword = VIM::Eval('expand("<cword>")');
    $reversed = reverse($curword);
    VIM::Msg("$curword => $reversed");
    VIM::DoCommand("norm lbcw$reversed");
EOF
endfun

可能会将其绑定到按键上,如下所示:

nmap ,r :ReverseWord<CR>

答案 2 :(得分:4)

此提示可能有所帮助:http://vim.wikia.com/wiki/Reverse_letters

答案 3 :(得分:3)

我的VIM上没有支持Python,但看起来用Python做起来很简单。 This article似乎是如何在VIM中使用Python的一个很好的解释,我猜你会做这样的事情:

:python 'word'[::-1]

文章指出结果将显示在状态栏中,如果您尝试替换文档中的字符串,这将是非最佳的,但如果您只是想检查您的女朋友是否正在正确地反转她的字符串头,这应该没事。

答案 4 :(得分:2)

如果您的VIM版本支持它,您可以执行vw\isviw\is(在键入命令之前将光标放在单词的第一个字母处)...但是我遇到了很多兼容性问题。不确定要编译或打开的内容,但这只会有效。

修改

\is是:

:<C-U>let old_reg_a=@a<CR>
\ :let old_reg=@"<CR>
\ gv"ay :let @a=substitute(@a, '.\(.*\)\@=', '\=@a[strlen(submatch(1))]', 'g')<CR> 
\ gvc<C-R>a<Esc> :let @a=old_reg_a<CR> 
\ :let @"=old_reg<CR>

不记得它来自哪里但谷歌搜索来自vim.wikia.com这篇文章。这显示了同样的事情,所以我想就是这样。

答案 5 :(得分:1)

你可以使用python本身来通过filter命令反转这行。说你写的文字是:

Python

你可以通过发出来反转它。

:1 ! python -c "print raw_input()[::-1]"

您的文字将被替换为:

nohtyP

命令中的“1”告诉vi将第1行发送到我们正在执行的python语句:“print raw_input()[:: - 1]”。因此,如果您想要其他行反转,您可以将该行号作为参数发送。然后python语句反转输入行。

答案 6 :(得分:1)

如果你安装了rev(例如通过MSys或Cygwin),那真的不是那么困难。

选择要反转和过滤的内容(%! <cmd>):

:%! rev

这会将您的选择传递给您的shell,同时传递一个命令。

答案 7 :(得分:0)

如果你手上有时间,你可以通过迭代转置字符(xp)来冒泡。

答案 8 :(得分:0)

如果您使用+rightleft编译了Vim,则有一种棘手的方法。您设置了'allowrevins',可让您在插入模式下按下Ctrl+_以启动反向插入模式。它最初是用于插入双向脚本的。

在“插入”模式下键入所需的单词,或将光标移至已键入单词的末尾。点击Ctrl+_,然后选择一种补全(i_Ctrl-x)方法,该方法最有可能不为您的单词返回任何结果。在这种情况下,按Ctrl + e取消就地完成似乎不起作用。

即对于语法错误的文本文件,您可以在插入模式Ctrl+x Ctrl+d中命中,这可以确保在当前文件中找不到任何宏/函数名(有关更多信息,请参见:h i_CTRL-X_CTRL-D:h complete)。

瞧!反向模式下的完成查找使查找的单词反向。请注意,光标将移动到该单词的开头(是相反的书写方向,还记得吗?)

然后您应该再次按下Ctrl+_以返回常规插入模式和键盘布局,然后继续进行编辑。

提示:您可以将“ complete”(至少对于缓冲区而言)专门设置为一个保证不会返回任何结果的完成选项。只需遍历:h 'complete'中的选项即可。这将使方便的i_Ctrl-N / i_Ctrl-P绑定可用于方便的单词反转会话。当然,您可以使用宏,函数或绑定将其进一步自动化

注意:设置/重置'paste''compatible'可以设置/重置'allowrevins'。参见:h allowrevins

答案 9 :(得分:0)

我意识到我对游戏有些迟了,但是我想我只是添加我认为最简单的方法。

这是两件事:

  • Vim的表情寄存器
  • pyeval(在最近的vim版本中为py3eval

要反转一个单词,您可以执行以下操作:

  • "ayiw将单词拉到寄存器a
  • <C-r>=py3eval('"".join(reversed(str(' . @a ')))')使用vim的=(表达式)寄存器调用py3eval函数,该函数对python代码(duh)求值并返回结果,然后将其通过表达式寄存器输入到我们的文档。

有关表达式寄存器的更多信息,请参见https://www.brianstorti.com/vim-registers/#the-expression-and-the-search-registers