{"id":13862774,"url":"https://github.com/doublep/logview","last_synced_at":"2026-02-21T00:29:49.796Z","repository":{"id":35810168,"uuid":"40092562","full_name":"doublep/logview","owner":"doublep","description":"Emacs mode for viewing log files","archived":false,"fork":false,"pushed_at":"2026-02-18T20:15:10.000Z","size":776,"stargazers_count":171,"open_issues_count":11,"forks_count":18,"subscribers_count":5,"default_branch":"master","last_synced_at":"2026-02-19T00:50:10.077Z","etag":null,"topics":["emacs","filtering","log"],"latest_commit_sha":null,"homepage":"","language":"Emacs Lisp","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/doublep.png","metadata":{"files":{"readme":"README.adoc","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2015-08-02T20:58:33.000Z","updated_at":"2026-02-18T20:13:15.000Z","dependencies_parsed_at":"2023-09-21T20:29:15.273Z","dependency_job_id":"832c3af3-4e80-4bda-9368-5214f7308043","html_url":"https://github.com/doublep/logview","commit_stats":null,"previous_names":[],"tags_count":45,"template":false,"template_full_name":null,"purl":"pkg:github/doublep/logview","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/doublep%2Flogview","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/doublep%2Flogview/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/doublep%2Flogview/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/doublep%2Flogview/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/doublep","download_url":"https://codeload.github.com/doublep/logview/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/doublep%2Flogview/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29668689,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-21T00:11:43.526Z","status":"ssl_error","status_checked_at":"2026-02-20T23:52:33.807Z","response_time":59,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["emacs","filtering","log"],"created_at":"2024-08-05T06:01:52.295Z","updated_at":"2026-02-21T00:29:49.780Z","avatar_url":"https://github.com/doublep.png","language":"Emacs Lisp","funding_links":[],"categories":["Emacs Lisp"],"sub_categories":[],"readme":":toc: macro\n:toc-title: Table of contents\n:source-language: lisp\nifndef::env-github[:icons: font]\nifdef::env-github[]\n:warning-caption: :warning:\n:caution-caption: :fire:\n:important-caption: :exclamation:\n:note-caption: :paperclip:\n:tip-caption: :bulb:\nendif::[]\n:uri-stable: http://stable.melpa.org/#/logview\n:uri-unstable: http://melpa.org/#/logview\n\n\n= Logview mode\n\nimage:https://img.shields.io/badge/license-GPL_3-green.svg[License: GPL 3, link=http://www.gnu.org/licenses/gpl-3.0.txt]\nimage:https://img.shields.io/github/release/doublep/logview.svg[Latest release, link=https://github.com/doublep/logview/releases]\nimage:http://stable.melpa.org/packages/logview-badge.svg[MELPA Stable, link=http://stable.melpa.org/#/logview]\nimage:https://github.com/doublep/logview/workflows/CI/badge.svg[CI, link=https://github.com/doublep/logview/actions?query=workflow%3ACI]\n\nLogview major mode for Emacs provides syntax highlighting, filtering\nand other features for various log files.  The main target are files\nsimilar to ones generated by Log4j, Logback and other Java logging\nlibraries, but there is really nothing Java-specific in the mode and\nit should work just fine with any log that follows similar structure,\nprobably after some configuration.\n\nThe mode is meant to be operated in read-only buffer, so most of the\ncommand bindings lack modifiers.\n\nOut-of-the-box the mode should be able to parse standard SLF4J (Log4j,\nLogback) files, Apache error logs, PHP Monolog logs, and certain UNIX\nfiles in `/var/log`.  Nearly all typical timestamp formats, including\nlocalized ones, should be picked up automatically.\n\ntoc::[]\n\n\n== Installation\n\nLogview is available from MELPA (both {uri-stable}[stable] and\n{uri-unstable}[unstable].  Assuming your `package-archives` lists\nMELPA, just type:\n\n    M-x package-install RET logview RET\n\nto install it.\n\nInstalling Logview from source is not difficult either.  First, clone\nthe source code:\n\n    $ cd SOME-PATH\n    $ git clone https://github.com/doublep/logview.git\n\nNow, from Emacs execute:\n\n    M-x package-install-file RET SOME-PATH/logview\n\nAlternatively to the second step, add this to your `.emacs` file:\n\n    (add-to-list 'load-path \"SOME-PATH/logview\")\n    (require 'logview)\n\nIn this case you should probably byte-compile the sources:\n\n    $ eldev compile\n\n\n== Submodes\n\nSince there is no standard log file format, Logview mode has to try\nand guess how the log file it operates on is formatted.  It does so by\ntrying to parse the first few lines of the file against various\nsubmodes it has defined.\n\nIf it succeeds in guessing, you will see major mode specifed as\n“Logview/...” in the modeline, where the second part is the submode\nname.\n\nIn case it fails, you will see it complain in the echo area.  The\nbuffer will also not be highlighted or switched to read-only mode, so\nyou will be able to edit it.\n\n=== What to do if Logview mode fails to guess format\n\nThis depends on _why_ it fails.  If the mode doesn’t know about this\nlog format at all, customize the relevant options.  `C-c C-s` will\nshow you the three variables that are important for submode guessing.\nYou will need to customize at least one of those, or maybe all three.\nAll the variables are well-documented in customization interface.\n\nHowever, it is also possible that Logview fails because it looks only\nat the first lines of the buffer.  As of 0.14 this can be up to 500\nlines (see option `logview-guess-lines`), but in the unlikely case\nreal log entries in your files start even later, you can customize\nthis value.  However, there is an optimization in Logview: if it\ndiscovers several lines that do look like log entry start, yet cannot\nbe understood by the mode, guessing is aborted.  This is done because\notherwise guessing could take very long time and still be\nunsuccessful.  This optimization is triggered upon seeing\n`logview-max-promising-lines` such lines (default value is just 3).\nYou can always customize this setting if needed, but remember, that\nthis can lead to very long guessing times.\n\nFinally, you can always force Logview to switch to appropriate submode\nusing `C-c C-c` shortcut.  Remember that you still need to have it\nregistered first.  In case you don’t want to manually select submode\neach time in such cases, you can set up some automatic switching from\na hook using Elisp function `logview-choose-submode`.\n\nIf you think your log format is standard enough, you can open an issue\nand request format addition to the list of mode built-ins.\n\n\n[#filters-explained]\n== Filters\n\nIn addition to level (INFO, ERROR, etc.) filtering, Logview\nsupports filtering by entry’s logger name, thread and message.\n\nThese filters are regular expression and come in two kinds: _include_\nand _exclude_ filters.  If at least one include filter is set, only\nthose entries where relevant part matches at least one of regular\nexpressions are shown, all others are filtered out.  If any exclude\nfilter is set, all entries where relevant part matches its regular\nexpression are filtered out (regardless of any other filters) and\nhidden.\n\nEasiest way to add filters is by using `a` / `A` commands (add\ninclude/exclude name filter correspondingly), `t` / `T` (thread\nfilters), and `m` / `M` (message filters).  You can reset all filters\nof given type: `r a` for name, `r t` for thread and `r m` for message\nfilters, `R` for all filters at once.\n\nHowever, oftentimes you need to adjust existing filters, e.g. to fix a\ntypo or simply change one, while keeping others the same.  For this\npurpose use `f` command.  It pops up a separate buffer with all\ncurrently active filters (both level and text), which you can edit as\nyou like, using any standard Emacs features.\n\nLines beginning with ‘#’ character are comments.  They and empty lines\nare ignored.  Lines for level filters must start with prefix ‘lv ’\n(note the single trailing space!) for normal filtering or ‘LV ’ for\n“always show” pseudo-filter, and contain the textual level\nrepresentation afterwards, just as you would see it in the logfile.\nFor example:\n\n    lv DEBUG\n    LV ERROR\n\nmeans “show all entries except trace-level, and additionally show all\nerrors with no regard to text filters.”\n\nLines for text filters are similar.  They must start with ‘a+ ’\n(again, remember the trailing space) for name inclusion filters, ‘a- ’\nfor name exclusion, and similarly ‘t+ ’, ‘t- ’, ‘m+ ’, ‘m- ’ for\nthread and message filters.  Additionally, multiline message filters\nmust use ‘.. ’ prefix (two dots and a space) for continuation lines.\nFor example:\n\n    a+ database\n    m+ ^insert.+\n    .. values\n\nmeans “show entries with word ‘database’ in the logger name and which\nmessage has a line beginning with ‘insert’ and the line after that\nbeginning with ‘values’.”\n\nThe buffer mode has some syntax highlighting support, so you should\nsee if anything goes wrong.  The easiest way to figure it out is to\nadd a few filters using commands described earlier and then open this\nbuffer with `f` and see how they are represented.\n\nChanges in the buffer popped up with `f` (or \u003c\u003cthread-narrowing,Y\u003e\u003e)\nare previewed in the main buffer on-the-fly.  If you don’t like this,\ncustomize variable `logview-preview-filter-changes`, toggle this in\nthe main buffer using `o p` or in the filter buffer with `C-c C-p`.\n\n=== Filter regexp details\n\nRegular expressions can be matched against entry parts either\ncase-sensitively or case-insensitively, depending on standard Emacs\nvariable `case-fold-search`.\n\nFilters are matched against relevant entry parts as strings, not\nagainst the whole buffer.  Therefore, you can use `^` and `$` special\ncharacters for the expected meaning.  For example, adding `^org` as\nname exclusion filter will hide all entries where logger name begins\nwith string ‘org’.\n\nUnlike name and thread filters, message filters can span multiple\nlines.  To enter linefeed in message buffer (after `m` or `M`) use\n`C-q C-j`.  When editing a multiline filter with `f`, prefix all\ncontinuation lines with ‘.. ’.\n\nCommands `a`, `A`, `t` and `T` default to the name (or thread) of the\ncurrent entry.  You can also use `C-p` (`\u003cup\u003e`) to browse history of\npreviously entered values and `C-n` (`\u003cdown\u003e`) for a few default\nvalues.\n\n[#thread-narrowing]\n=== Thread-narrowing filters\n\nIn addition to “normal” or “main” filters, Logview supports a separate\nset of _thread-narrowing filters_, naturally only in those submodes\nthat have threads.  Thread-narrowing filters are independent from\nnormal filters and are combined with an ‘and’ operation when filtering\nout entries.\n\nThese filters can be quickly changed using command `y` that toggles\nbetween “narrowing” to the current entry’s thread and clearing\nthread-narrowing filters altogether.  They can also be changed by\ncommand `c c` (see \u003c\u003csections-explained,the topic on sections\u003e\u003e).\nFinally, just as command `f` allows you to edit normal filters,\ncommand `Y` can be used to edit thread-narrowing filters.  However,\nonly ‘t+ ’ and ‘t- ’ filters are understood here.\n\nThread-narrowing filters are not affected by filter resetting commands\nwith the exception of `r e`, that resets “everything possible”.\nInstead, they are treated as part of buffer narrowing.  In particular,\ncommand `w` (“widen”) resets thread-narrowing filters in addition to\nstandard Emacs buffer narrowing.  In the same vein, thread-narrowing\nfilters are not considered part of \u003c\u003cviews-explained,views\u003e\u003e.\n\nThis is largely the justification for their existence: to decouple\nquick changes to displayed thread(s) from the main filters.\n\n\n[#views-explained]\n== Views\n\n_Views_ are named sets of filters that you can activate quickly.  They\nare especially useful if you use name or message filters a lot, and\noften find yourself typing in the same filters over and over again.\n\nThe easiest way to define a view is by first adding all the filters\nyou need.  This way you can see in the buffer if the filtering result\nmatches what you expect.  After you are satisfied, type `V s` and a\nname for the new view.  Notice that the mode line now displays name of\nthe view in square brackets after the submode name, e.g.:\n\n    Logview/SLF4J [useful-view-1]\n\nNow type `R` to reset all the filters.  All previously hidden entries\nwill be shown again and the view name disappear from the mode line.\nHowever, to restore the filters now you don’t have to re-create them\none-by-one.  Simply type `v` and whatever name you used when saving\nyour first view.  You can also use text completion to pick among all\nthe defined views.\n\nTo make choosing views even easier, you can optionally assign quick\naccess indices to views.  For this, activate a view normally (or have\nit just saved), type `V i` and enter a number, say 3.  After this, the\nview can be quickly activated again by typing `M-3` or `3 v`.\n\nRemember that further filtering doesn’t affect view definition.  If\nyou want to change a view, save filters as a view with the same name\nagain, and confirm that you do want to replace the previous\ndefinition.  Alternative way is to edit views using `V e`.  This pops\nup a separate buffer just like `f` command does, but instead of\nfilters you will edit all defined views for the current submode at\nonce.  This way you can change existing definitions, delete unneeded\nor add more.  Commands like `V s` or `V d` (delete a view by name) can\nbe seen as just a convenience.\n\nViews come in two kinds: globally accessible and bound to a specific\nsubmode.  This distinction is important if you use logs of different\nkinds.  Most often you need submode-specific views, because text\nfilters usually can’t be meaningfully applied without changes to\ndifferent programs.  When you use `v` command, only the views for the\ncurrent submode plus any global views are available for selection.\n\nIn addition to applying view filters, it is also possible to move\nbetween entries in a view without activating it.  For this, define a\nview and then set it as as a _navigation view_ with `V n` command.\nAfter this, use commands `M-n` and `M-p` to quickly navigate forward\nand backward.  Remember that these commands skip all hidden entries,\nwhether because of your main view (or filters) or manual entry hiding.\n\nFinally, you can highlight all entries in a view, or, more precisely,\nthose that are visible currently.  This can be done with `V h`\ncommand.  Cancel this by highlighting entries from a different view or\nremoving highlighting altogether with `V u`.\n\nTo summarize:\n\n* You can have any number of named views.  Their definitions are\n  stored permanently across Emacs session and are available from all\n  Logview buffers.\n* At any time you can switch to a view, i.e. replace current filters\n  with those stored in the view’s definition.  Changing filters itself\n  doesn’t alter any view definitions.\n* You can appoint one view as a \u003c\u003csections-explained,section\u003e\u003e view.\n  It will be used for highlighting section headers and all\n  \u003c\u003csections,section commands\u003e\u003e.\n* You can choose one navigation view, independently from the currently\n  applied view.  Navigation view is used by commands `M-n` and `M-p`.\n* You can highlight entries of a view, again, independently from\n  current, section or navigation view.\n\n\n[#sections-explained]\n== Sections\n\nLogview can split your log files into _sections_ to simplify\nnavigating and comprehending what would otherwise be an endless flow\nof entries.  For this, you need to create a \u003c\u003cviews-explained,view\u003e\u003e\nthat matches entries that you define as _section headers_.  For\nexample, if a log is generated by some kind of a server, each section\ncould span one request to the server and the section header view\nshould match only the “intro” entries of request processing.  An\nexample view definition could look somewhat like this:\n\n    view Server X sections\n    submode Server X\n    lv INFO\n    a+ ^my\\.server\\.Class$\n    m+ ^serving request to\n\nSince section views are supposed to be used often, it is recommended\nto include “excessive” filters (e.g. the level and name filters in the\nexample above) to make them faster.\n\nYou can now activate the created section view with `V c` command or\nany of the section commands (`c \\...`).\n\nSection headers will be highlighted with inverted colors and bold\ntext, allowing you to easily spot boundaries between different\nrequests.  Perhaps even more importantly, various section commands,\ne.g. `c a` or `c n` let you navigate the log in terms of sections, and\ncommand `c c` lets you instantly narrow (as in Emacs buffer narrowing\ncombined with \u003c\u003cthread-narrowing,thread narrowing\u003e\u003e) to the current\nsection.\n\nSections in Logview can be either _thread-bound_ or not.  By default,\nif the log has a concept of threads, sections are thread-bound.  You\ncan toggle this using command `c t`; additionally, there are several\ncommands like e.g. `c N` that temporarily treat sections as\nnon-thread-bound, even if they normally are.\n\nWhen sections are thread-bound, they can have overlap each other:\nentries in different threads always belong to different sections.\nThis actually reflects how threaded programs (that create logs with\ndifferent threads) work, so shouldn’t be seen as unexpected.\n\nSections work particularly nicely in combination with timestamp\ndifference commands.  Using command `z c` you can order Logview to\nreplace timestamps for all non-header entries with the difference to\nthe timestamp in the corresponding section’s header.  This is useful\nwhen investigating logs for sources of performance problems.\n\nAnother use for sections is long-distance navigation in a huge log\nfile.  You can use command `c h` to temporary “narrow” to only section\nheaders.  Typically, the headers should be informative enough,\ne.g. contain accessed resource name (but this depends on how _you_\ndefine the section view), that you can quickly find the section you\nare interested in at the moment.  This functionality is also available\nfrom within \u003c\u003cisearch,Isearch\u003e\u003e as `M-h`.\n\n\n[#isearch]\n== Special Isearch support ==\n\nLogview adds a few extensions to Isearch.  When performing an\nincremental search, usually started with `C-s`, you can switch between\nshowing entries normally and only section headers with `M-h` (see\n\u003c\u003csections-explained,the explanation of log section\u003e\u003e).  Similarly,\nyou can temporarily switch between searching all visible text (the\ndefault) and only visible message using `M-m` (outside Isearch this is\navailable with `o m`).  When you activate any of these options from\nwithin Isearch, the change is temporary and is cancelled once you are\ndone with the search.  This is for consistency with how e.g. `M-c` in\nIsearch operates: its change in case-folding also affects only the\ncurrent search and is not remembered outside it.\n\nIn addition, when searching only in messages, Logview will dim all\nother text, but only when incremental search is in progress.  This is\ndone regardless of how the option is activated.\n\n\n== Commands\n\nNearly all commands have some use for prefix argument.  It can be\nusually just guessed, but you can always check individual command\ndocumentation within Emacs.\n\nWhen buffer is switched to read-write mode, Logview automatically\ndeactivates all its commands so as to not interfere with editing.\nOnce you switch the buffer back to read-only mode, commands will be\nactive again.\n\n=== Movement\n\n* All standard Emacs commands\n* Go to the beginning of entry’s message: `TAB`\n* Go to next / previous entry: `n` / `p`\n* Go to next / previous “as important” entry: `N` / `P`\n* Go to next / previous entry in the navigation view: `M-n` / `M-p`\n* Go to the next / previous entry with large timestamp gap after the\n  previous: `z n` / `z p`\n* Same as above, but only considering entries in the same thread: `z\n  N` / `z P`\n* Go to first / last entry: `\u003c` / `\u003e`\n\n“As important” means entries with the same or higher level.  For\nexample, if the current entry is a warning, “as important” include\nerrors and warnings.\n\nMany \u003c\u003csections,section commands\u003e\u003e also just move the point.\n\n=== Narrowing and widening\n\n* Narrow from / up to the current entry: `[` / `]`\n* Widen (and cancel thread-narrowing filters): `w`\n* Widen upwards / downwards only: `{` / `}`\n* Toggle narrowing to the current entry’s thread: `y`\n* Edit thread-narrowing filters: `Y` (pops up a separate buffer)\n\nCommand `y` toggles between narrowing to the current entry’s thread\nand completely cancelling all thread-narrowing filters.\n\nSee also some \u003c\u003csections,section commands\u003e\u003e.\n\n=== Filtering by entry level\n\n* Show only errors: `l 1` or `l e`\n* Show errors and warnings: `l 2` or `l w`\n* Show errors, warnings and information: `l 3` or `l i`\n* Show all levels except trace: `l 4` or `l d`\n* Show entries of all levels: `l 5` or `l t`\n* Show entries “as important” as the current one: `+` or `l +`\n\n=== Always showing entries of certain levels\n\nIt is possible to always display entries of certain levels, regardless\nof any additional text filters.\n\n* Always show errors: `L 1` or `L e`\n* Always show errors and warnings: `L 2` or `L w`\n* Always show errors, warnings and information: `L 3` or `L i`\n* Always show all levels except trace: `L 4` or `L d`\n* Disable “always show” feature: `L L` or `L 0`\n\n=== Filtering by entry’s logger name, thread or message\n\nSee \u003c\u003cfilters-explained,more detailed description above\u003e\u003e.\n\n* Edit current name, thread and message filters: `f` (pops up a separate buffer)\n* Add name include / exclude filter: `a` / `A`\n* Add thread include / exclude filter: `t` / `T`\n* Add message include / exclude filter: `m` / `M`\n\n\u003c\u003cnarrowing-and-widening,Thread narrowing commands\u003e\u003e can also be seen\nas filtering.\n\n=== Resetting filters\n\n* Reset level filter: `r l`\n* Reset name filters: `r a`\n* Reset thread filters: `r t`\n* Reset message filters: `r m`\n* Reset all filters: `R`\n* Reset all filters, widen and show all explicitly hidden entries: `r e`\n\n=== Views\n\nSee \u003c\u003cviews-explained,more detailed description above\u003e\u003e.\n\n* Switch to a view: `v`\n* Choose a \u003c\u003csections-explained,section\u003e\u003e [header] view: `V c`\n* Choose navigation view (for `M-n` and `M-p`): `V n`\n* Select a view to highlight its entries: `V h`\n* Remove view highlighting: `V u`\n* Save the current filters as a view for this submode: `V s`\n* Save the current filters as a global view: `V S`\n* Edit submode views: `V e` (pops up a separate buffer)\n* Edit all views: `V E` (pops up a separate buffer)\n* Assign a quick access index to the current view: `V i`\n* Delete a view by name: `V d`\n\nYou can also switch to views using their quick access index:\n`M-0`..`M-9` or e.g. `1 4 v` (for quick access index 14).  Prefix\nargument works also for `V n` and `V h`.\n\n=== Sections\n\nSee \u003c\u003csections-explained,more detailed description above\u003e\u003e.\n\n* Go to the current section’s beginning/end: `c a` / `c e`\n* Go to the next / previous section: `c n` / `c p`\n* Go to the next / previous section in any thread: `c N` / `c P`\n* Go to first / last section: `c ,` / `c .`\n* Go to first / last section in any thread: `c \u003c` / `c \u003e`\n* Narrow to the current section: `c c`\n* As above, but don’t touch thread narrowing filters: `c C`\n* “Narrow” to section headers, i.e. don’t show any other entries: `c h`\n* Toggle whether sections are bound to threads: `c t`\n\n=== Explicitly hide or show individual entries\n\n* Hide one entry: `h`\n* Hide entries in the region: `H`\n* Show some explicitly hidden entries: `s`\n* Show explicitly hidden entries in the region: `S`\n* Show all manually hidden entries in the buffer: `r h`\n\nIn Transient Mark mode `h` and `s` operate on region when mark is\nactive.\n\n=== Entry timestamp commands\n\n* Replace timestamps with their difference to that of the current\n  entry: `z a`.\n* Same as above, but only within the same thread: `z t`\n* Same as above, but within _every_ section relative to its header: `z c`\n* Go to the entry difference to which timestamp is shown: `z z`\n* Don’t show timestamp differences: `z A`\n* Don’t show timestamp differences for this thread: `z T`\n* Don’t show timestamp differences in every section: `z C`\n\nTimestamp differences are displayed in seconds.  See also\n\u003c\u003csections-explained,description of sections above\u003e\u003e.\n\n=== Explicitly hide or show details of individual entries\n\nThe mode terms all message lines after the first “details”.\nOftentimes these contain exception stacktrace, but most logging\nlibraries let you write anything here.\n\n* Toggle details of the current entry: `d`\n* Toggle details of all entries in the region: `D`\n* Toggle details in the whole buffer: `e`\n* Show all manually hidden entry details in the buffer: `r h`\n\nIn Transient Mark mode `d` operates on region when mark is active.\n\n=== Change options for the current buffer\n\nThese options can be customized globally and additionally temporarily\nchanged in each individual buffer.\n\n* Change gap length for `z n` and similar commands: `o g` or `z g`\n* Toggle Auto-Revert mode: `o r`\n* Toggle Auto-Revert Tail mode: `o t`\n* Toggle “copy only visible text”: `o v`\n* Toggle “search only in messages”: `o m`\n* Toggle “preview filtering results”: `o p`\n* Toggle “show ellipses”: `o e`\n\n=== Miscellaneous\n\n* Pulse (briefly highlight) the current log entry: `SPC`\n* Manually choose appropriate submode and timestamp format: `o s` or `C-c C-c`\n* Customize options that affect submode selection: `o S` or `C-c C-s`\n* Bury buffer: `q`\n* Refresh the buffer (appending, if possible) preserving active filters: `g`\n* Prepare the buffer for new contents: `G`\n* Append log file tail to the buffer: `x`\n* Revert the buffer preserving active filters: `X`\n* Universal prefix commands are bound without modifiers: `u`, `-`, `0`..`9`\n\nPreparing for new contents (`G`) is useful in situations where you\nwant to abstract from existing entries.  Next time you issue command\n`g` after it, the buffer will contain all entries added between `G`\nand `g`.  `G` is roughly equivalent to the following sequence of\ncommands: `g`, `w`, `\u003e`, `[`.\n\n=== Extensions for Isearch mode ===\n\n* “Narrow” to section headers, i.e. don’t show any other entries: `M-h`\n  (normally available as `c h`)\n* Toggle “search only in messages”: `M-m` (normally available as `o m`)\n\n\n[#locked-narrowing]\n== Locked narrowing in Emacs 29\n\nEmacs 29 (in development) has introduced locked narrowing as a way to\nimprove performance.  At the same time, it broke compatibility by\nmaking function `widen` not always do what packages would expect from\nit.\n\nIt is extremely difficult to adapt Logview to `widen` not widening as\nit has always does.  Or likely even impossible without completely\nredesigning the mode, sacrificing lazy filtering in the process.\n\nLocked narrowing restrictions can be lifted, but for this you need to\nknow the “tag” used to install them.  There is no way to find the tag\n(unless you have locked with it yourself and thus just know), but at\nleast Emacs itself uses only a few hardcoded tags.  Logview tries to\nunlock all of those.  However, if restrictions are still locked after\nthat, Logview will fail before causing more (and unpredictable)\nproblems: e.g. previously it could even cause a full freeze in Emacs\n(where even `C-g` does nothing) from its fontification code.\n\nNormally, such errors should not happen now, but if they do then\neither Emacs invented yet another place where it has to\n+++\u003cdel\u003e+++break everything+++\u003c/del\u003e+++ lock restrictions, or this has\nmade it into some minor mode you use (they made function\n`narrowing-lock` public for everyone to try and break other code).\n\nI have tried arguing with Emacs developers about this, but that is\npointless, as I have found on this and several other occasions.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdoublep%2Flogview","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdoublep%2Flogview","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdoublep%2Flogview/lists"}