vim 能否取得映射左边? [错误问题]

Vim、Emacs配置和使用
回复
头像
自由建客
帖子: 13468
注册时间: 2008-07-30 23:21
系统: Debian stable AMD64

vim 能否取得映射左边? [错误问题]

#1

帖子 自由建客 » 2011-05-23 16:57

比如
getmapl("<c-a>")
getmapl("<C-a>")
getmapl("<C-A>")
结果都是 "<C-A>"
再比如
getmapl("<m-m>")
getmapl("<M-m>")
getmapl("<A-m>")
结果都是 "í" 或 "<A-m>"

--------------------------------
见五楼
上次由 自由建客 在 2011-05-27 23:19,总共编辑 3 次。
头像
fanhe
帖子: 2357
注册时间: 2007-03-24 23:45

Re: 能否取得映射左边?

#2

帖子 fanhe » 2011-05-23 17:20

你能不能描述清楚你的问题? 问问题都不会问?

有 getmapl 这个函数么?

需要获取map的左边,要么判断有没有映射, 要么就重定向 :map 的输出然后过滤文本
头像
自由建客
帖子: 13468
注册时间: 2008-07-30 23:21
系统: Debian stable AMD64

Re: 能否取得映射左边?

#3

帖子 自由建客 » 2011-05-23 19:15

getmapl() 是我臆造的,我要的其实是一个转换函数,就是把 <c-a> <C-a> <C-A> 这样的同义词转换成唯一的表示方式。
头像
fanhe
帖子: 2357
注册时间: 2007-03-24 23:45

Re: 能否取得映射左边?

#4

帖子 fanhe » 2011-05-23 19:20

自由建客 写了:getmapl() 是我臆造的,我要的其实是一个转换函数,就是把 <c-a> <C-a> <C-A> 这样的同义词转换成唯一的表示方式。
那跟你标题有什么关系?
你这样忽略大小写, 直接 =~? '<c-a>' 然后 upper 不就行了
头像
自由建客
帖子: 13468
注册时间: 2008-07-30 23:21
系统: Debian stable AMD64

Re: vim 能否取得映射左边?

#5

帖子 自由建客 » 2011-05-24 22:59

fanhe, 没那么简单。

问题解决了,虽然方法有点变态,还有副作用,不过在我的应用中不碍事。就算不希望有副作用也可以简单的备份再恢复。

代码: 全选

" 返回 key 的唯一表达式
" string (string, string)
fun s:Key_GetKey(mode, key)
	exe a:mode."noremap" "<expr>" a:key "<SID>Key_NoOp()"
	let str=""
	redir => str
	exe "silent" a:mode."map"
	redir END
	for item in split(str, "\n")
		let r = matchstr(item, '\m^\S*\s\+\zs\S\+\ze\s\+\S*\s\+'.s:snr.'Key_NoOp()$')
		if r!=""
			break
		endif
	endfor
	" { 测试用行,可删
	exe a:mode."unmap" a:key
	" }
	return r
endfun

" 空函数,供 Key_GetKey() 使用
fun s:Key_NoOp()
	return ""
endfun

fun s:GetSnr()
	return matchstr(expand('<sfile>'), '\zs<SNR>\d\+_\zeGetSnr$')
endfun
let s:snr=s:GetSnr()
delfun s:GetSnr
头像
自由建客
帖子: 13468
注册时间: 2008-07-30 23:21
系统: Debian stable AMD64

Re: vim 能否取得映射左边? [解决]

#6

帖子 自由建客 » 2011-05-27 23:16

错了错了,不可靠,<lt>Esc> 和 <Esc> 会是一样的结果,压根就不应该处理,特殊键只要加反斜杠就行了。

代码: 全选

"\<Esc>"
回复