emacs 缩进提示线

Vim、Emacs配置和使用
kardinal
帖子: 750
注册时间: 2006-03-19 11:39

emacs 缩进提示线

#1

帖子 kardinal » 2012-01-11 0:20

scite 里面,每缩进一步,显示一条坚线,非常的拉风,研究下 emacs 里面怎么实现
[lisp]
(defun indent-vline ()
(interactive)
(funcall
(lambda (x z)
(font-lock-add-keywords
nil `((,x
(0 (if (save-excursion
(skip-chars-backward " ")
(bolp))
(let* ((p2 (point)) (p1 (1- p2)))
(if (overlays-at p1)
nil ;; (move-overlay (car (overlays-at p1)) p1 p2)
(overlay-put
(make-overlay p1 p2) 'face ',z))
nil)))))))
" \\( \\)" '(:background "gray30")))
[/lisp]
这个是用 overlay 实现的,口味比较重的同学可以试试 :em06 ,主要问题是删除提示线所在的空格后,overlay 的回收比较麻烦(不回收似乎问题也不大),暂时可以通过遍历 (overlay-lists),删除里面 overlay-start 和 overlay-end 相同的 overlay

还有一种方案,提示线用字符来显示,缺点是不太美观(类似 vim 中 :set listchars 的方式)
[lisp]
(defun indent-vline ()
(interactive)
(funcall
(lambda (x y z)
(font-lock-add-keywords
nil `((,x
(0 (if (save-excursion
(skip-chars-backward " ")
(bolp))
(progn
(compose-region (match-beginning 1) (match-end 1)
,(decode-char 'ucs y)
'decompose-region)
',z)))))))
" \\( \\)" #X007C '((t (:foreground "gray30")))))
[/lisp]
:em11 直接设置文本属性,可能即美观又省心,研究了半天,emacs 的表现十分淡定,改天再说
头像
Fermat618
帖子: 728
注册时间: 2008-12-28 16:01

Re: emacs 缩进提示线

#2

帖子 Fermat618 » 2012-01-11 13:30

缩进线,粗了就难看了。vim估计是没没法搞出好看的缩进线了,不知道X下的Emacs能不能搞出那种细线来。
爱因斯坦会弹钢琴
爱因斯坦会拉小提琴
爱因斯坦会骑自行车
kardinal
帖子: 750
注册时间: 2006-03-19 11:39

Re: emacs 缩进提示线

#3

帖子 kardinal » 2012-01-11 23:10

Fermat618 写了:缩进线,粗了就难看了。vim估计是没没法搞出好看的缩进线了,不知道X下的Emacs能不能搞出那种细线来。
这个估计相当的难,图形界面和字符界面保持兼容是vim、emacs之流的“潜规则”
如果只是想细一点的话,可以画竖虚线并且颜色浅一点(主要问题是行距不为0时,这些竖线连不到一起;即便行距为0,有些字体依然连不到一起)
pocoyo 写了:应该给个 screencast 比较好看一点 或者截图
只是一个试验而已,没必要搞的这么正式 :em03
非得让俺献丑,那就现一个吧
图像 1.png
图像 2.png
kardinal
帖子: 750
注册时间: 2006-03-19 11:39

Re: emacs 缩进提示线

#4

帖子 kardinal » 2012-01-12 1:04

Fermat618 写了:缩进线,粗了就难看了。vim估计是没没法搞出好看的缩进线了,不知道X下的Emacs能不能搞出那种细线来。
:em05 ok,可以插入图片来解决这个问题,有图有真相
图像 3.png
对于插入图片不太熟悉,临时拷了一段代码……所以这种方案暂时还不能正常工作,有时间调整调整
头像
fanhe
帖子: 2357
注册时间: 2007-03-24 23:45

Re: emacs 缩进提示线

#5

帖子 fanhe » 2012-01-12 9:17

真拉风
vim 怎么实现?估计就 vim 现在的显示机制是实现不了的了,一次高亮只能一列
头像
Ubuntu与Linux
帖子: 1211
注册时间: 2010-06-09 19:57

Re: emacs 缩进提示线

#6

帖子 Ubuntu与Linux » 2012-01-12 11:16

期待vim版出现
otaku.baili
帖子: 243
注册时间: 2010-09-30 21:54

Re: emacs 缩进提示线

#7

帖子 otaku.baili » 2012-01-12 11:44

字符那个看起来挺拉风的= =
kardinal
帖子: 750
注册时间: 2006-03-19 11:39

Re: emacs 缩进提示线

#8

帖子 kardinal » 2012-01-12 17:41

vim 的差不多这样

代码: 全选

set list
set listchars=tab:\|\  
http://hi.baidu.com/wsjlzu/blog/item/1e ... 8f834.html

http://www.douban.com/group/topic/8548934/
这个讨论里面还有另一种方案,感觉比较靠谱

不过我都没有试过 :em06

看过一个图片,每条缩进线还能用不同颜色显示……当然 emacs 里面用不同颜色显示也不难,不过没太大意思
kardinal
帖子: 750
注册时间: 2006-03-19 11:39

Re: emacs 缩进提示线

#9

帖子 kardinal » 2012-01-13 1:27

xpm 的版本基本可用了
前面的 setq dot-vline-xpm 部分相当的纠结……
它的作用是生成一个 xpm 格式的图片作为变量 dot-vline-xpm 的内容
最后在三个参数 10 22 "#ADA5C6" 分别指定这个图片的宽、高以及虚线的颜色
当然宽和高应该是自动判断的,但是目前我还不知道怎么弄……所以,自己调整下吧 :em04

后面的那个函数和前面几个例子差不多,没什么新意就不介绍了
需要注意的是:当从前往后删除空格时,后面的缩进线会有点走样,重新缩进一次就可以了。
图片基本和第三个差不多……算了,作为一个细心的人,我还是再截一次图吧
图像 2.png
[lisp]
(setq dot-vline-xpm
(funcall
(lambda (width height color)
(let* ((w width)
(h height)
(s1 (concat "\"" (make-string w (string-to-char " ")) "\""))
(s2 (concat "\"" (make-string (1- w) (string-to-char " ")) ".\""))
(sa (concat s1 ",\n" s2 ",\n")))
(eval `(concat "/* XPM */
static char * dot_vline_xpm[] = {
\"" (number-to-string w) " " (number-to-string h) " 2 1\",
\" c None\",
\". c " color "\",\n"
,@(mapcar (lambda(x) sa)
(make-list (1- (/ h 2)) 0))
s1 ",\n" s2 "};"
))))
10 22 "#ADA5C6"))

(defun indent-vline ()
(interactive)
(funcall
(lambda (x)
(font-lock-add-keywords
nil `((,x
(0 (if (save-excursion
(skip-chars-backward " ")
(bolp))
(let* ((p2 (point))
(p1 (1- p2)))
(if (get-text-property p1 'display)
(remove-text-properties p1 p2 'display)
(set-text-properties p1 p2 `(display (image :type xpm :data ,dot-vline-xpm :pointer arrow :ascent center :mask (heuristic t)) rear-nonsticky (display) fontified t))
nil))))))))
" \\( \\)"))
[/lisp]
风间星魂
帖子: 490
注册时间: 2009-06-20 23:53

Re: emacs 缩进提示线

#10

帖子 风间星魂 » 2012-01-15 13:52

clang.png
空行冒失有点问题。
kardinal
帖子: 750
注册时间: 2006-03-19 11:39

Re: emacs 缩进提示线

#11

帖子 kardinal » 2012-01-15 16:28

VIM???这个真不会哈

另外“空行”是指颜色冲突的那一行?其它地方没有发现有什么异常 :em20

通过行号处及“s”的颜色可以推断,下划线与字符冒失不能设置两种颜色
看这样子似乎是先给竖线上色,再给橫线上色,再给关键词上色
想办法调整一下顺序吧?
或者,设置该处空白字符的背景比较好?
kardinal
帖子: 750
注册时间: 2006-03-19 11:39

Re: emacs 缩进提示线

#12

帖子 kardinal » 2012-01-15 18:06

编辑下,看看会不会顶上去
->>-----2012-02-05--7--23:36:02-------->
很好,偷偷在这里存点东西
->>-----------------------------------2012-02-05--7--23:37:11-------------------------------------->
调整下分隔线
->>-----------------------------------2012-02-05--7--23:39:06-------------------------------------->
突然发现,我有点睏了,下回再说吧
上次由 kardinal 在 2012-02-05 23:41,总共编辑 4 次。
头像
rykka
帖子: 59
注册时间: 2011-06-24 9:14

Re: emacs 缩进提示线

#13

帖子 rykka » 2012-01-16 2:29

vim的缩进提示
[vim]
au! FileType python call Python_color()
function! Python_color()
if (&et)
exec 'syn match cTab1 /^ \{'. &sw .'}/hs=e'
exec 'syn match cTab2 /\(^ \{'. &sw .'}\)\@<= \{'. &sw .'}/hs=e'
exec 'syn match cTab3 /\(^ \{'. &sw*2 .'}\)\@<= \{'. &sw .'}/hs=e'
exec 'syn match cTab4 /\(^ \{'. &sw*3 .'}\)\@<= \{'. &sw .'}/hs=e'
exec 'syn match cTab5 /\(^ \{'. &sw*4 .'}\)\@<= \{'. &sw .'}/hs=e'
exec 'syn match cTab6 /\(^ \{'. &sw*5 .'}\)\@<= \{'. &sw .'}/hs=e'
exec 'syn match cTab7 /\(^ \{'. &sw*6 .'}\)\@<= \{'. &sw .'}/hs=e'
syn match cTabError /^ *\t\+ */
endif
endfunction
[/vim]
cTab1~7的颜色自己设置吧,我是用插件自动生成的。

代码: 全选

hi cTab1 guibg=#D1D1BC
缺点:
1. 相对‘|’显得太粗
2. 空行不会显示。
kardinal
帖子: 750
注册时间: 2006-03-19 11:39

Re: emacs 缩进提示线

#14

帖子 kardinal » 2012-01-17 1:18

lisp 的缩进并不是固定步长,比如多数语言每级缩进4个或者8个空格之类……
这也是 lisp 难于阅读的一个原因吧(其实固定缩进的话,括号多点顶多呕吐,还不至于头晕)
如果按照普通的标准,固定每几列显示一条缩进线,对于 lisp 来说意义不大,因此……
看图
无标题.png
[lisp]
(make-local-variable 'indent-column-list)
(defvar indent-column-list '(0))
(defun indent-vline-s ()
(interactive)
(funcall
(lambda (x)
(font-lock-add-keywords
nil `((,x
(0 (if (> (current-indentation) 0)
(let* ((p1 (point))
(p2 (1+ p1))
(i (current-indentation))
(c (current-column)))
(while (> (car indent-column-list) i)
(setq indent-column-list (cdr indent-column-list)))
(add-to-list 'indent-column-list i)
(if (and (eq (get-byte p1) 32)
(memq c indent-column-list))
(set-text-properties
p1 p2
`(display (image
:type xpm
:data ,dot-vline-xpm
:pointer text
:ascent center
:mask (heuristic t))
rear-nonsticky (display)
fontified t))
nil))))))))
" ")
(defadvice delete-char (after indent-vline activate compile)
(save-excursion
(let* ((p (point))
(q (skip-chars-forward " "))
(x (progn (skip-chars-backward " ")(bolp))))
(if x
(remove-text-properties p (+ p q) '(display)))))))
[/lisp]
问题:
1、每个空格都要处理,因此速度可能慢一点
2、修改后会造成混乱,因为缩进线不是固定位置的,依赖上级缩进。
indent-column-list 只保存当前行操作所需要的位置,而全部保存的话又有点夸张……这个还得好好研究下
……所以,其实这部分还不能正常工作
头像
Fermat618
帖子: 728
注册时间: 2008-12-28 16:01

Re: emacs 缩进提示线

#15

帖子 Fermat618 » 2012-01-17 15:35

kardinal 写了:lisp 的缩进并不是固定步长,比如多数语言每级缩进4个或者8个空格之类……
这也是 lisp 难于阅读的一个原因吧(其实固定缩进的话,括号多点顶多呕吐,还不至于头晕)
如果按照普通的标准,固定每几列显示一条缩进线,对于 lisp 来说意义不大,因此……
看图
问题:
1、每个空格都要处理,因此速度可能慢一点
2、修改后会造成混乱,因为缩进线不是固定位置的,依赖上级缩进。
indent-column-list 只保存当前行操作所需要的位置,而全部保存的话又有点夸张……这个还得好好研究下
……所以,其实这部分还不能正常工作
这个大赞,要整就整好看点的。

另外,那个lambda都显示成λ了啊。
爱因斯坦会弹钢琴
爱因斯坦会拉小提琴
爱因斯坦会骑自行车
回复