注册 登录
编程论坛 Linux教室

如何在 emacs 里完成 fmt, indent 这些常见工具的工作?

pangding 发布于 2012-10-27 11:08, 1891 次点击
详见这个帖子:
https://bbs.bccn.net/viewthread.php?tid=383354&page=2#pid2172949
13 回复
#2
madfrogme2012-10-27 12:52
多谢版主,搜索了一下vim

:set number

:set tw=40

:gq20<向下箭头>

就可以把从光标开始的20行合并成每行40个字符了
#3
zklhp2012-10-27 12:57
琢磨了一下 emacs要想比现成的工具做的好很难

indent的话 比其他编辑器好的一点就是默认的就相当于【智能缩进】了 不过默认的也就这个水平了 虽然可以设置 但有够麻烦的 一般是根据一段代码猜测缩进风格按照这个风格来 我也就用到这个水平了

至于后面一个 没明白咋回事 不乱说了


[ 本帖最后由 zklhp 于 2012-10-27 17:31 编辑 ]
#4
pangding2012-10-27 17:13
以下是引用madfrogme在2012-10-27 12:52:42的发言:

多谢版主,搜索了一下vim  
 
:set number
 
:set tw=40
 
:gq20<向下箭头>
 
就可以把从光标开始的20行合并成每行40个字符了

gq20j 也行吧。如果是想排版某几行的话,可以用 V 先选中,然后再 gq。比 20j 可操作性强,因为选中的时候,用 jk 可以看见选中的范围。

gq 后面可以接各种移动命令,比如 gqG 就可以从当前位置排版到文件末,从而 gggqG 是重排全文。
或者 vip 先选中一个段落,再 gq 可以重排当前段落。当然也可以用 {gq} 来实现段落重排。看个人习惯了。

文本对象的概念要深刻理解,然后在实践中多多运用加深体会。之后 vim 才会发挥神力,有人说 vi 这的设计哲学鼓励人们用神经反射进行操作(而不是用大脑思考最佳操作手法)。
#5
pangding2012-10-27 17:17
我其实已经在连接过去的那个帖子里回应你了。
听说了一个新命令后,要想到 :h gq。里面提了 textwidth 这个选项对 gq 的影响。

我在回应你的帖子里还提了批量操作文件。
其中一种方法是用 argdo 这个命令,你 :h argdo,下面还给举了一个例子。不过如果你对 vim 的参数列表还没概念,建议先看看 :h usr_07,或者去网上搜索一下资料。argdo 用好了之后,有时会发现办事效率有显著的提高。


[ 本帖最后由 pangding 于 2012-10-27 17:29 编辑 ]
#6
madfrogme2012-10-27 17:45
我先来看看 usr_07 ,非常感謝,
#7
pangding2012-10-28 06:49
以下是引用zklhp在2012-10-27 12:57:32的发言:

琢磨了一下 emacs要想比现成的工具做的好很难

indent的话 比其他编辑器好的一点就是默认的就相当于【智能缩进】了 不过默认的也就这个水平了 虽然可以设置 但有够麻烦的 一般是根据一段代码猜测缩进风格按照这个风格来 我也就用到这个水平了

至于后面一个 没明白咋回事 不乱说了

vim 我也是就用默认的,因为我要求不是很高。现成的工具都是专门做单一任务的,相对的在灵活性和功能上应该都比较出色。编辑器比不上也很正常。

vim 虽然自带了很多功能,但是如果觉得默认的行为“智能”不足,或是配置困难的话,vim 的一个好处是不强制你使用内部功能,而是可以调用你相对熟悉的外部工具。比如 fmt, indent 这样的工具的,vim 就会直接调用。具体方法是设置 formatprg 和 equalprg。一旦这两个选项不为空(默认为空),使用 gq 和 = 这两个命令的时候,vim 会自动调用外部程序处理文本,然后再用处理结果替换原来的内容(这种行为一般称作过滤)。
使用外部程序的缺点是可能会使 vim 的移植性下降,如果你在 windows 下用 vim,而又不会把相应的工具移植或配置过去,可能就比较麻烦了。


[ 本帖最后由 pangding 于 2012-10-28 06:51 编辑 ]
#8
pangding2012-10-28 06:57
z版 说的后面一个问题是指哪个?批量处理?
emacs 不是有脚本模式吗,就是假如我写好了一个处理某类文本的脚本,当然可以用 emacs 把这些脚本批量应用在一批文件上了。我都用过 emacs 的这个功能,不过用的不频,记不住,每次用之前还得查查手册。我用 vim 其实批量处理文本最多的还是转码,比如把其它编码转成 utf-8,或者把 dos 型回车转成 unix 回车。emacs 里好像是 C-x RET ... 这样的命令吧。


[ 本帖最后由 pangding 于 2012-10-28 06:58 编辑 ]
#9
zklhp2012-10-28 11:57
以下是引用pangding在2012-10-28 06:57:05的发言:

z版 说的后面一个问题是指哪个?批量处理?
emacs 不是有脚本模式吗,就是假如我写好了一个处理某类文本的脚本,当然可以用 emacs 把这些脚本批量应用在一批文件上了。我都用过 emacs 的这个功能,不过用的不频,记不住,每次用之前还得查查手册。我用 vim 其实批量处理文本最多的还是转码,比如把其它编码转成 utf-8,或者把 dos 型回车转成 unix 回车。emacs 里好像是 C-x RET ... 这样的命令吧。

我说的后一个是fmt命令

录脚本我都是把打开文件等操作和脚本操作录一块 一执行 唰唰的就好了 很爽啊
#10
madfrogme2012-10-28 12:13
虚心学习两位vim, emacs神牛
#11
zklhp2012-10-28 12:22
我不过是个搬砖的 emacs这也就刚刚会用
#12
pangding2012-10-29 10:04
以下是引用zklhp在2012-10-28 11:57:09的发言:


我说的后一个是fmt命令

录脚本我都是把打开文件等操作和脚本操作录一块 一执行 唰唰的就好了 很爽啊

fmt 干的事类似 emacs 里的 auto-fill mode 吧。就是把行在指定宽度的地方加个回车。
是不是用 c-x f 设置一下宽度,然后用 C-x h 选中全文再执行一下 fill-region 就行了?
#13
zklhp2012-10-29 13:38
以下是引用pangding在2012-10-29 10:04:22的发言:


fmt 干的事类似 emacs 里的 auto-fill mode 吧。就是把行在指定宽度的地方加个回车。
是不是用 c-x f 设置一下宽度,然后用 C-x h 选中全文再执行一下 fill-region 就行了?

感觉上差不多 我不喜欢hard wrap 所以这个功能基本没用过
#14
pangding2012-10-29 15:45
以下是引用zklhp在2012-10-29 13:38:28的发言:


感觉上差不多 我不喜欢hard wrap 所以这个功能基本没用过

嗯。主要是老式编辑器根本就没有 wrap 的功能,长行相当于只能看见一半。所以才需要在一个不太宽的位置(一般都不能超过 75)硬回车。现在好像无所谓了。
1