【问题标题】:vi VIM How to append line to itself?vi VIM 如何将行附加到自身?
【发布时间】:2012-11-07 15:31:04
【问题描述】:

我想将行的全部内容(不包括结束换行符)附加到行本身。 我在这里看到了这个解决方案:%s/$/\*/gHow can I add a string to the end of each line in Vim?

但它会将字符 * 附加到行中。我尝试了:%s/$/*/g:%s/$/\*/g,但结果相同。

我正在使用 VIM - Vi 改进版 7.3.46

PS:看来,作为一个新用户,我不允许在此处发表此问题作为评论。 谢谢。

【问题讨论】:

    标签: regex vim replace append match


    【解决方案1】:

    再一次,命令模式被大大低估了:

    :t.|-j
    

    完成

    更新我在另一条评论中看到您想针对某个范围执行此操作。这也很容易。见下文

    这基本上是yyPJx的Ex等价物except

    1. 它不会破坏任何寄存器
    2. 不会移位“0-”9 个寄存器
    3. 不会影响当前搜索和/或搜索历史记录(例如在基于 :%s 的答案中)
    4. 可以通过 @: 立即重复 - 没有宏,没有映射 :)
    5. 将导致原子撤消(而yyPJx 方法将导致 3 个单独的撤消步骤)

    解释:

    • :t:copy 的同义词
    • :j:join 的缩写
    • :-j:-1join 的缩写,意思是:将上一行与它的后继连接起来

    注意:如果您想保留前导空格(例如 yyPgJx 而不是 yyPgJx),请使用:

    :t.|-j!
    

    更新重复,具有视觉选择类型

    :'<,'>g/^/t.|-j
    

    对于视觉选择中的每一行重复它。 (当然,:'&lt;,'&gt; 是在可视模式下自动插入的)。这种方法的另一个好处是您可以轻松地指定要复制哪些行的过滤器:

    :g/foo/t.|-j
    

    将“复制”当前缓冲区中包含“foo”的所有行(请参阅windo、bufdo、argdo 以将其扩展到大量缓冲区而不会费力)。

    【讨论】:

    • 确实比上一个答案更有帮助,所以我接受了。 @sehe:“命令模式被大大低估了”这是一个非常有见地的评论。
    • @Tempora 感谢您的客气话。命令模式需要习惯。通常只要你有行式操作,就会有一个等效的命令模式来做事(例如%&gt;|%y+|undo 便于在 SO 上发布:))
    【解决方案2】:

    你可以使用这个替换:

    :s/^.*$/&&
    
    • ^.*$ 表示“无论 (.*) 位于该行的开头 (^) 和结尾 ($) 之间”。
    • &amp; 代表匹配的文本,因此我们将整行替换为它自己,然后再次替换它自己。

    编辑

    Ingo 的评论很中肯::s/.*/&amp;&amp; 的作用相同,但打字更少。

    【讨论】:

    • 哇,几分钟内就有 3 个不同的答案……你们今天真的很快 :-)
    • 您不需要锚定^...$,因为. 默认匹配任何内容(换行符除外)::s/.*/&amp;&amp;
    • 我添加了一个减少 4 次击键的答案,并且它不会影响搜索模式历史记录。请参阅stackoverflow.com/a/13280126/85371 - 对 Ex 模式命令的永恒赞美
    • @sehe:我自己才开始使用 Ex 命令。我最近在我的日常使用中引入了:m,它非常棒。你的回答太棒了。
    • @romainl Cheers :) g//m$ 很漂亮,对我来说也很多次
    【解决方案3】:

    你为什么不试试:yyPJx

    这会将当前行的副本附加到自身。

    你甚至可以:

    noremap ,l yyPJx

    如果您想映射击键来完成此操作,请在您的.vimrc 中。

    【讨论】:

    • 值得注意的是,J 将通过删除缩进并插入最多 2 个空格来调整空白。根据您的需要gJ 可能值得一看。
    • @PeterRincker 谢谢彼得,gJ 绝对是正确的选择,具体取决于您所说的要求。
    【解决方案4】:

    转到要附加到自身的行。 然后输入:0y$$p

    说明:
    0 - 用于转到行首
    y$ - 从光标拉到行尾的所有内容
    $ - 用于走到行尾
    p - 用于“放置” yank 缓冲区

    【讨论】:

    • 可能值得在开头添加^
    • 除了$p,您也可以只使用P,因为光标位于拉出后的开头。
    • 我知道这一点,但我想用:%s/$/&lt;regex&gt; 之类的命令来处理一堆行。谢谢。
    • 哦 - 如果你想重复,看看我的前答案::g/^/t.|-jg/pattern/t.|-j 特定行(匹配 pattern
    猜你喜欢
    • 2013-01-25
    • 2011-10-11
    • 1970-01-01
    • 1970-01-01
    • 2017-02-01
    • 1970-01-01
    • 2016-10-14
    • 2013-07-12
    相关资源
    最近更新 更多