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

6
我希望使用外部PerlPython脚本将Vim中的一段文本更改为title case。作为这些脚本的用户,您可以选择未大写的小单词。
然而,我只想在行的一部分应用过滤器,而不是整行。有人知道如何做到这一点吗?
LaTeX源代码中的示例行:
\item the title case in latex and ...

应该变成

\item The Title Case in Latex and ...

以下命令不起作用:
:{visual}!{filter}

+1 好的第一个问题。你可以做出的一个改进是,不要写链接文本,而是使用链接工具(全局图标)嵌入链接。例如,如果您编辑帖子,您可以在第二句中选择"wikipedia",点击编辑框上方的链接图标,并将链接地址粘贴到其中。 - Codie CodeMonkey
作为一个新用户,我只能创建两个链接。所以感谢您的点赞和编辑问题。 - Hotschke
还有一个关于tex.sx的问题。缺点是提出的基于tex的解决方案,使用stringstrings包会使tex文件的编译极其缓慢。 - Hotschke
现在有一个名为titlecaps的新latex软件包。 - Hotschke
3个回答

3

所有ex命令都按行处理(因为vi / ex历史记录原因)。因此,不可能仅针对选定的单词使用过滤器,只能按行处理。

vim帮助文件(版本8.0.x)中记录了这一点,在:h 10.3下:

注意:
当使用可视模式选择行的一部分或使用CTRL-V选择文本块时,冒号命令仍将应用于整行。 这可能会在Vim的将来版本中更改。

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

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

相关的sx.questions如下:


1

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

vis - 扩展视觉模式命令、替换和搜索vimscript #1159github镜像

:'<,'>B !titlecase


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是非常美味的糖果!<- 在视觉上选择这一行

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


你能否调整你的vim函数,以允许用户选择那些没有大写的小单词?很抱歉我的原始问题没有表达清楚。我仍然希望vim在一般情况下提供所需的功能。 - Hotschke
无论如何,已经有了vim脚本。titlecase.vim只是执行全大写。因此,脚本名称是误导性的,不能解决问题。cream-capitalization实际上做到了我想要的。这个插件的一个小问题困扰着我:使用v$进行可视选择时,cream-capitalization会将选择移动到新行。这很烦人。你必须将光标向左移动一步。然而,我想知道是否可以通过使用外部命令来解决我的问题。 - Hotschke
如果你想的话,你可以将一个缩写映射到v$h,例如vmap $ $h这样,在可视模式下按$后就不需要再物理按h了。现在v$会做你想要的事情。听起来这个和cream-capitalization应该就是你所需要的全部了。祝好运! - kikuchiyo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接