通过过滤器运行所选文本并重新插入

时间:2014-07-09 18:50:16

标签: vim

我喜欢使用代码清理脚本; perldidy; uglifierjs等我先前在我的vimrc中运行了这些...

map <leader>pt          :!perltidy<CR>
map <leader>jt          :!uglifyjs -b<CR>
map <leader>pjt          :!python -mjson.tool<CR>
map <leader>ct          :!column -t<CR>

这个功能如何运作;它在CLI程序中运行当前选定的文本,并用输出替换选择。工作得非常好;但正如你所看到的,我现在必须停下来思考我想要运行什么美化,并记住我所拥有的nemonic。这让我觉得必须有更好的方法。所以我试过这个......

map <leader>jt :call RunTidy()<cr>
function! RunTidy()
    if (&ft == "javascript")
        echo 'is js..'
        :'<,'>!ulifyjs -b
    endif
    if (&ft == "json")
        echo 'is json'
        :'<,'>!python -mjson.tool
    endif
endfunction

这个问题不起作用;每行执行一次而不替换内容..任何人都知道更好的方法吗?我觉得这应该是一个解决的问题...

2 个答案:

答案 0 :(得分:2)

使用ftplugins。您需要在vimrc中使用filetype plugin indent on

~/.vim/ftplugin/<filetype>.vim中创建文件。设置文件类型时将获取这些文件。

例如,使用javascript将以下内容放入~/.vim/ftplugin/javascript.vim

noremap <buffer> <leader>jt :!uglifyjs -b<CR>

在所有javascript缓冲区中将<leader>jt映射到:!uglifyjs -b<CR>。这不会出现在其他文件类型中。

您将对所有其他文件类型执行相同的操作。

您可以使用setlocal

对文件类型特定设置执行相同操作

查看:h ftplugin

答案 1 :(得分:2)

augroup filters
  autocmd!
  autocmd FileType perl       map <buffer> <leader>t :!perltidy<CR>
  autocmd FileType javascript map <buffer> <leader>t :!uglifyjs -b<CR>
  autocmd FileType json       map <buffer> <leader>t :!python -mjson.tool<CR>
augroup END

或将这些映射都放在不同的~/.vim/after/ftplugin/{filetype}.vim中。所有这些映射都使用相同的lhs。