通过外部命令仅过滤几个单词(不是完整的行)

时间:2011-12-06 16:48:03

标签: vim

我想使用外部PerlPython脚本将Vim中的文本选择更改为title case。作为这些脚本的用户,您可以选择不大写的小词。

但是,我想仅在一行的一部分而不是整行上应用滤波器。有谁知道怎么做?

LaTeX源代码中的示例行:

\item the title case in latex and ...

应该成为

\item The Title Case in Latex and ...

以下命令不起作用:

:{visual}!{filter}

3 个答案:

答案 0 :(得分:3)

所有ex命令都按行工作(由于vi / ex历史记录)。因此,不能仅对选定的单词使用过滤器,只能使用行。

这在:h 10.3下的vim(版本8.0.x)的帮助文件中有记录:

  

注意:
    使用可视模式选择行的一部分或使用CTRL-V时     选择一个文本块,冒号命令仍将适用于整个     线。这可能会在未来的Vim版本中发生变化。

要直接跳转到此帮助部分,请尝试使用:helpg colon\ commands.*apply

供参考:可以通过:h ex-cmd-index显示ex命令列表。

相关的sx.questions是:

答案 1 :(得分:1)

此示例部分正常工作,但不会将视觉选择文本中的最后一个单词大写。想法是通过留在Vim减少工作量。得到这个来处理视觉选择中的最后一个单词,你就在那里。 :)每个更新的规格,传递“\\ |”已删除的小单词列表,首字母大写。

" Visually select some text
":call title_case_selection:()
" and probably want to map it to some abbreviation
"

function title_case_selection:( list_of_words_bar_delimited )
    let g:start_column=virtcol("'<") - 1
    let g:end_column=virtcol("'>") + 1
    let g:substitution_command=':s/\%>'.g:start_column.'v\<\(\w\)\(\w*\)\>\%<'.g:end_column.'v/\u\1\L\2/g'
    call feedkeys ( g:substitution_command )
    call feedkeys ("\<cr>", 't')
    let g:substitution_command=':s/\%>'.g:start_column.'v\<\('.a:list_of_words_bar_delimited.'\)\>\%<'.g:end_column.'v/\L\1/g'
    call feedkeys ( g:substitution_command )
    call feedkeys ("\<cr>", 't')
endfunction

“abba zabba是一个非常好吃的糖果!&lt; - 视觉上选择这一行

:call title_case_selection:("Is\\|A")

答案 2 :(得分:1)

最后,我找到了一个我想到的插件:

vis - 扩展视觉模式命令,替代和搜索 vimscript #1159github mirror

:'<,'>B !titlecase