Emacs-与语法跳过结合调试覆盖

法律家

我在寻求帮助,请调试我的test功能,以使黄色垂直线看起来与红色线完全相同我决定排除突出显示选项卡,因为它们的宽度为两(2)个字符,并且使垂直线像扭曲了一样。但是,在尝试排除的 tabs情况下,我丢失了紧靠右侧的任何文本的突出显示。我试图解决此问题的做法破坏了线和/或红线的功能

简而言之,线红线可以按预期工作,但是线断开了(在选项卡的最右边)-线应该看起来像红线一样

我的test函数存在的问题在于以下代码段:

(not (save-excursion (move-to-column my-col-b)
   (< 0 (skip-chars-forward "\t"))))

(not (save-excursion (move-to-column my-col-b)
    (> 0 (skip-chars-backward "\t")))))

以下功能用于创建缓冲区的图像,如下面的屏幕快照所示:

(defun test ()
(interactive)
  (let* (my-last-column
      my-o-beg-a my-o-end-a (my-col-a 3)
      my-o-beg-b my-o-end-b (my-col-b 28)
      my-o-beg-c my-o-end-c (my-col-c 29) )
    (generate-test-buffer)
    (goto-char (point-max))
    (while (re-search-backward "\n" (point-min) t)
      (setq my-last-column (current-column))
      (setq my-o-beg-a (progn (move-to-column my-col-a) (point)))
      (setq my-o-end-a (+ 1 my-o-beg-a))
      (setq my-o-beg-b (progn (move-to-column my-col-b) (point)))
      (setq my-o-end-b (+ 1 my-o-beg-b))
      (setq my-o-beg-c (progn (move-to-column my-col-c) (point)))
      (setq my-o-end-c (+ 1 my-o-beg-c))
      (when (and
          (< my-col-a my-last-column)
          (not (save-excursion (move-to-column my-col-a)
              (< 0 (skip-chars-forward "\t"))))
          (not (save-excursion (move-to-column my-col-a)
              (> 0 (skip-chars-backward "\t")))))
        (overlay-put (make-overlay my-o-beg-a my-o-end-a) 'face '(
          (background-color . "cyan")
          (foreground-color . "black") )))
      (when (and
          (< my-col-b my-last-column)
          (not (save-excursion (move-to-column my-col-b)
              (< 0 (skip-chars-forward "\t"))))
          (not (save-excursion (move-to-column my-col-b)
              (> 0 (skip-chars-backward "\t")))))
        (overlay-put (make-overlay my-o-beg-b my-o-end-b) 'face '(
          (background-color . "yellow")
          (foreground-color . "black") )))
      (when (and
          (< my-col-b my-last-column)
          (not (save-excursion (move-to-column my-col-c)
              (< 0 (skip-chars-forward "\t"))))
          (not (save-excursion (move-to-column my-col-c)
              (> 0 (skip-chars-backward "\t")))))
        (overlay-put (make-overlay my-o-beg-c my-o-end-c) 'face '(
          (background-color . "red")
          (foreground-color . "black") ))) )))

(defun generate-test-buffer ()
  (if (get-buffer "foo.el")
    (with-current-buffer "foo.el"
      (erase-buffer))
    (get-buffer-create "foo.el"))
  (switch-to-buffer (get-buffer "foo.el"))
  (setq whitespace-style '(face space-mark tab-mark newline-mark) )
  (setq indent-tabs-mode t)
  (setq tab-stop-list (number-sequence 4 200 4))
  (setq tab-width 4)
  (setq indent-line-function 'insert-tab)
  (whitespace-mode t)
  (insert ";;;;")
  (insert-tabs 1)
  (insert "(defun test ()\n;;;;")
  (insert-tabs 1)
  (insert "(interactive)\n;;;;")
  (insert-tabs 2)
  (insert "(let* (my-last-column\n;;;;")
  (insert-tabs 4)
  (insert "my-o-beg-a my-o-end-a (my-col-a 1)\n;;;;")
  (insert-tabs 4)
  (insert "my-o-beg-b my-o-end-b (my-col-b 11)\n;;;;")
  (insert-tabs 4)
  (insert "my-o-beg-c my-o-end-c (my-col-c 16) )\n;;;;")
  (insert-tabs 3)
  (insert "(generate-test-buffer)\n;;;;")
  (insert-tabs 3)
  (insert "(goto-char (point-max))\n;;;;")
  (insert-tabs 3)
  (insert "(while (re-search-backward \"\\n\" (point-min) t)\n;;;;")
  (insert-tabs 4)
  (insert "(setq my-last-column (current-column))\n;;;;")
  (insert-tabs 4)
  (insert "(setq my-o-beg-a (progn (move-to-column my-col-a) (point)))\n;;;;")
  (insert-tabs 4)
  (insert "(setq my-o-end-a (+ 1 my-o-beg-a))\n;;;;")
  (insert-tabs 4)
  (insert "(setq my-o-beg-b (progn (move-to-column my-col-b) (point)))\n;;;;")
  (insert-tabs 4)
  (insert "(setq my-o-end-b (+ 1 my-o-beg-b))\n;;;;")
  (insert-tabs 4)
  (insert "(setq my-o-beg-c (progn (move-to-column my-col-c) (point)))\n;;;;")
  (insert-tabs 4)
  (insert "(setq my-o-end-c (+ 1 my-o-beg-c))\n;;;;")
  (insert-tabs 4)
  (insert "(when (and\n;;;;")
  (insert-tabs 6)
  (insert "(< my-col-a my-last-column)\n;;;;")
  (insert-tabs 6)
  (insert "(not (save-excursion (move-to-column my-col-a)\n;;;;")
  (insert-tabs 7)
  (insert "(< 0 (skip-chars-forward \"\t\"))))\n;;;;")
  (insert-tabs 6)
  (insert "(not (save-excursion (move-to-column my-col-a)\n;;;;")
  (insert-tabs 7)
  (insert "(> 0 (skip-chars-backward \"\t\")))))\n;;;;")
  (insert-tabs 5)
  (insert "(overlay-put (make-overlay my-o-beg-a my-o-end-a) 'face '(\n;;;;")
  (insert-tabs 6)
  (insert "(background-color . \"cyan\")\n;;;;")
  (insert-tabs 6)
  (insert "(foreground-color . \"black\") )))\n;;;;")
  (insert-tabs 4)
  (insert "(when (and\n;;;;")
  (insert-tabs 6)
  (insert "(< my-col-b my-last-column)\n;;;;")
  (insert-tabs 7)
  (insert "(not (save-excursion (move-to-column my-col-b)\n;;;;")
  (insert-tabs 7)
  (insert "(< 0 (skip-chars-forward \"\t\"))))\n;;;;")
  (insert-tabs 6)
  (insert "(not (save-excursion (move-to-column my-col-b)\n;;;;")
  (insert-tabs 7)
  (insert "(> 0 (skip-chars-backward \"\t\")))))\n;;;;")
  (insert-tabs 5)
  (insert "(overlay-put (make-overlay my-o-beg-b my-o-end-b) 'face '(\n;;;;")
  (insert-tabs 6)
  (insert "(background-color . \"yellow\")\n;;;;")
  (insert-tabs 6)
  (insert "(foreground-color . \"black\") )))\n;;;;")
  (insert-tabs 4)
  (insert "(when (and\n;;;;")
  (insert-tabs 6)
  (insert "(< my-col-b my-last-column)\n;;;;")
  (insert-tabs 6)
  (insert "(not (save-excursion (move-to-column my-col-c)\n;;;;")
  (insert-tabs 7)
  (insert "(< 0 (skip-chars-forward \"\t\"))))\n;;;;")
  (insert-tabs 6)
  (insert "(not (save-excursion (move-to-column my-col-c)\n;;;;")
  (insert-tabs 7)
  (insert "(> 0 (skip-chars-backward \"\t\")))))\n;;;;")
  (insert-tabs 5)
  (insert "(overlay-put (make-overlay my-o-beg-c my-o-end-c) 'face '(\n;;;;")
  (insert-tabs 6)
  (insert "(background-color . \"red\")\n;;;;")
  (insert-tabs 6)
  (insert "(foreground-color . \"black\") ))) )))\n" ))

(defun insert-tabs (n)
;; http://stackoverflow.com/a/11830118/2112489
  "Inserts N number of tabs"
  (interactive "nNumber of tabs: ")
  (dotimes (i n)
    (indent-for-tab-command)))

例子
(来源:lawlist.com

法律家

2014年5月3日:初始答案-明显的可行解决方案。

  • 制表符的字符代码为9

  • 制表符的宽度等于一(1)point

  • A tab can be equal to one or more columns wide, depending upon the tab-width.

  • When dealing with tabs, determining the type of character that follows a particular column is problematic because . . . [to be filled in when I understand more].

  • When dealing with tabs, moving forward one (1) point and looking back is also problematic because . . . [to be filled in when I understand more].

工作的解决方案是将一(1)column前进,检查前面的字符代码-如果它仍然是一个字符代码9,那么就无法将覆盖(在那之前的列)。如果目标列已经在非制表符上,则向前移动一(1)column并向后看应该在逻辑上产生正确的结果。

(defun test ()
(interactive)
  (let* (my-last-column
      my-o-beg-a my-o-end-a (my-col-a 3)
      my-o-beg-b my-o-end-b (my-col-b 28)
      my-o-beg-c my-o-end-c (my-col-c 29) )
    (generate-test-buffer)
    (goto-char (point-max))
    (while (re-search-backward "\n" (point-min) t)
      (setq my-last-column (current-column))
      (setq my-o-beg-a (progn (move-to-column my-col-a) (point)))
      (setq my-o-end-a (+ 1 my-o-beg-a))
      (setq my-o-beg-b (progn (move-to-column my-col-b) (point)))
      (setq my-o-end-b (+ 1 my-o-beg-b))
      (setq my-o-beg-c (progn (move-to-column my-col-c) (point)))
      (setq my-o-end-c (+ 1 my-o-beg-c))
      (when (and
          (< my-col-a my-last-column)
          (not (progn (move-to-column (+ 1 my-col-a)) (eq (preceding-char) 9))))
        (overlay-put (make-overlay my-o-beg-a my-o-end-a) 'face '(
          (background-color . "cyan")
          (foreground-color . "black") )))
      (when (and
          (< my-col-b my-last-column)
          (not (progn (move-to-column (+ 1 my-col-b)) (eq (preceding-char) 9))))
        (overlay-put (make-overlay my-o-beg-b my-o-end-b) 'face '(
          (background-color . "yellow")
          (foreground-color . "black") )))
      (when (and
          (< my-col-b my-last-column)
          (not (progn (move-to-column (+ 1 my-col-c)) (eq (preceding-char) 9))))
        (overlay-put (make-overlay my-o-beg-c my-o-end-c) 'face '(
          (background-color . "red")
          (foreground-color . "black") ))) )))

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Emacs区域语法突出显示

来自分类Dev

如何使用emacs调试与Melpa的连接

来自分类Dev

emacs用回车符覆盖

来自分类Dev

覆盖Emacs库中的单个函数

来自分类Dev

永久覆盖Emacs主题的背景色

来自分类Dev

emacs用回车符覆盖

来自分类Dev

Emacs Elisp覆盖默认值

来自分类Dev

Emacs:非代码文件的语法突出显示

来自分类Dev

emacs为js更好地突出语法

来自分类Dev

主要模式的Lisp emacs regex语法

来自分类Dev

定义面孔以在Emacs中突出显示语法

来自分类Dev

Ubuntu Emacs“无效的读取语法:)”错误

来自分类Dev

Emacs24 Python大纲覆盖模式下的覆盖行为

来自分类Dev

Emacs24 Python大纲覆盖模式下的覆盖行为

来自分类Dev

在OSX Yosemite的Emacs中使用LLVM调试器

来自分类Dev

使用Emacs和GEBEN调试多文件PHP脚本

来自分类Dev

Emacs-如何删除覆盖(列表形式)

来自分类Dev

在Emacs中禁用软件包键绑定覆盖

来自分类Dev

Emacs中的多语言语法突出显示

来自分类Dev

具有Java语法突出显示功能的Emacs组织模式?

来自分类Dev

Emacs组织模式:如何使用NoWeb语法创建识字程序

来自分类Dev

如何在Emacs中定义整行注释语法?

来自分类Dev

在Emacs中显示当前缓冲区的语法表名称

来自分类Dev

在Emacs中为注释部分添加语法突出显示

来自分类Dev

emacs未选择coffeelint.json语法检查

来自分类Dev

如何更改颜色以在Emacs(GUI / Terminal)上突出显示语法?

来自分类Dev

Emacs行号

来自分类Dev

我将Emacs与Prelude结合使用,并希望重新/编写git-autocommit-mode

来自分类Dev

将Emacs与Paredit结合使用时,如何在Clojure表单中添加结尾括号?