在vim中用命令在字符周围添加空格

11
我正在尝试正确使用vim - 为了帮助我,我将箭头键映射为"",以便强制使用{hjlk}进行移动。
当我想在字符周围加上空格时,这会给我带来问题,例如:
"2+3"更好地格式化为"2 + 3"
之前,我会将光标放在+上并输入:
i[space][arrow-right][space][Esc]
需要按5次键。
如果不使用箭头,则需要将光标放在+上并执行以下操作:
i[space][Esc]lli[space][Esc]
需要按8次键。
我可以将“li”转换为“a”,从而将其减少到7次按键:
i[space][Esc]la[space][Esc]
除了将其写成宏之外,是否有更好的方法?是否有某种神奇的vim命令,能够让我在不到5次按键的情况下完成它 - 还有一些通用的方法,让我可以对整个单词或符号进行操作,例如,如果我想将3==4转换为3 == 4?

只是好奇你是如何将箭头键映射到“”的? - Casey
只需六个按键,您就可以执行“i[空格][Esc]el.”。但还有比这更快的方法,因此这只是一条评论而不是答案 :) - Mark Rushakoff
Casey:要映射箭头键,请在您的~/.vimrc文件中添加以下内容:map <Up> "" [newline] map <Down> "" [newline] map <Right> "" [newline] map <Left> ""(抱歉 - 我无法在评论中换行!) - William Becker
9个回答

18

我个人认为,最合理的做法是先销毁你想要包围的内容,然后重新粘贴它。

c w "" ESC P

显然,你可以用任何你喜欢的对象和引号来替换它们。要将一个字符+更改为[空格]+[空格],你可以执行以下操作:

s [space] [space] ESC P

在加号上的操作


2
很好 - 我仍然在适应删除东西会把它们放入剪贴板的事实。 而且我已经使用vi十年了...这就是为什么我现在强迫自己好好学习它!sed是下一个... - William Becker

5
阅读标题后第一件想到的事情是surround.vim,这是一个非常出色的脚本,可以做各种有用的事情,符合您所描述的要求。
为了解决您的具体问题,我可能会将光标放在+上,并执行以下操作:
s[空格]+[空格][esc]
为了将3==4更改为3 == 4,我可能会将光标放在第一个=上,并执行以下操作:
i[空格][esc]ww.

我喜欢你提出的第二个解决方案,因为它似乎适用于任何令牌。此外,双w比两个不同的键更容易键入。 - William Becker

4

我也一直在想这个问题。我尝试使用surround.vim,但是朴素的方式

S<space>

(在选定文本后)不起作用,因为空格已经被用作其他包围字符对添加空格的修饰符。 S<space><cr> 在输出中添加了一个^M。Ss几乎可以正常工作,但仅在前面插入一个空格。

在tpope/surround.vim上询问后:

S<space><space>

在可视模式下工作。或者,从正常模式开始,ysl<space><space> 对于单个字符有效。


3

哈!我一直在尝试找到如何为一个块添加空格,终于找到了正确的组合。

使用surround.vim插件,你可以输入surround选择器 空格 空格。

所以对于这种特定情况,我会使用视觉模式(顺便提个小技巧,用于光标下操作单个字符),如下:"vs " <- 四个按键!

我还有个习惯,就是不加空格地输入参数列表。使用这种技术,你可以使用w导航到第二个参数,然后输入"vws "<-可视化选择单词并加上空格。

总的来说,我更喜欢使用可视化选择模式。另外备选的surround语法"ysw "将不包括"vw"能捕获的最后一个逗号。


1
这个方法允许您使用“.”来重复下一个“+”符号之后的命令。
将光标放在“+”符号上并输入:
s[SPACE][CTRL-R]"[SPACE][ESC]

1

你可以创建一个宏来执行其中的一个操作,并在需要时调用它(就像amphetamachine在我写作时提出的那样),或者你可以简单地搜索和替换:

:%s/\(\d\)\(+\|-\)\(\d\)/\1 \2 \3/g

你可能需要执行这个命令两次,因为它只会找到每隔一个出现的+/-。

编辑:

这将替换所有内容,无需调用两次:

:%s/\d\@<=+\|-\d\@=/ \0 /g

1
你可以设置一个类似这样的映射(在可视模式下按回车键以换行空格):
:vnoremap <CR> <ESC>`<i<SPACE><ESC>`>la<SPACE><ESC>h

1

尝试将光标定位在“+”上,然后输入以下内容:

q1i[空格][右箭头][空格][左箭头][esc]q

这将在插槽1中记录一个快速宏,您可以在需要时重复使用它,它将在光标下的字符周围添加空格。您可以使用@1调用它。

还有更多功能强大的宏:

q1ea[空格][esc]bi[空格][右箭头][esc]q

当您按下@1时,它将在光标下的单词("=="也算作一个单词)周围添加空格。


就像我所说的一样,我知道我可以使用宏来完成,但我想知道是否有一些聪明的命令我不知道! - William Becker

0

我知道这是一个旧帖子,但这可能对某些人有用。我发现地图(将其映射到任何其他内容!)

noremap <leader>ss diwi<SPACE><C-R>"<SPACE><ESC>B

这个程序可以将'a+b'转换成'a + b'(当用于'+'字符时),也可以将'a==b'转换成'a == b'(当用于第一个或第二个'='符号时)。

希望对某些人有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接