在 vim 中,如何将文本移动到某些列?

Jon*_*han 2 vim

我有诗的文本文件,右侧的行号如下所示:

Bedded in store of rotten fig-leaves soft,   40
And corded up in a tight olive-frail,   
Some lump, ah God, of lapis lazuli, 
Big as a Jew’s head cut off at the nape,    
Blue as a vein o’er the Madonna’s breast    
Sons, all have I bequeathed you, villas, all,        45
Run Code Online (Sandbox Code Playgroud)

行尾空格与行号不一致的地方。如何将数字移动到特定列,以便它们对齐?

Adr*_*iuk 7

解决 vim 问题的一个强大方法是使用宏和基本命令,因为它们比 vim 脚本语言更容易记住。

在这种情况下,我会将光标放在数字之前,数字是该行中的最后一个单词(为此:)$b;插入大量空格;删除无关的(如果你想使用第 61 行,请执行:)061ldw;转到下一行(执行此操作:)j

您首先按qa开始录制宏“a”,然后按上面的这些键(而不是其他键),然后按q完成录制。现在要使用它,请使用@afor 宏“a”;之后,继续按@@(重复上一个宏),直到到达文本末尾。

  • 您可以使用“|”跳转到列号,而无需像“061l”那样首先跳转到第一列。相反,任何地方的“61|”都会跳转到该列(假设您有到达该列的字符,否则您将跳转到该行的末尾) (3认同)

小智 6

我想实现基本相同,但对于软件代码中的某些字符。字符可以出现在行上的任何位置,但我希望它们(以及它们右侧的任何内容)出现在特定列上。例如:

refclkp : in std_logic;
refclkn : in std_logic;
hdinp_ch0 : in std_logic;
hdinn_ch0 : in std_logic;
hdoutp_ch0 : out std_logic;
Run Code Online (Sandbox Code Playgroud)

我希望它看起来像这样:

refclkp                    : in std_logic;
refclkn                    : in std_logic;
hdinp_ch0                  : in std_logic;
hdinn_ch0                  : in std_logic;
hdoutp_ch0                 : out std_logic;
Run Code Online (Sandbox Code Playgroud)

:在特定列(在本例中为第 30 列)上的所有 。以上对我来说没有意义(它可能有效,但我不使用视觉内容)但它确实给了我解决它的线索:

:map H $?:<ctrl+Enter>Di                              <ctrl+Esc>029lP:s/\s*$//<ctrl+Enter>
Run Code Online (Sandbox Code Playgroud)

您可以通过按住+然后点击或 来完成<ctrl+Enter><ctrl+Esc>位。它在命令中显示为或。以上基本上是这样做的:CtrlQEnterEsc^M^[

  1. 转到行尾 ( $)
  2. 向后看第一个 ":" ( ?:<ctrl+Enter>)
  3. 删除从这一点到行尾的所有内容 ( D)
  4. 插入 30 个空格 - 这样我就知道有足够的空格让我跳到第 30 列 ( i <ctrl+Esc>)
  5. 跳转到第 30 列 - 不知道为什么我需要在这里使用“29”,必须是“功能”(029l
  6. 粘贴从步骤 3 ( P) 中删除的文本
  7. 通过删除在步骤 4 ( :s/\s*$//<ctrl+Enter>) 中创建的所有尾随空格进行清理

我将其创建为映射,因此我现在需要做的就是点击H并修改当前行!