I can't get this to work. How can I search the buffer of a tmux shell?
-
1What version of `tmux` (`tmux -V`)? I believe this was added in version 0.9. – Dennis Williamson Jan 09 '11 at 20:43
-
@Dennis it's 1.3-1 – NES Jan 09 '11 at 21:08
-
1Finding the version with `tmux -V` works only in later versions. In Ubuntu/Debian you can do: `dpkg -l | grep tmux` – Niels Bom Oct 04 '12 at 11:46
-
1I don't know why, but these answers don't work for me whereas `CTRL+B` `PgUp` `CTRL+B` `R` `my searchterm` works – lucidbrot Nov 11 '20 at 12:53
4 Answers
copy mode search
To search in the tmux history buffer for the current window, press Ctrl-b [ to enter copy mode.
If you're using emacs key bindings (the default), press Ctrl-s then type the string to search for and press Enter.
Press n to search for the same string again.
Press Shift-n for reverse search.
Press Escape twice to exit copy mode.
You can use Ctrl-r to search in the reverse direction.
Note that since tmux is in control of the keyboard in copy mode, Ctrl-s works regardless of the stty ixon setting (which I like to have as stty -ixon to enable forward searches in Bash).
If you're using vi key bindings (Ctrl-b:set-window-option -g mode-keys vi), press / then type the string to search for and press Enter. Press n to search for the same string again. Press Shift-n for reverse search as in emacs mode. Press q twice to exit copy mode. You can use ? to search in the reverse direction.
find-window
If you want to switch to a window based on something displayed in it (this also includes window names and titles but not history), (starting with more than one window open) press Ctrl-b f then type the string to search for and press Enter. You will be switched to a window containing that text if it's found. If more than one window matches, you'll see a list to select from.
- 106,229
- 19
- 167
- 187
-
3
-
2@DanielQue: Take a look at the tmux man page and search for "mode-keys" and "status-keys". Those are sub-commands that allow you to set the binding style. Alternately, it might be simpler to set an environment variable (`EDITOR` or `VISUAL`) to the style you want before starting `tmux`. – Dennis Williamson Aug 12 '14 at 22:55
-
8Thanks, I got it to work with `set-window-option -g mode-keys vi` in my `.tmux.conf`. But I was curious about the environment variable alternative and couldn't get it to work. Is it a shell environment variable, or a tmux environment variable that has to be set in the conf file? – Daniel Que Aug 12 '14 at 23:38
-
2@DanielQue: A shell environment variable. It will need to be exported or placed in tmux's envrionment like this: `VISUAL=vi tmux` – Dennis Williamson Aug 13 '14 at 04:54
-
1Also note that there is no regex search yet, here is an open issue on it http://sourceforge.net/p/tmux/tickets/9/ – Elijah Lynn Oct 28 '14 at 20:58
-
-
@catpants: I don't know about across sessions, but I cover searching across windows in my answer. – Dennis Williamson Jan 25 '18 at 18:32
-
Warning - this does not handle newlines. e.g if you search for a string, but that string occurs split across multiple lines, you will miss the split results! – Adverbly Jan 15 '20 at 21:01
-
That's true of _many_ searches, but there are a few that allow multiline searches. Tmux isn't one though. – Dennis Williamson Jun 29 '22 at 03:24
Enter copy mode and start searching in one go
bind-key / copy-mode \; send-key ?
allows you to do just:
Ctrl + B /
and start typing the search term, which will search up (latest lines first).
Dump to a file and use vim
When things get more involved, I just want to use a proper editor: https://unix.stackexchange.com/questions/26548/write-all-tmux-scrollback-to-a-file
bind-key P 'capture-pane' \; capture-pane -S - \; save-buffer /tmp/tmux \; delete-buffer
Now P dumps the buffer to a file, and then I just:
vim /tmp/tmux
We can automate things even further by automatically opening vim as well as suggested by pkfm:
bind-key v 'capture-pane' \; \
capture-pane -S - \; \
save-buffer /tmp/tmux \; \
delete-buffer \; \
send-keys Escape 'ddivim /tmp/tmux' Enter
This supposes that your shell is in vi mode, so that:
- Escape goes into normal mode
ddclears any existing commandigoes into insert mode- then we run
vim /tmp/tmux
Tested in tmux 3.0.
- 10,900
- 6
- 62
- 62
-
How do I make this prompt for the filename (so I don't have to hardcode `/tmp/tmux`)? – Peeyush Kushwaha Oct 19 '18 at 08:06
-
@PeeyushKushwaha sorry but my tmux fu is not that good, I'd have to google, let me know if you find it out. – Ciro Santilli OurBigBook.com Oct 19 '18 at 08:08
-
1take it further and embed the `vim` command within the `tmux` binding and automate a backwards search from the bottom of the file for the last shell prompt to jump back to the last command: `bind-key V 'capture-pane' \; capture-pane -S - \; save-buffer /tmp/tmux \; delete-buffer \; send-keys Escape 'ivim "+normal G" +"?^> " /tmp/tmux' Enter`. here, `PS1` is `> `. note the trailing space, as well as the `i` before `vim` to enter insert mode where the shell is using `vi` bindings. change according to your needs. – pkfm Sep 25 '20 at 08:06
-
-
This `bind-key / copy-mode \; send-key ?` did not work for me. It did enter copy mode but did not start a search. – SFbay007 Mar 01 '21 at 13:24
-
@SFbay007 I retested in tmux v3.1b with `bind-key / copy-mode \; send-key ?` in the conf and nothing else and it just worked, I can just type the search and hit enter. – Ciro Santilli OurBigBook.com Mar 01 '21 at 15:39
-
Hmm..maybe because I am on tmux 2.4? Is there a solution for lower tmux versions? – SFbay007 Mar 01 '21 at 15:53
-
@SFbay007 sorry, I'm not sure, if you find it out let me know. I would just compile from source and install under home dir :) – Ciro Santilli OurBigBook.com Mar 01 '21 at 16:01
-
What if I've a process running in the window that saves the buffer, how can I create a new window to open the vim editor with the buffer? – Arnold Roa Jan 30 '22 at 12:52
You can use vim to view/edit/search/save the screen log, fold the log at each bash prompt:
tmux capture-pane -pS -1000000 |
vim +":setl fen fdm=expr fde=getline(v:lnum)=~'^\\\\S\\+\\\\$\\\\s'?'>1':1" -
Adjust the regex according to your prompt, use four backslash for each backslash in regex.
Or put the vim function in ~/.vimrc:
command! MoshFoldTmuxLog :setl fen fdm=expr
\ fde=getline(v:lnum)=~'^\\S\\+\\$\\s'?'>1':1
And in ~/.bashrc add date to the prompt, if you have lots of logs to search through. e.g
PS1='\u@\h:\w:\D{%F-%T}$?:\$ ' # user-host-pwd-date-time-errno
alias tmux-log='tmux capture-pane -pS -1000000 | vi +MoshFoldTmuxLog -'
- 297
- 2
- 8
Here is a solution I found.
You can modify the target path and filename as well:
# Save screen content to file
bind p command-prompt -p 'Save history to:' -I '~/tmux.history' 'capture-pane -S -32768 ; save-buffer %1 ; delete-buffer'
After reloading the tmux config file you can press prefix p in my case Ctrl+a p
You can change bind p to your preferred key combination.
First mine was not working because I was overwriting bind p in another line so I just commented that out.
- 131
- 3