vim怎样可以以noma设置打开preview-window

Vim、Emacs配置和使用
回复
头像
fanhe
帖子: 2357
注册时间: 2007-03-24 23:45

vim怎样可以以noma设置打开preview-window

#1

帖子 fanhe » 2010-12-19 20:17

我写代码的时候,想看定义,但是不想在本窗口跳过去,于是用preview窗口显示,但是这个preview窗口是打开了另外一个文件,于是会生成.swp文件
但是这个有想要看的函数定义的这个文件已经被另外一个vim打开了,于是会弹出个窗口警告说已经有了.swp啥的,很烦!
既然是preview窗口,还修改个毛啊,直接用vim -M这类打开不就行了,那就不会生成.swp了,上面的情况下也不会有警告了。

问题是,怎么实现啊?
头像
lilydjwg
论坛版主
帖子: 4258
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: vim怎样可以以noma设置打开preview-window

#2

帖子 lilydjwg » 2010-12-19 20:50

设置 swapfile 选项?使用 SwapExists 事件?设成只读?不打开实际的文件而是使用 nofile 类型的 buffer,然后使用 :r 读取信息?
头像
fanhe
帖子: 2357
注册时间: 2007-03-24 23:45

Re: vim怎样可以以noma设置打开preview-window

#3

帖子 fanhe » 2010-12-19 22:51

lilydjwg 写了:设置 swapfile 选项?使用 SwapExists 事件?设成只读?不打开实际的文件而是使用 nofile 类型的 buffer,然后使用 :r 读取信息?
我现在用ctrl-w_}来跳标签,但是貌似没有选择可以控制这个行为为只读打开
头像
fanhe
帖子: 2357
注册时间: 2007-03-24 23:45

Re: vim怎样可以以noma设置打开preview-window

#4

帖子 fanhe » 2010-12-20 11:22

暂时的实现,先设置shm+=A,打开后跳到预览窗口设置一堆东西,令其不许修改,没有swp文件等等,再跳回来,暂时算是实现了
但是我有点担心消除已有交换文件的警告,默认到底是什么操作,测试表明是只读打开,但是仍然不放心啊

以下代码改自帮助文件某个函数,实现按<CR>后预览函数定义,类似source insight那个预览窗口

代码: 全选

nnoremap <CR> :call PreviewWord()<CR>
function! PreviewWord()
	if &previewwindow
		let flag = 1
	else
		let flag = 0
	endif

	let w = expand("<cword>")		" 在当前光标位置抓词
	if w =~ '\a'					" 如果该单词包括一个字母

		" 在显示下一个标签之前,删除所有现存的语法高亮
"		silent! wincmd P			" 跳转至预览窗口
"		if &previewwindow			" 如果确实转到了预览窗口……
"			match none				" 删除语法高亮
"			wincmd p				" 回到原来的窗口
"		endif

		" 试着显示当前光标处匹配的标签
"		try
"			exe "ptag " . w
"		catch
"			return
"		endtry

		let l:temp = &shm
		set shm+=A

		if &filetype == "help"
			exe "normal! \<C-w>}"
		else
			exe "ptag " . w
		endif

		let &shm = l:temp

		let orgWinnr = winnr()
		silent! wincmd P			" 跳转至预览窗口
		if &previewwindow			" 如果确实转到了预览窗口……

			setlocal buftype=nowrite
			setlocal bufhidden=delete
			setlocal noswapfile
			setlocal nobuflisted

			if has("folding")
				silent! .foldopen	" 展开折叠的行
			endif

"			call search("$", "b")	" 到前一行的行尾
			let w = substitute(w, '\\', '\\\\', "")
"			call search('\<\V' . w . '\>')		" 定位光标在匹配的单词上
			call search('\<\V' . w . '\>', "c")	" 定位光标在匹配的单词上
			" 给在此位置的单词加上匹配高亮
			hi previewWord gui=bold guifg=cyan1 guibg=#445599 term=bold ctermbg=green
			exe 'match previewWord "\%' . line(".") . 'l\%' . col(".") . 'c\k*"'
			exe "normal! zz"

			if flag == 0
				" 返回原来的窗口
				execute orgWinnr . "wincmd w"
			endif

		endif

	endif
endf
---------------------
不好用,临时设置个set shm+=A就够了
回复