77
77
(delete-char 2 )
78
78
(forward-char 2 ))))
79
79
80
- (defun sp-latex-point-after-backslash (id action _context )
81
- " Return t if point follows a backslash, nil otherwise.
82
- This predicate is only tested on \" insert\" action.
80
+ (defun sp-number-of-backslashes-before-point ()
81
+ (let ((p (point )))
82
+ (while (and (> p 0 ) (equal (char-before p) ?\\ ))
83
+ (setq p (- p 1 )))
84
+ (- (point ) p)))
85
+
86
+ (defun sp--latex-backslash-skip-match (ms mb _me )
87
+ " Skips a match if preceeded by uneven number of backslashes."
88
+ (and ms
89
+ (save-excursion
90
+ (goto-char mb)
91
+ (not (evenp (sp-number-of-backslashes-before-point))))))
92
+
93
+ (defun sp-latex-point-after-backslash (id action context )
94
+ " Return t if point follows an uneven number of backslashes (a
95
+ double backslash is a newline; we'd like to ignore those), nil
96
+ otherwise. This predicate is only tested on \" insert\" action.
83
97
ID, ACTION, CONTEXT."
84
98
(when (eq action 'insert )
85
- (let ((trigger (sp-get-pair id :trigger )))
86
- (looking-back (concat " \\\\ " (regexp-quote (if trigger trigger id))) nil ))))
99
+ (let* ((trigger (sp-get-pair id :trigger ))
100
+ (start (- (point ) (length (if trigger trigger id)))))
101
+ (when (> start 1 )
102
+ (save-excursion
103
+ (goto-char start)
104
+ (not (evenp (sp-number-of-backslashes-before-point))))))))
87
105
88
106
(add-to-list 'sp-navigate-skip-match
89
- '((tex-mode plain-tex-mode latex-mode) . sp--backslash-skip-match))
107
+ '((tex-mode plain-tex-mode latex-mode) . sp--latex- backslash-skip-match))
90
108
91
109
(sp-with-modes '(
92
110
tex-mode
@@ -100,7 +118,8 @@ ID, ACTION, CONTEXT."
100
118
:unless '(sp-latex-point-after-backslash))
101
119
; ; math modes, yay. The :actions are provided automatically if
102
120
; ; these pairs do not have global definitions.
103
- (sp-local-pair " $" " $" )
121
+ (sp-local-pair " $" " $"
122
+ :unless '(sp-latex-point-after-backslash))
104
123
(sp-local-pair " \\ [" " \\ ]"
105
124
:unless '(sp-latex-point-after-backslash))
106
125
@@ -118,60 +137,101 @@ ID, ACTION, CONTEXT."
118
137
:post-handlers '(sp-latex-skip-double-quote))
119
138
120
139
; ; add the prefix function sticking to {} pair
121
- (sp-local-pair " {" nil :prefix " \\\\\\ (\\ sw\\ |\\ s_\\ )*" )
140
+ (sp-local-pair " {" " }"
141
+ :prefix " \\\\\\ (\\ sw\\ |\\ s_\\ )*"
142
+ :unless '(sp-latex-point-after-backslash))
122
143
123
144
; ; do not add more space when slurping
124
- (sp-local-pair " {" " }" )
125
- (sp-local-pair " (" " )" )
126
- (sp-local-pair " [" " ]" )
145
+ (sp-local-pair " \\ {" " \\ }"
146
+ :unless '(sp-latex-point-after-backslash))
147
+ (sp-local-pair " [" " ]"
148
+ :unless '(sp-latex-point-after-backslash))
149
+ (sp-local-pair " (" " )"
150
+ :unless '(sp-latex-point-after-backslash))
151
+ (sp-local-pair " \\ (" " \\ )"
152
+ :unless '(sp-latex-point-after-backslash))
127
153
128
154
; ; pairs for big brackets. Needs more research on what pairs are
129
155
; ; useful to add here. Post suggestions if you know some.
130
156
(sp-local-pair " \\ left(" " \\ right)"
131
157
:trigger " \\ l("
132
158
:when '(sp-in-math-p)
159
+ :unless '(sp-latex-point-after-backslash)
133
160
:post-handlers '(sp-latex-insert-spaces-inside-pair))
134
161
(sp-local-pair " \\ left[" " \\ right]"
135
162
:trigger " \\ l["
136
163
:when '(sp-in-math-p)
164
+ :unless '(sp-latex-point-after-backslash)
137
165
:post-handlers '(sp-latex-insert-spaces-inside-pair))
138
166
(sp-local-pair " \\ left\\ {" " \\ right\\ }"
139
167
:trigger " \\ l{"
140
168
:when '(sp-in-math-p)
169
+ :unless '(sp-latex-point-after-backslash)
141
170
:post-handlers '(sp-latex-insert-spaces-inside-pair))
142
171
(sp-local-pair " \\ left|" " \\ right|"
143
172
:trigger " \\ l|"
144
173
:when '(sp-in-math-p)
174
+ :unless '(sp-latex-point-after-backslash)
145
175
:post-handlers '(sp-latex-insert-spaces-inside-pair))
146
176
(sp-local-pair " \\ bigl(" " \\ bigr)"
177
+ :when '(sp-in-math-p)
178
+ :unless '(sp-latex-point-after-backslash)
147
179
:post-handlers '(sp-latex-insert-spaces-inside-pair))
148
180
(sp-local-pair " \\ biggl(" " \\ biggr)"
181
+ :when '(sp-in-math-p)
182
+ :unless '(sp-latex-point-after-backslash)
149
183
:post-handlers '(sp-latex-insert-spaces-inside-pair))
150
184
(sp-local-pair " \\ Bigl(" " \\ Bigr)"
185
+ :when '(sp-in-math-p)
186
+ :unless '(sp-latex-point-after-backslash)
151
187
:post-handlers '(sp-latex-insert-spaces-inside-pair))
152
188
(sp-local-pair " \\ Biggl(" " \\ Biggr)"
189
+ :when '(sp-in-math-p)
190
+ :unless '(sp-latex-point-after-backslash)
153
191
:post-handlers '(sp-latex-insert-spaces-inside-pair))
154
192
(sp-local-pair " \\ bigl[" " \\ bigr]"
193
+ :when '(sp-in-math-p)
194
+ :unless '(sp-latex-point-after-backslash)
155
195
:post-handlers '(sp-latex-insert-spaces-inside-pair))
156
196
(sp-local-pair " \\ biggl[" " \\ biggr]"
197
+ :when '(sp-in-math-p)
198
+ :unless '(sp-latex-point-after-backslash)
157
199
:post-handlers '(sp-latex-insert-spaces-inside-pair))
158
200
(sp-local-pair " \\ Bigl[" " \\ Bigr]"
201
+ :when '(sp-in-math-p)
202
+ :unless '(sp-latex-point-after-backslash)
159
203
:post-handlers '(sp-latex-insert-spaces-inside-pair))
160
204
(sp-local-pair " \\ Biggl[" " \\ Biggr]"
205
+ :when '(sp-in-math-p)
206
+ :unless '(sp-latex-point-after-backslash)
161
207
:post-handlers '(sp-latex-insert-spaces-inside-pair))
162
208
(sp-local-pair " \\ bigl\\ {" " \\ bigr\\ }"
209
+ :when '(sp-in-math-p)
210
+ :unless '(sp-latex-point-after-backslash)
163
211
:post-handlers '(sp-latex-insert-spaces-inside-pair))
164
212
(sp-local-pair " \\ biggl\\ {" " \\ biggr\\ }"
213
+ :when '(sp-in-math-p)
214
+ :unless '(sp-latex-point-after-backslash)
165
215
:post-handlers '(sp-latex-insert-spaces-inside-pair))
166
216
(sp-local-pair " \\ Bigl\\ {" " \\ Bigr\\ }"
217
+ :when '(sp-in-math-p)
218
+ :unless '(sp-latex-point-after-backslash)
167
219
:post-handlers '(sp-latex-insert-spaces-inside-pair))
168
220
(sp-local-pair " \\ Biggl\\ {" " \\ Biggr\\ }"
221
+ :when '(sp-in-math-p)
222
+ :unless '(sp-latex-point-after-backslash)
169
223
:post-handlers '(sp-latex-insert-spaces-inside-pair))
170
224
(sp-local-pair " \\ lfloor" " \\ rfloor"
225
+ :when '(sp-in-math-p)
226
+ :unless '(sp-latex-point-after-backslash)
171
227
:post-handlers '(sp-latex-insert-spaces-inside-pair))
172
228
(sp-local-pair " \\ lceil" " \\ rceil"
229
+ :when '(sp-in-math-p)
230
+ :unless '(sp-latex-point-after-backslash)
173
231
:post-handlers '(sp-latex-insert-spaces-inside-pair))
174
232
(sp-local-pair " \\ langle" " \\ rangle"
233
+ :when '(sp-in-math-p)
234
+ :unless '(sp-latex-point-after-backslash)
175
235
:post-handlers '(sp-latex-insert-spaces-inside-pair))
176
236
(sp-local-pair " \\ lVert" " \\ rVert"
177
237
:when '(sp-in-math-p)
@@ -181,9 +241,8 @@ ID, ACTION, CONTEXT."
181
241
:when '(sp-in-math-p)
182
242
:trigger " \\ lvert"
183
243
:post-handlers '(sp-latex-insert-spaces-inside-pair))
184
-
244
+
185
245
; ; some common wrappings
186
- (sp-local-tag " \" " " ``" " ''" :actions '(wrap))
187
246
(sp-local-tag " \\ b" " \\ begin{_}" " \\ end{_}" )
188
247
(sp-local-tag " bi" " \\ begin{itemize}" " \\ end{itemize}" )
189
248
(sp-local-tag " be" " \\ begin{enumerate}" " \\ end{enumerate}" ))
0 commit comments