在shell命令后用管道发送vim命令

oewdyzsn  于 2022-11-11  发布在  Shell
关注(0)|答案(7)|浏览(90)

我尝试在vim中做一个键Map,它(a)保存当前文件(B)执行一个git操作,使用shell(c)退出当前的vim编辑器。
我试过以下方法,但还是没弄明白。

方法1-在Vim命令行中

:w | !git commit -am "auto" | q

方法2-在vimrc中

map :W :w \| !git commit -am "auto"
map :L :Wq

问题

问题是管道|只能用于附加shell命令。如何执行'a Vim command' + 'a shell command' + 'a Vim command'?如何在shell命令后使用管道发送vim命令?

4ngedf3f

4ngedf3f1#

您需要分别执行这三个命令。这就是<CR>的作用:

nnoremap <key> :w<CR>:!git commit -am "auto"<CR>:qa<CR>
uinbv5nw

uinbv5nw2#

你试过vim-fugitive吗?
您可以使用该插件 git commit -am,然后添加您的git命令。
所以你可以这样写:
Gcommit -am "auto"
我简单测试了一下。我把这个放进了我的。vimrc:

function! CommitAndQuit()
    execute "Gcommit -am 'auto'"
    execute "q"
endfunction

然后键入:call CommitAndQuit(),它就会按照您的要求执行操作。

djmepvbi

djmepvbi3#

这感觉与我在这里结束了联系!
所以如果你想在一个命令中绑定它,你将不能使用<cr>,管道也不能工作。
在这种情况下,正确的做法是使用一个函数,并从该命令调用该函数。
在这个例子中,我有一个shell脚本来grep一些日志文件中的错误,并将结果输出到.errors中,然后在quickfix中打开它。

function! ReadErrors()
  silent !read-errors
  redraw!
  cfile .errors
endfunction

command! ReadErrors call ReadErrors()
lnxxn5zx

lnxxn5zx4#

我在这里看到了3种情况:

添加vim命令

如果你想添加一个新的vim命令,这样输入:W就可以写入缓冲区,执行git commit并退出vim,你需要按照JonnyRaa的答案来做,也就是说,定义一个函数,然后定义一个执行该函数的命令:

function! WriteCommitAndQuit()
    w
    silent !git commit -am "auto"
    q
endfunction
command! W call WriteCommitAndQuit()

备注:
1.这些行可以放在~/.vimrc中,或者在点击:后直接执行以进入命令行模式。
1.我使用了silent,以避免出现“按Enter或键入命令继续”提示。
1.您可能希望使用writequit,而不是wq,以获得更美观的代码(相反,如果您赶时间,可以将silent缩短为sil...)。

添加键盘Map

如果您只希望能够按一个键来运行这些命令,则需要添加一个Map,将shell命令放在中间的技巧是使用<CR>来模拟按ENTER键:

map <F10> :w<CR>:silent !git commit -am "auto"<CR>:q<CR>

备注:
1.同样,这可以在~/.vimrc中执行,或者通过点击:并直接键入来执行。
1.除了silent之外,您还可以在shell命令之后添加一个额外的<CR>

直接执行

有时候,您希望重复运行一系列命令,但不值得将它们保存到vimrc中,因为它们是临时的,在将来也没有用。在本例中,我只执行该行,然后依靠向上箭头从历史中再次调出该行并执行它。在本例中,技巧是使用Ctrl-V在命令中间添加一个转义的LF字符,Ctrl-J:

:w | silent !git commit -am "auto" ^@ q

备注:
1.命令中的^@是我按Ctrl-V、Ctrl-J时显示的内容。如果按Shift-6、Shift-2,它将不起作用。但是,如果我按Ctrl-Shift-2,它似乎确实起作用。
1.您也可以将第一个竖线字符替换为LF,但不是必须这样做。
1.如果你好奇的话,Ctrl-J是LF,因为LF是ASCII 10,J是ABC的第10个字母。类似地,Ctrl-I是Tab,Ctrl-M是CR,而Ctrl-]是Escape,因为Escape是ASCII 27,如果你看ASCII table,你会发现]是ABC的第27个字母。

whlutmcx

whlutmcx5#

我用这个命令复制当前文件路径到系统剪贴板。

map <silent> <leader>vv :echo expand('%:p') \| !syscopy.sh <cr>
pobjuy32

pobjuy326#

对我来说,原因很简单:

    • 工作 *
:echo expand('ls') | echomsg 'test'
    • 不工作 *
:!ls | echomsg 'test'
sbdsn5lh

sbdsn5lh7#

您不能:
A '|'传递到shell,则不能使用它附加Vim命令。请参阅|12:条形|。

相关问题