aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/buffer.h
diff options
context:
space:
mode:
authorThiago de Arruda <tpadilha84@gmail.com>2015-03-05 18:07:09 -0300
committerThiago de Arruda <tpadilha84@gmail.com>2015-03-25 18:57:35 -0300
commit8b6b06c2e08ae3bfd5aaa5b920a521a03b42a2b3 (patch)
tree31a57766bdc53204f076299af1c2e1deacae398b /src/nvim/buffer.h
parent2b90aed8318e370eac4ab4fc601833c63ca87084 (diff)
downloadrneovim-8b6b06c2e08ae3bfd5aaa5b920a521a03b42a2b3.tar.gz
rneovim-8b6b06c2e08ae3bfd5aaa5b920a521a03b42a2b3.tar.bz2
rneovim-8b6b06c2e08ae3bfd5aaa5b920a521a03b42a2b3.zip
buffer: Add WITH_BUFFER macro to simplify global buffer modification
Most internal functions to modify buffers operate on the current buffer and require temporary switchs. This macro is a temporary workaround until a cleaner refactoring of the internal API is performed.
Diffstat (limited to 'src/nvim/buffer.h')
-rw-r--r--src/nvim/buffer.h41
1 files changed, 41 insertions, 0 deletions
diff --git a/src/nvim/buffer.h b/src/nvim/buffer.h
index a7f4feb342..49025d3925 100644
--- a/src/nvim/buffer.h
+++ b/src/nvim/buffer.h
@@ -1,6 +1,7 @@
#ifndef NVIM_BUFFER_H
#define NVIM_BUFFER_H
+#include "nvim/window.h"
#include "nvim/pos.h" // for linenr_T
#include "nvim/ex_cmds_defs.h" // for exarg_T
@@ -45,4 +46,44 @@ enum bfa_values {
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "buffer.h.generated.h"
#endif
+
+// Find a window that contains "buf" and switch to it.
+// If there is no such window, use the current window and change "curbuf".
+// Caller must initialize save_curbuf to NULL.
+// restore_win_for_buf() MUST be called later!
+static inline void switch_to_win_for_buf(buf_T *buf,
+ win_T **save_curwinp,
+ tabpage_T **save_curtabp,
+ buf_T **save_curbufp)
+{
+ win_T *wp;
+ tabpage_T *tp;
+
+ if (!find_win_for_buf(buf, &wp, &tp)
+ || switch_win(save_curwinp, save_curtabp, wp, tp, true) == FAIL)
+ switch_buffer(save_curbufp, buf);
+}
+
+static inline void restore_win_for_buf(win_T *save_curwin,
+ tabpage_T *save_curtab,
+ buf_T *save_curbuf)
+{
+ if (save_curbuf == NULL) {
+ restore_win(save_curwin, save_curtab, true);
+ } else {
+ restore_buffer(save_curbuf);
+ }
+}
+
+#define WITH_BUFFER(b, code) \
+ do { \
+ buf_T *save_curbuf = NULL; \
+ win_T *save_curwin = NULL; \
+ tabpage_T *save_curtab = NULL; \
+ switch_to_win_for_buf(b, &save_curwin, &save_curtab, &save_curbuf); \
+ code; \
+ restore_win_for_buf(save_curwin, save_curtab, save_curbuf); \
+ } while (0)
+
+
#endif // NVIM_BUFFER_H