將多行放在引號中 Vim

將多行放在引號中 Vim

我有以下形式的區塊:

    String that is not supposed to be enclosed in quotes
    String that is supposed to be enclosed in quotes

    String that is not supposed to be enclosed in quotes
    String that is supposed to be enclosed in quotes

    String that is not supposed to be enclosed in quotes
    String that is supposed to be enclosed in quotes

    String that is not supposed to be enclosed in quotes
    String that is supposed to be enclosed in quotes

我需要將聲明它們應該用引號引起來的行放在引號中:

    String that is not supposed to be enclosed in quotes
    "String that is supposed to be enclosed in quotes"

    String that is not supposed to be enclosed in quotes
    "String that is supposed to be enclosed in quotes"

    String that is not supposed to be enclosed in quotes
    "String that is supposed to be enclosed in quotes"

    String that is not supposed to be enclosed in quotes
    "String that is supposed to be enclosed in quotes"

Vim 有沒有半自動的方法來做到這一點?我認為可能的解決方案可能涉及g命令。

答案1

使用正規表示式:

:%s/.*is supposed.*/"&"/

如果「半自動」表示您希望在每次替換之前得到提示,只需將修飾符新增/c至替換模式即可:

:%s/.*is supposed.*/"&"/c

解釋

  • :%s意味著將此替換套用至目前緩衝區中的所有行
  • 我們匹配的模式是包含單字的任何行is supposed(如果其他一些行包含單字“is Should”而後面沒有“to be returned in quote”,您可以隨時將模式更改為.*is supposed to be enclosed in quotes.*
  • 我們用來替換匹配模式的字串是"&",其中&代表模式匹配的內容。

答案2

有名的環繞音效插件提供了各種映射,使這一過程變得快速而簡單。要引用整行(不縮排),只需使用yss".您可以透過以下:global命令自動將其應用於範例文字的所有匹配行:normal

:g/is supposed/normal yss"

或只是搜尋匹配的行並通過nand重複.

答案3

我幾乎總是更喜歡使用巨集來搜尋和替代,因為它們更強大並且更容易記住,同時仍然保留在跳躍之前進行互動式檢查的選項。在您想要更改的第一行嘗試此操作(不要鍵入我在 ESC 和 ENTER 周圍放置的空格以提高可讀性):

qqI" ESC $bea" ESC /is supposed ENTER zzq

它能做什麼:

  • qq啟動一個名為「q」的巨集(qa 將啟動巨集「a」)
  • I" ESC在第一個單字之前插入一個“,而不是像“0”那樣在行的開頭插入,從而保留那裡通常有價值的空白。
  • $bea" ESC轉到行尾 ($),但然後後退一個單字 (b) 並再次前進到行尾 (e),最後附加 (a) "。此操作甚至會附加到該行的最後一個單字之後if 後面跟著通常無用的尾隨空格。
  • /is supposed執行編輯後,此搜尋將搜尋「is Should」的下一個實例,該實例可能會向下很多頁,並將遊標很好地定位在那裡,以便您查看並決定是否繼續編輯。如果沒有找到“應該”,則巨集將退出且不會造成任何損害。
  • zzq將該行很好地集中在頁面上 (zz),這樣您就可以看到當前行之外的幾行。當您快速應用巨集並想要瀏覽前面的幾個動作時非常有用。 「q」結束巨集的定義,它也恰好被稱為「q」。

如何使用:

  • 完成上面的巨集定義後,第一行已經更改。
  • 如果發生錯誤,您可以簡單地撤消這一行並重試。
  • 遊標現在位於第二個匹配項(如果有)上,並且在頁面中很好地居中。
  • 如果需要,您可以使用 @q 套用該巨集(或其他類似的巨集!),這將編輯該行並將您定位在第三個符合項目上。
  • 您可以使用 @@ 重新套用最後一個巨集(比 @q 更快)。
  • 您可以同時撥打多通電話,例如:111@@。請記住,如果應用巨集時出現任何錯誤,則不會再重複。
  • 或者您可以手動跳過 PageDown 和朋友並重新套用巨集。
  • 您可以將巨集與任何其他編輯交錯。
  • 您可以使用 :tab 來將此巨集套用至其他緩衝區或檔案。
  • 派上的櫻桃:即使退出 vim 後,宏也會被記住!

一旦你熟悉了宏,你就會擁有驚人的力量!

答案4

如果您的行確實是這樣的,並且有一些區分的字串可以標識哪些行是哪些行,那麼正規表示式版本就可以工作。否則,我們可以記錄一個做你想做的事。

為此,請轉到第 2 行的開頭並按下:

qq I" Escape A" Escape 3j q

這將引用第一行並將我們帶到下一行來查看。然後,您可以@q按 重播您剛剛執行的所有操作,或者說5@q執行五次。

這是如何運作的: q是開始錄製巨集的命令,我們也調用它q(您可以選擇任何字母)。在這個巨集中,我們在行的開頭插入一個雙引號 ( I"),離開插入模式 (Escape),在行的末尾附加一個雙引號 ( A"),然後再次離開插入模式。我們向下移動三行 ( 3j) 到要引用的下一行。q停止錄製巨集。

之後,我們回到了我們開始的地方,所以我們可以運行@我們保存的巨集 ( ) 來q對下一行再次執行此操作。在 之前進行計數@,例如在 中5@q,我們會執行多次。


如果3j間距有些不規則,您可以使用}}k: 向下移動兩段到下一段之後的空白行 (}})並備份(k)。無論哪種方式,運行巨集都是相同的。

事實上,您可以記錄任何一系列執行您想要的操作並讓您回到您想要的位置的操作。只要您採取的步驟在要運行它的每個上下文中都有意義,您就可以啟動宏,進行所需的所有更改並移動到下一個位置,然後停止宏並重複。

相關內容