注册 登录
编程论坛 Linux教室

【久受尊名 不详】比较智能的处理硬换行的emacs lisp代码

zklhp 发布于 2013-01-15 11:54, 2410 次点击
;*****************************************************************************************************************
;作者:zklhp
;Email:zklhp@
;QQ:493165744
;2013.1.14
;转载请保持完整
;*****************************************************************************************************************

写得比较水啦

程序代码:

(defun make-a-long-sentence ()
  "make a long sentence and also work on region"
  (interactive)
  (if (region-active-p)
      (progn    ; there is a text selection
    (let (str pt)
      (while (< (point) (region-end))
        (progn
          (delete-indentation 1)        ;一个现成函数 但要处理连字符
          (backward-char)
          (setq str (buffer-substring (setq pt (point)) (1+ pt)))
          (if (string-equal str "-")
          (delete-char 2)
        (forward-char)
        )
          )
        )
      )
    )
    )
  (progn
    (let (str pt)
      (delete-indentation 1)        ;一个现成函数 但要处理连字符
      (backward-char)
      (setq str (buffer-substring (setq pt (point)) (1+ pt)))
      (if (string-equal str "-")
      (delete-char 2)
    (forward-char)
    )
      )
    )
  )

;; C-;
(global-set-key [67108923] (quote make-a-long-sentence))


这个实现了从

this
is
a hard-war-
ped



this is a hard-warped

的一键转换 而且加了处理选区(region)的功能

程序代码:

(defun dwim-make-a-long-sentence ()
  "make a long sentence and also work on region"
  (interactive)
  (if (region-active-p)
      (progn    ; there is a text selection
    (save-restriction
      (narrow-to-region (region-beginning) (region-end))
      (goto-char (point-min))
      (while (search-forward "\n" nil t) (replace-match "" nil t))
      )
    )
    (progn
      (end-of-line)
      (delete-char 1)
      )
    )
  )

;; C-'
(global-set-key [67108903] (quote dwim-make-a-long-sentence))

;; C-M-;
(global-set-key [201326651] (quote dwim-make-a-long-sentence))


这个实现的是不加空格和删除连字符的版本 主要用于中文 例子

这句话

人为
分开了
好讨厌呀



这句话被人为分开了好讨厌呀

进步之处也是能处理选区

效率大大提高了诶 Emacs的无限可定制性真好

但有一个 要是能自动判断哪些是截断的就好了 不过我感觉实现有困难。。

显摆一下 顺便发今年的第一个有点技术的帖子。。



[ 本帖最后由 zklhp 于 2013-1-15 13:00 编辑 ]
19 回复
#2
yaobao2013-01-15 11:59
专程路过
#3
azzbcc2013-01-15 12:04
专业蹭分
#4
tlliqi2013-01-15 12:39
专程蹭分
#5
wp2319572013-01-15 13:22
太隐蔽了   很难找啊
#6
madfrogme2013-01-15 14:53
z版把emacs玩的出神入化的时候有没有感到曲高和寡的悲凉
#7
zklhp2013-01-15 15:24
以下是引用madfrogme在2013-1-15 14:53:57的发言:

z版把emacs玩的出神入化的时候有没有感到曲高和寡的悲凉

【曲高和寡】这四个字 等什么时候我能去emacs的开发者邮件列表谈笑风生再说罢
#8
信箱有效2013-01-15 16:00
切分
#9
Ayiis2013-01-15 20:29
对俄
#10
yaobao2013-01-16 12:13
再次专程路过,催促结贴
#11
阿鞠尼2013-01-16 12:35
来来来
#12
Artless2013-01-16 12:37
专程蹭分
#13
hu9jj2013-01-16 13:11
楼主引我入此,何不散分与我。
#14
pangding2013-01-22 11:13
学习了。


顺带提一下 vim 里的实现方法。
  由于 vim 里有 J 和 gJ 两个指令,连接行已经十分方便了。(助记符是 join)
  它们的区别是 J 连接行后,第一行行末和第二行行首的空格全部会删掉只保留一个。但有一些例外,比如如果第二行行首是标点符号,就不加空格了。如果第一行行末是句子结束用的标点,比如是 ., !, ? 之类的会加两个空格。
  gJ 则是连接一律删除所有空格。
  有些选项可以改变 J 的行为:置位 'cpoptions'('cpo') 中的 j 可以让 J 只在 . 后加两个空格(即是说 !, ? 之类加一个)。关闭 'joinspaces'('js') 这个选项(默认是开启的),可以让 J 的行为最多只加一个空格。置位 'formatoptions'('fo') 中的 M 可以让 J 智能判断,当处理多字节的字符时,比如中文、日文、俄文,一律不加空格。而处理单字节字符时,比如英文、法文,行为不变。

可以看出 vim 自带的功能也不能处理连字符。所以要想完成 z版 的工作也得自己写函数。先把行连接好,再把变成 '- ' 的东西删掉就行了。
function Join() range
    exe a:firstline . ',' . a:lastline . 'j'
    s/- //ge
endfunction

在某些情况下,比如文中自带了 '- ' 的情况,这样处理效果和 z版 的会有些区别。虽然这种字符是不合文法的,但也可以算是个 bug 吧。
另一方面,有的时候折可能会在连字符上出现。比如 a 2-year-old baby 这样的,即使在 year- 后面折行了,连接回来也不能删去 '-'。这种情况我和 z版 的小程序都不能处理。


[ 本帖最后由 pangding 于 2013-1-22 11:16 编辑 ]
#15
zklhp2013-01-22 11:47
以下是引用pangding在2013-1-22 11:13:47的发言:

学习了。


顺带提一下 vim 里的实现方法。
  由于 vim 里有 J 和 gJ 两个指令,连接行已经十分方便了。(助记符是 join)
  它们的区别是 J 连接行后,第一行行末和第二行行首的空格全部会删掉只保留一个。但有一些例外,比如如果第二行行首是标点符号,就不加空格了。如果第一行行末是句子结束用的标点,比如是 ., !, ? 之类的会加两个空格。
  gJ 则是连接一律删除所有空格。
  有些选项可以改变 J 的行为:置位 'cpoptions'('cpo') 中的 j 可以让 J 只在 . 后加两个空格(即是说 !, ? 之类加一个)。关闭 'joinspaces'('js') 这个选项(默认是开启的),可以让 J 的行为最多只加一个空格。置位 'formatoptions'('fo') 中的 M 可以让 J 智能判断,当处理多字节的字符时,比如中文、日文、俄文,一律不加空格。而处理单字节字符时,比如英文、法文,行为不变。

可以看出 vim 自带的功能也不能处理连字符。所以要想完成 z版 的工作也得自己写函数。先把行连接好,再把变成 '- ' 的东西删掉就行了。
function Join() range
    exe a:firstline . ',' . a:lastline . 'j'
    s/- //ge
endfunction
在某些情况下,比如文中自带了 '- ' 的情况,这样处理效果和 z版 的会有些区别。虽然这种字符是不合文法的,但也可以算是个 bug 吧。
另一方面,有的时候折可能会在连字符上出现。比如 a 2-year-old baby 这样的,即使在 year- 后面折行了,连接回来也不能删去 '-'。这种情况我和 z版 的小程序都不能处理。

Emacs默认也有快捷键 但不好摁而且用法挺奇怪的。。
#16
pangding2013-01-22 11:58
以下是引用zklhp在2013-1-22 11:47:38的发言:


Emacs默认也有快捷键 但不好摁而且用法挺奇怪的。。
哦,我只知道 M-^
#17
zklhp2013-01-22 12:07
以下是引用pangding在2013-1-22 11:58:23的发言:

哦,我只知道 M-^
我也是后来知道这个的 这个是下面一行往上面去 当然也可以用参数让它连下面一行 但麻烦了

膜拜一下pangding版主深厚的vim功底 祝您感情生活顺利 你貌似比我大罢 也该成家立业了 嗯 祝你成功。。
#18
pangding2013-01-22 12:35
以下是引用zklhp在2013-1-22 12:07:24的发言:

我也是后来知道这个的 这个是下面一行往上面去 当然也可以用参数让它连下面一行 但麻烦了

膜拜一下pangding版主深厚的vim功底 祝您感情生活顺利 你貌似比我大罢 也该成家立业了 嗯 祝你成功。。

谢谢你的祝福。

我 89 的,就比你大一岁吧。着急可以成家了,不着急也可以再拖拖。
难得我和我的女朋友特别投缘,找到真爱不容易呀。不过今年是我本命年,又是寡妇年,家长说结婚不好。也许等明年了,今年应该会订婚吧。
#19
zklhp2013-01-22 12:52
以下是引用pangding在2013-1-22 12:35:01的发言:


谢谢你的祝福。

我 89 的,就比你大一岁吧。着急可以成家了,不着急也可以再拖拖。
难得我和我的女朋友特别投缘,找到真爱不容易呀。不过今年是我本命年,又是寡妇年,家长说结婚不好。也许等明年了,今年应该会订婚吧。

记得到时候散分庆祝哦
#20
chuankay2013-04-05 15:48
搜索lisp关键词来着
1