vim-如何选择多条线路?

vim-如何选择多条线路?,vim,Vim,假设我有这段文字: #!/bin/bash # Get host db_host=$(echo "dbhost") # Get DB name db_name=$(echo "dbname") # Get user db_user=$(echo "dbuser") # Get password db_pass=$(echo "dbpass") 我想选择每个变量名,并在文本下方生成此输出: echo "db_host: $db_host" echo "db_name: $db_name" ec

假设我有这段文字:

#!/bin/bash
# Get host
db_host=$(echo "dbhost") 
# Get DB name
db_name=$(echo "dbname")
# Get user
db_user=$(echo "dbuser")
# Get password
db_pass=$(echo "dbpass")
我想选择每个变量名,并在文本下方生成此输出:

echo "db_host: $db_host"
echo "db_name: $db_name"
echo "db_user: $db_user"
echo "db_pass: $db_pass"
例如,我突出显示=$并点击⌘+d多次,返回到行的开头,用SHIFT键复制+→, 转到最后一行并新建一行,粘贴,高亮显示所有新行,点击⌘+SHIFT+l,然后添加我想要的任何内容


我正在使用vim多游标,但我不确定这是一种方法。有什么方向吗?

有很多方法可以做到这一点。这里有一个:从第一个db_主机开始的游标开始:

另一种方法是使用宏和寄存器,从同一位置开始:

qqq               Clear register q
qwq               Clear register w
qq                Start recording macro in q
yaw               yank a word (db_name) to default register
o                 open a new line below, and start insert
echo "
<C-R>"            insert the content of the default register (db_name)
: $
<C-R>"            insert the content of the default register (db_name) again
"<Esc>
"Wdd              the line is done; yank-append to register w
j0                skip the comment line, position at the start of the next variable
@q                execute the q macro (which is currently empty, but not for long)
q                 save the q macro
@q                execute the q macro (which will recurse, and slurp up all lines)
"wp               paste all the accumulated lines at the bottom
第三个,使用regexp:

:.,$v/^#/t$<CR>   copy all non-comment lines to the end
:-3,.s/\(\w\+\).*/echo "\1: $\1"/<CR>
                  I didn't set a mark so manual range from 3 lines above:
                  capture the first word, discard everything else,
                  replace with what we want (obviously, could have done
                  visual selection instead of manually setting range)
我是这样做的:

首先,使用替换创建回显线:

:%s/\(db_\w\+\)=\$(echo "\w\+")/&\recho "\1: $\1"
注意替换中的&,这是整个匹配行。后跟一个新的\r行

然后,清空一个寄存器,在我的情况下,您将使用它:

qaq
然后切断所述寄存器中的所有回波线:

:g/^echo /d A
"ap
最后,转到您希望的位置,并粘贴注册表的内容:

:g/^echo /d A
"ap
稍微不同的解决方案: 光标将移动到末尾,因此我们将间隔设置为负三行,直到当前行-3

注意:要插入寄存器0,必须键入Ctrl-vCtrl-r0

使用替代命令而不是普通命令 第二个命令可以是替换

:-3,.s/\v(^\w+).*/echo "\1: $\1"
vim解决方案如何成为更智能的解决方案?
如果要更改数百行或数千行,我认为多个光标不会有多大帮助,特别是当模式在多行上交错时。

可能我错过了您尝试执行的操作,但如果我理解正确,您只需要更新输出的格式

试试这个:

:g/[(]echo "/s/echo "\([^"]*\)"\(.*\)$/echo "\1"\2^Mecho "\1: $\1"/
注意:^M是一个单独的控制字符,不是克拉,然后是M。 见下文

以前-

#!/bin/bash
# Get host
db_host=$(echo "dbhost")
# Get DB name
db_name=$(echo "dbname")
# Get user
db_user=$(echo "dbuser")
# Get password
db_pass=$(echo "dbpass")
之后-

#!/bin/bash
# Get host
db_host=$(echo "dbhost")
echo "dbhost: $dbhost"
# Get DB name
db_name=$(echo "dbname")
echo "dbname: $dbname"
# Get user
db_user=$(echo "dbuser")
echo "dbuser: $dbuser"
# Get password
db_pass=$(echo "dbpass")
echo "dbpass: $dbpass"
解释 零碎-

:g/pat/cmd
这表示在匹配pat do cmd的每一行上全局显示。 我的拍子是你的回声,我的cmd是替代品

s/echo "\([^"]*\)"\(.*\)$/echo "\1"\2^Mecho "\1: $\1"/
我说用回声代替。。。。。。记住引号之间是1,后面是2

“替换”部分说要放回任何存在的内容,然后是一些诡计

通过点击CTRL-V,我进入了quote模式,这允许我点击CTRL-M插入回车符,vim在执行时将回车符转换为换行符,至少在我使用的版本上是这样

这是个骗局。了解和使用它可能很方便,但请始终记住,这些东西基本上都是黑客的。警告编剧


我随后用格式化的echo\1:$\1添加了您想要的行。

您的意思是将该文本转换为新文本,还是另外生成新文本?这是全文吗?变量的宽度是否总是相同的?。。。你可以选择很多方向…我能做的一件事就是录制一个宏。qd0vwhyGoecho pA:$pAqAdd文本到同一个文件中,最后一行下1行。这是全文。宽度应与1 w运动相同,以选择变量名称。我设法用宏实现了这一点,但花费的时间比我希望的要多。为什么要使用子shell回音将这些普通字符串分配给变量?@PaulHodges问得很好,尽管与现在的问题无关:PCtrl-V不是hackery,了解Vim::help c_ctrl-vHuh的一部分是正常且有价值的。我在使用命令行中的技巧。我没有意识到我在命令行上使用的技巧可能来自设置set-ovi,lol
:g/[(]echo "/s/echo "\([^"]*\)"\(.*\)$/echo "\1"\2^Mecho "\1: $\1"/
:g/pat/cmd
s/echo "\([^"]*\)"\(.*\)$/echo "\1"\2^Mecho "\1: $\1"/