emacs 缩进提示线
-
- 帖子: 750
- 注册时间: 2006-03-19 11:39
emacs 缩进提示线
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 实现的,口味比较重的同学可以试试 ,主要问题是删除提示线所在的空格后,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]
直接设置文本属性,可能即美观又省心,研究了半天,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 实现的,口味比较重的同学可以试试 ,主要问题是删除提示线所在的空格后,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]
直接设置文本属性,可能即美观又省心,研究了半天,emacs 的表现十分淡定,改天再说
- Fermat618
- 帖子: 728
- 注册时间: 2008-12-28 16:01
-
- 帖子: 750
- 注册时间: 2006-03-19 11:39
Re: emacs 缩进提示线
这个估计相当的难,图形界面和字符界面保持兼容是vim、emacs之流的“潜规则”Fermat618 写了:缩进线,粗了就难看了。vim估计是没没法搞出好看的缩进线了,不知道X下的Emacs能不能搞出那种细线来。
如果只是想细一点的话,可以画竖虚线并且颜色浅一点(主要问题是行距不为0时,这些竖线连不到一起;即便行距为0,有些字体依然连不到一起)
只是一个试验而已,没必要搞的这么正式pocoyo 写了:应该给个 screencast 比较好看一点 或者截图
非得让俺献丑,那就现一个吧
-
- 帖子: 750
- 注册时间: 2006-03-19 11:39
Re: emacs 缩进提示线
ok,可以插入图片来解决这个问题,有图有真相 对于插入图片不太熟悉,临时拷了一段代码……所以这种方案暂时还不能正常工作,有时间调整调整Fermat618 写了:缩进线,粗了就难看了。vim估计是没没法搞出好看的缩进线了,不知道X下的Emacs能不能搞出那种细线来。
- fanhe
- 帖子: 2357
- 注册时间: 2007-03-24 23:45
Re: emacs 缩进提示线
真拉风
vim 怎么实现?估计就 vim 现在的显示机制是实现不了的了,一次高亮只能一列
vim 怎么实现?估计就 vim 现在的显示机制是实现不了的了,一次高亮只能一列
- Ubuntu与Linux
- 帖子: 1211
- 注册时间: 2010-06-09 19:57
-
- 帖子: 243
- 注册时间: 2010-09-30 21:54
Re: emacs 缩进提示线
字符那个看起来挺拉风的= =
-
- 帖子: 750
- 注册时间: 2006-03-19 11:39
Re: emacs 缩进提示线
vim 的差不多这样
见http://hi.baidu.com/wsjlzu/blog/item/1e ... 8f834.html
http://www.douban.com/group/topic/8548934/
这个讨论里面还有另一种方案,感觉比较靠谱
不过我都没有试过
看过一个图片,每条缩进线还能用不同颜色显示……当然 emacs 里面用不同颜色显示也不难,不过没太大意思
代码: 全选
set list
set listchars=tab:\|\
http://www.douban.com/group/topic/8548934/
这个讨论里面还有另一种方案,感觉比较靠谱
不过我都没有试过
看过一个图片,每条缩进线还能用不同颜色显示……当然 emacs 里面用不同颜色显示也不难,不过没太大意思
-
- 帖子: 750
- 注册时间: 2006-03-19 11:39
Re: emacs 缩进提示线
xpm 的版本基本可用了
前面的 setq dot-vline-xpm 部分相当的纠结……
它的作用是生成一个 xpm 格式的图片作为变量 dot-vline-xpm 的内容
最后在三个参数 10 22 "#ADA5C6" 分别指定这个图片的宽、高以及虚线的颜色
当然宽和高应该是自动判断的,但是目前我还不知道怎么弄……所以,自己调整下吧
后面的那个函数和前面几个例子差不多,没什么新意就不介绍了
需要注意的是:当从前往后删除空格时,后面的缩进线会有点走样,重新缩进一次就可以了。
图片基本和第三个差不多……算了,作为一个细心的人,我还是再截一次图吧 [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]
前面的 setq dot-vline-xpm 部分相当的纠结……
它的作用是生成一个 xpm 格式的图片作为变量 dot-vline-xpm 的内容
最后在三个参数 10 22 "#ADA5C6" 分别指定这个图片的宽、高以及虚线的颜色
当然宽和高应该是自动判断的,但是目前我还不知道怎么弄……所以,自己调整下吧
后面的那个函数和前面几个例子差不多,没什么新意就不介绍了
需要注意的是:当从前往后删除空格时,后面的缩进线会有点走样,重新缩进一次就可以了。
图片基本和第三个差不多……算了,作为一个细心的人,我还是再截一次图吧 [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 缩进提示线
空行冒失有点问题。
-
- 帖子: 750
- 注册时间: 2006-03-19 11:39
Re: emacs 缩进提示线
VIM???这个真不会哈
另外“空行”是指颜色冲突的那一行?其它地方没有发现有什么异常
通过行号处及“s”的颜色可以推断,下划线与字符冒失不能设置两种颜色
看这样子似乎是先给竖线上色,再给橫线上色,再给关键词上色
想办法调整一下顺序吧?
或者,设置该处空白字符的背景比较好?
另外“空行”是指颜色冲突的那一行?其它地方没有发现有什么异常
通过行号处及“s”的颜色可以推断,下划线与字符冒失不能设置两种颜色
看这样子似乎是先给竖线上色,再给橫线上色,再给关键词上色
想办法调整一下顺序吧?
或者,设置该处空白字符的背景比较好?
-
- 帖子: 750
- 注册时间: 2006-03-19 11:39
Re: emacs 缩进提示线
编辑下,看看会不会顶上去
->>-----2012-02-05--7--23:36:02-------->
很好,偷偷在这里存点东西
->>-----------------------------------2012-02-05--7--23:37:11-------------------------------------->
调整下分隔线
->>-----------------------------------2012-02-05--7--23:39: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 缩进提示线
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的颜色自己设置吧,我是用插件自动生成的。
缺点:
1. 相对‘|’显得太粗
2. 空行不会显示。
[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. 空行不会显示。
-
- 帖子: 750
- 注册时间: 2006-03-19 11:39
Re: emacs 缩进提示线
lisp 的缩进并不是固定步长,比如多数语言每级缩进4个或者8个空格之类……
这也是 lisp 难于阅读的一个原因吧(其实固定缩进的话,括号多点顶多呕吐,还不至于头晕)
如果按照普通的标准,固定每几列显示一条缩进线,对于 lisp 来说意义不大,因此……
看图 [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 只保存当前行操作所需要的位置,而全部保存的话又有点夸张……这个还得好好研究下
……所以,其实这部分还不能正常工作
这也是 lisp 难于阅读的一个原因吧(其实固定缩进的话,括号多点顶多呕吐,还不至于头晕)
如果按照普通的标准,固定每几列显示一条缩进线,对于 lisp 来说意义不大,因此……
看图 [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 缩进提示线
这个大赞,要整就整好看点的。kardinal 写了:lisp 的缩进并不是固定步长,比如多数语言每级缩进4个或者8个空格之类……
这也是 lisp 难于阅读的一个原因吧(其实固定缩进的话,括号多点顶多呕吐,还不至于头晕)
如果按照普通的标准,固定每几列显示一条缩进线,对于 lisp 来说意义不大,因此……
看图
问题:
1、每个空格都要处理,因此速度可能慢一点
2、修改后会造成混乱,因为缩进线不是固定位置的,依赖上级缩进。
indent-column-list 只保存当前行操作所需要的位置,而全部保存的话又有点夸张……这个还得好好研究下
……所以,其实这部分还不能正常工作
另外,那个lambda都显示成λ了啊。
爱因斯坦会弹钢琴
爱因斯坦会拉小提琴
爱因斯坦会骑自行车
爱因斯坦会拉小提琴
爱因斯坦会骑自行车