如何在Vim中翻转单词?最好使用正则表达式或正常模式命令,但也欢迎其他方法:
word =>卓尔
感谢您的帮助! PS:我在Windows XP中
Python内置于我的vim中,但不支持Perl。
答案 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)
答案 3 :(得分:3)
我的VIM上没有支持Python,但看起来用Python做起来很简单。 This article似乎是如何在VIM中使用Python的一个很好的解释,我猜你会做这样的事情:
:python 'word'[::-1]
文章指出结果将显示在状态栏中,如果您尝试替换文档中的字符串,这将是非最佳的,但如果您只是想检查您的女朋友是否正在正确地反转她的字符串头,这应该没事。
答案 4 :(得分:2)
如果您的VIM版本支持它,您可以执行vw\is
或viw\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)
我意识到我对游戏有些迟了,但是我想我只是添加我认为最简单的方法。
这是两件事:
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