我想要实现行尾是;就直接跳转下一行,如果不是;就添加;再跳转。 目前实现了添加并跳转,但是判断逻辑中不知道怎么获取当前行末尾字符并和;比较。apropos找了char 和 end line 相关的方法都没有找到,google也没有发现。请大神回一波谢谢。
(string-match ";\[\[:space:\]\]*$" (thing-at-point 'line t))
查的时候要会分解问题,先查 Emacs get current line content' 再查
Emacs regex match string`
2 个赞
这个做法的问题是 ;
后面有空格就出事了
谢谢,我开始的思路是找到当前行的末尾字符,所以我通过 line end 找到了 line-end-position,所以我想判断他的话应该有个根据position返回当前字符的方法,这样就可以比较了,所以我猜有这样一个根据位置返回的char的方法,然后我 M-x char,使用的counsel找了一圈木有~
谢谢,很好的解决了我的问题。另外请教一下,我使用的counsel + company ,M-x 并没有 string-match,但是 apropos中却有找到,不明原因。
M-x 找到的都是 interactive 函数。aprops 查找的是所有函数。
1 个赞
可以试试用正则表达式
曾经实现过这样一个功能 可以参考
;; 在当前行任何位置输入分号都在行尾添加分号,除非本行有for 这个关键字,
;; 如果行尾已经有分号则删除行尾的分号,将其插入到当前位置,就是说输入两次分号则不在行尾插入而是像正常情况一样.
;;;###autoload
(defun vmacs-append-semicolon-at-eol(&optional arg)
(interactive "*p")
(let* ( ( init_position (point))
(b (line-beginning-position))
(e (line-end-position))
(line_str (buffer-substring b e))
(semicolon_end_of_line (string-match ";[ \t]*$" line_str ))
)
(if semicolon_end_of_line ;;;;如果行尾已经有分号,则删除行尾的分号,并在当前位置输入分号;;;;;;
(progn
(save-excursion
(goto-char (+ semicolon_end_of_line b))
(delete-char 1) )
(insert ";") )
;;在整行内容中搜索有没有关键字for的存在,或者当前位置已经是行尾,直接插入分号
(if (or (string-match "^[ \t]*$" (buffer-substring init_position e))
(string-match "\\bfor\\b" line_str))
(insert ";")
(save-excursion ;;如果搜索不到 for 则在行尾插入分号;
(end-of-line)
(delete-trailing-whitespace)
(insert ";")
)))))
1 个赞
你要找的是char-after函数,另外函数和命令需要区分,M-x出来的是命令
也可以试试这个: