在shell命令之后管道vim命令

时间:2017-05-18 23:10:35

标签: bash shell vim

我试图在vim中进行键映射,(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命令?

6 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

您是否尝试过vim-fugitive

您可以使用该插件 git commit -am ,然后添加您的git命令。

所以你会写一些类似的东西:

Gcommit -am "auto"

我简要测试了一下。我把它放到我的.vimrc中:

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

然后输入:call CommitAndQuit(),它会做你想要的。

答案 2 :(得分:1)

当我到达这里时,这感觉很相关!

因此,如果您想在命令中绑定它,您将无法使用<cr>,管道也将无效。

在这种情况下,正确的做法是使用一个函数,只需从该命令调用该函数。

在这个例子中,我有一个shell脚本来grep一些日志文件的错误,并将结果输出到.errors,然后在quickfix中打开。重绘是因为静音会使用外部命令混淆你的屏幕!

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

command! ReadErrors call ReadErrors()

答案 3 :(得分:0)

You can't

  

A&#39; |&#39;在{cmd}中传递给shell,您不能使用它来附加Vim命令。见|:bar |。

答案 4 :(得分:0)

我在这里看到3种情况:

添加vim命令

如果要添加新的vim命令,以便键入:W将写入缓冲区,执行git commit和退出vim,则需要遵循JonnyRaa的回答。即,定义一个函数,然后定义执行该函数的命令:

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

注意:

  1. 这些行可以放入〜/ .vimrc中,或者在按:进入命令行模式后直接执行。
  2. 我使用silent来避免出现“按Enter或键入命令以继续”的提示。
  3. 您可能希望使用writequit而不是wq,以获得更好的代码。 (相反,如果您急忙将silent缩短为sil……)

添加键盘映射

如果您只想按一个键即可运行这些命令,则需要添加一个映射,将shell命令放在中间的技巧是使用<CR>模拟按下ENTER键:

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

注意:

  1. 再一次,它可以进入〜/ .vimrc或通过点击:并直接键入来执行。
  2. 您可以在shell命令之后添加一个额外的silent来代替<CR>

直接执行

有时候,您需要重复执行一系列命令,但是值得一提的是,将它们暂存到vimrc中是不重要的,因为它们是临时的,将来将不再有用。在这种情况下,我只执行该行,然后依靠向上箭头将该行再次从历史记录中移出并执行它。 在这种情况下,技巧是使用Ctrl-V,Ctrl-J在命令中间添加转义的LF字符:

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

注意:

  1. 命令中的^@是我按Ctrl-V,Ctrl-J时显示的内容。如果您按下Shift-6,Shift-2,将无法使用。但是,如果按Ctrl-Shift-2,它似乎确实起作用。
  2. 您也可以用LF替换第一个竖线字符,但不必这样做。
  3. 如果您感到好奇,则Ctrl-J为LF,因为LF为ASCII 10,并且J是ABC的第十个字母。同样,Ctrl-I是Tab,Ctrl-M是CR,而Ctrl-]是Escape,因为Escape是ASCII 27,如果查看ASCII table,您会发现]是美国广播公司(ABC)的第27个字母。

答案 5 :(得分:-1)

我使用此命令将当前文件路径复制到系统剪贴板。

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