在Vim中插入破折号的最简单方法是什么?


33

要插入一个破折号,我使用了^v u 2014七个按键。有没有更简单的方法?(我正在查看有向图,但没有在那找到破折号。)



7
如果您使用的是X11,我会说XCompose ...,因为它将在您的所有应用程序上运行,而不仅仅是在Vim上。或者,如果您使用的是OSX或Windows,则该操作系统提供的功能。
马丁·图尔诺伊

也许不是最简单的方法,但我倾向于使用<Ctrl-Shift-U>2013<Space>它,因为它无处不在。一些关键代码会走很长一段路(我主要使用U + 2013,U + 2014,U + 2026,U + 2212,U + 2192,U + B0; – / — /…/ − /→/°)。
wchargin

出于好奇,您如何显示破折号?AFAIK,无法正确显示非固定宽度的字体(即,字符宽度和字距不均匀),因此,长划线和长划线始终看起来像连字符,延伸到字符边界的最边缘。您是否不介意在Vim中如何显示角色以及如何在其他位置呈现角色之间存在极端的脱节?
凯尔·斯特兰德

2
我与@Carpetsmoker在一起:Compose - - -用于破折号,Compose - - .用于破折号。撰写很神奇,尤其是当您将其映射到原本完全未使用的Caps-Lock上时。
Rmano

Answers:


42

您可以使用有向图:(Ctrl+k-N大写N

在“插入”模式下,输入图Ctrl+k后跟两个字符的序列。对于破折号,顺序为-N

正如昆西指出的,U+2014是破折号。如果要使用图来输入,则序列为-M


同样,可以在<Ck> -M中插入EM DASH。
Quincy Bowers

U+2014不是破折号吗?我一生都是骗人的!编辑:现在我明白了:我的终端字体(Inconsolata)以相同的方式渲染两个破折号。
Tomas Tomecek

3
十六进制2013是十进制8211使用:要在此得出答案:digraphs来显示所有图命令,并查找8211
200_success

10

如果没有预定义的图,或者您想要更难忘的键序列,则可以在vimrc中定义图。例如,下面将为破折号(8211)和破折号(8212)定义两个有向图,它们反映了它们的XCompose序列。

digraph -. 8211 -- 8212

:digraph命令期望以十进制而不是十六进制指定值,这就是为什么破折号而不是2013为8211的原因。


该破折号有向图是内置的。
200_success

1
@ 200_success我没有说不是。:) Vim的有向图选择并不总是与更标准的选择保持一致,因此,即使已经存在一个,知道如何定义自己的有向图也是有用的。
jamessan 2015年

8

tommcdo所解释的,在Vim中插入破折号的标准方法是使用有向图。

不过,我觉得有向图一般,而且特别是这一个(Ctrl+k-Shift+N)很尴尬的类型。为了更快地输入破折号,您可以将以下一对插入模式映射添加到文件类型文件中,例如.vim/after/ftplugin/markdown.vim

分别用于en / em破折号:

inoremap <buffer> --<space> –<space>
inoremap <buffer> -- —

注意:这<buffer>意味着此映射将仅适用于Markdown文件。这是必要的,因为在某些情况下(例如编程),我希望将两个连字符替换为破折号。

这些映射利用了以下事实:在我通常使用的上下文中,破折号用空格包围,而破折号没有用空格包围。*因此,使用这些映射意味着我可以在功能欠佳的文本编辑器中使用完全相同的按键,有时我不得不使用它们,但仍会得到合理的输出。**

实际上,我使用的解决方案比上述方法稍微复杂一些,因为出于排印的原因,我喜欢将短划线包围在空格处。在Markdown中将它们包含在内会使它的可读性降低,但是幸运的是,Vim具有一个解决方案,它具有“隐藏”功能,当光标在另一行时,该功能可以隐藏某些语法项:***

inoremap <buffer> --<space> –<space>
inoremap <buffer> -- &#8202;—&#8202;

syntax match entity_hairspace "&#8202;" conceal
setl conceallevel=2

*如果我需要使用不带空格的破折号,那么我可以在键入映射后直接按退格键。
**如果您通常不使用这样的破折号,或者您从未尝试过使用Vim,则可以使用其他方式来触发映射:例如--.---。如果使用其他触发器,则也可以将其直接放在.vimrc中,然后删除<buffer>选项。
***您还可以使用隐藏字符cchar用单个字符替换语法项,而不是完全隐藏它们。如果您担心编码问题,可以使用它来使Vim以&ndash;短划线显示文件中的HTML实体。


因此,您在Vim中使用破折号吗?因为它们只有一个列宽,所以它们看起来不是很奇怪吗?您是否知道使破折号实际占用大量空间的技巧,也许值得两列?
凯尔·斯特兰德

@KyleStrand您想获得怎样的技巧?尝试以下操作:(set conceallevel=1 | syntax match longdash '—' conceal cchar=-请注意,该命令中的第一个破折号是一个破折号,第二个破折号是全角连字符减。)
Rich

我看不到显示的差异,也看不出为什么这会使显示占据两列。您是不是偶然误解了我的问题,还是我可能误解了您的建议?
凯尔·斯特兰德

....实际上,我对Vim语法规范一无所知。该syntax match命令甚至可以在语法文件的上下文之外运行吗?
凯尔·斯特兰德

@KyleStrand我理解你的问题。您是否尝试过将该行复制到vimrc中?还是只在Vim中运行它?:)
Rich

3

在法语AZERTY Mac键盘上,我可以使用Alt+ 插入破折号-。您的里程显然可能会有所不同。


2
Alt+-(或者说Option+-是学究的)是Mac专用的快捷方式。它可以在OS X的任何地方使用,但与vi或vim无关。
ash108

1
在MacVim中可以使用,但在Terminal vim中,它的作用类似于[Esc],后跟-,因此切换到“普通”模式并将光标置于前一行的开头。
200_success,2015年


0

受Rich的出色回答启发,我在vimrc中添加了以下几行:

" For en/em dashes, respectively
autocmd FileType markdown imap -- –
autocmd FileType markdown imap --- —

像对待美食!


0

对于破折号来说,最好的方式是去,如其他答案所示。但是对于任意unicode字符,另一种方法是^V在插入模式下使用(请参阅参考资料:he i_CTRL-V_digit)。

例如一个破折号^Vu2013


我现在意识到这实际上是OP已经在做的!(尽管破折号是2013年,而不是2014年-这是破折号。)但是,我认为在答案中找到某个地方可能仍然很好。
tremby
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.