从当前缓冲区读取并在函数或命令中使用它

Reading from current buffer and using it in a function or command

我正在尝试绑定 F5 以在当前文件上运行 sass --update。我卡住的地方是输出。我决定的解决方案是在输入文件的第一行包含输出文件的注释,例如:
//C:\Users\wuffie\Projects\output.css
我如何读取行, trim 开头的斜杠,并将其放入我的命令中?它需要一个完整的功能吗?这是我目前所拥有的:
au BufEnter,BufNew *.sass nmap <F5> :w<CR>:tabnew <bar> silent :r !sass --update expand('%:p'):

让我们首先清理您的命令(为简洁起见,我省略了 :autocmd;或者,您可以将 :map 放入 ~/.vim/after/ftplugin/sass.vim,假设文件类型被检测为 sass):

nnoremap <buffer> <F5> :w<Bar>tabnew<Bar>silent :r !sass --update %:p<CR>
  • You should use :noremap;它使映射不受重新映射和递归的影响。
  • 使用<buffer>关键字,映射仅为文件缓冲区定义,不会污染其他缓冲区。
  • 到处使用<Bar>,并添加缺少的结尾<CR>
  • expand() 不会正确计算,也没有必要,%:p 已经被 :r 解释了。 (但我们需要扩展名,请继续阅读):

现在,让我们将第一行的读法转化为:

nnoremap <buffer> <F5> :execute 'w<Bar>tabnew<Bar>silent :r !sass --update ' . expand('%:p') . ':' . getline(1)[2:]<CR>

这使用 :execute 构建命令行,并使用 getline(1) 访问文件的第一行。我使用字符串索引来截断前两个注释字符 ([2:]);您也可以在此处使用 strpart(),或在更复杂的情况下使用 substitute()。为了使这个防弹,将最后的表达式包装在 shellescape(..., 1).

nnoremap <buffer> <F5> :execute 'w<Bar>tabnew<Bar>silent :r !sass --update ' . shellescape(expand('%:p') . ':' . getline(1)[2:], 1)<CR>