如何判断行尾字符是否为;

我想要实现行尾是;就直接跳转下一行,如果不是;就添加;再跳转。 目前实现了添加并跳转,但是判断逻辑中不知道怎么获取当前行末尾字符并和;比较。apropos找了char 和 end line 相关的方法都没有找到,google也没有发现。请大神回一波谢谢。

(string-match ";\[\[:space:\]\]*$" (thing-at-point 'line t))

查的时候要会分解问题,先查 Emacs get current line content' 再查Emacs regex match string`

2 个赞

试试函数 char-beforeline-end-position

参考 Examining Text Near PointMotion by Text Lines

1 个赞

这个做法的问题是 ; 后面有空格就出事了

谢谢,我开始的思路是找到当前行的末尾字符,所以我通过 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出来的是命令

也可以试试这个: