从当前缓冲区读取并在函数或命令中使用它
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>
我正在尝试绑定 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>