Skip to main content

The enlightened pager: less paging. more content. read widely.

Project description


the enlightened pager. less paging. more content. read widely.

...because you have more than 80 columns


kan-ten: Japanese for word for agar, a gelatinous substance derived from seaweed.

A program for reading in the terminal. A pager for the early 90s?

This program was inspired by a similar one called
[Tofu]( for OS X, a column-based reader application,
where the columns are arranged horizontally. Given the aspect ratio of computer
monitors, I decided to create kanten to be a unix pager replacement (more and
less) that is not limited to 80 columns.

[x] horizontal progress bar indicator
[x] figure out how many columns are displayed, and adjust pbar accordingly
[x] max columns should always be shown
[x] progress bar should consider all visible columns as shown
[x] some vertical empty space at the top
[x] space bar should move whole screen over (displayed_columns)
[x] scroll using the mouse
[ ] middle mouse button pastes contests of X11 paste register into a new buffer
[ ] mouse events don't work after 'v' (entering editor)
[ ] d and u (^D and ^U) go forward and back a column (half-screen in less)
[x] reading from stdin
[x] process keyboard shortcuts after reading from stdin (the way less does)
[ ] read buffering (don't read the whole file before filling in)
- MUSTFIX for sane STDIN piping (e.g. git log | kanten)
- urwid's has an example of lazy loading
[ ] mouse interactions broken in xterm after sleeping kanten - what gives?
- can't click to select text in xterm
- cannot select text even after sleeping kanten
[ ] double spacing option for easier reading?
[x] specifying a filename from commandline
[ ] demo file that explains kanten (tutorial)
[ ] do a full install as a python package with an entry point
[ ] configuration in ~/.config/kanten
[ ] all configurable take defaults from ~/.config, but overwritten by params
[x] configurable number of columns (via -w or --width)
[x] automatically figure out size (for height, and number of columns)
[x] allow setting height from command line
[x] implement :set commands
(:set height, :set width)
[x] 'v' to edit the file , just like less
- disabled for stdin? at least if EOF not encountered
- wouldn't support editing stdin
[x] respect $EDITOR, use vim if EDITOR not set
[ ] would be even better if we check if vim exists, use vi otherwise
[ ] on exit from editing, refresh the file in kanten
[ ] open file to the right line (at least the top-left column's line)
- set cursor location either via search or mouseclick
- mouseclick should un-highlight the current match of search (if any) and
highlight the whole line instead
- actually - it might make sense to just use widget focus infrastructure
for this in urwid?
[ ] mouse click column detection is off by the size of the margins
- find it from window_width % column_width / num_columns
[ ] drag click events for paging (flick-click right to go forward, etc)
[ ] run_wrapper to restore previous screen?
- moar and bpython do this, i think
[ ] (refactor) move all initialization into a function, to allow for re-init
[ ] dynamic resizing of width
[ ] (via + and - commands, perhaps)
[ ] via ":set width=40"
[ ] respond to sigwinch and re-do the number of columns
- number displayed changed, so the pbar needs an update
[x] param parsing (e.g. add --help)
[x] hide the progress bar (ctrl-n is what zathura uses or something?)
[x] currently implemented via t
[ ] add a parameter to disable progress bar
[ ] add help dialog on h
- not ? - that's reverse search, but h and H and F1
[x] easter egg planted
[x] :help should work
[x] add : command mode
[x] support :q
[x] support :f for file info
[ ] don't allow deletion of ':' prompt in command mode
[ ] backspace in command mode should leave it? (like vim
( ) history (up and down arrows)
( ) q: and :^F command buffer?
[ ] (maybe) support multiple buffers?
- :n and :p (or :N) for next and previous
[ ] :e to read a different file?
- filename tab completion for :e
[x] . (dot) to repeat previous command (page up or down, next, etc)
[ ] support more less/more keys
[x] < and >
[x] z and w
[x] j and k (page-wise OK)
[x] = to show file name / info (ctrl-g should also work)
[x] ctrl-g should show status bar only once
[ ] others?
[ ] F - forward forever (for stdin)
[ ] control key combos
[x] ctrl-v ctrl-f for page forward and ctrl-b for back back
[x] ctrl-g for file info
[ ] (maybe) implement marking system (top lines?)
- like less, marks will only live for duration of program execution
[ ] support jumping to a particular line
- would go along with editing a file at that line
- and allow us to jump back into the same line after editing?
- jump to the line of the currently highlighted thing
[ ] support ctrl-i and ctrl-o location-list jumping
[x] reflow of text
[ ] (maybe) reading cursor (like dictator?)
[x] 'g' to go to the beginning
[ ] gg g0 g$ and other commands?
[ ] implement number prefixes
[x] 'G' to go to the end
[x] split boxes so that they partially fit
[x] clip off lines that are too long even in one go
[x] last line of text being cut-off
[x] fix formatting (spacing) for cells which were cut
[x] columns currently allowed to expand: don't let them
- boxadapter?
- options('given', width) ?
- use padding!!
[ ] (alignment) 'the less is' line currently getting screwed up :\
[ ] (refactor) start off with one Padding(text) and keep splitting in
- don't pre-split
- such an approach will be a reasonable way to go with searching, anyway
- i.e. highlight the word in every instance, and reflow?
- or at least to find the location of the word, and then index into the
right / approximate column
- also makes it reasonable to scroll line by line (daisy chain visible cols)
- stop after all visible columns are filled
[x] search using / (to seek around)
- use a footer / header of the frame widget to do this and :?
[x] enter do submit footer content
[x] esc to refocus the window
[ ] case insensitive search via -I command line parameter
[ ] incremental search via incsearch
[x] highlight words in the text
[x] highlight searched word (switch to ANSIText?)
[x] highlight diff output (via 'd', disable with 'D')
[ ] detect diff output
[x] toggle it via :set ft=diff
[x] force diff output with -d flag
[x] use diff output when openining .diff and .patch files
[ ] handle diff lines that span multiple columns properly
[ ] parse shell escaped characters properly
- so we can read man pages
- look at the piped output of grep --color=always
- I think the Qt console has some code for this?
[x] replace searched words with highlighted version
[ ] highlight current matched search item differently than some other
- traverse the contents, and change an 'important' to somehting else
[ ] wrap-around optionally
[x] going forward 4 times and then going back 4 doesn't work :(
maybe related:
File "/usr/lib/python2.7/dist-packages/urwid/", line 142, in cached_render validate_size(self, size, canv)
File "/usr/lib/python2.7/dist-packages/urwid/", line 112, in validate_size canv.rows(), size))
urwid.widget.WidgetError: Widget <Filler box widget <Columns box/flow widget> valign='top'> rendered (193 x 45) canvas when passed size (193, 51
[x] (maybe) try cache invalidation? nope, _invalidate doesn't hel
[x] [cols.focus_position=0 seems to have done the trick!
[ ] bash completion for flags (is there one for python ArgParse code already?)
- yeap! use
[ ] write some tests, with Travis and Coveralls badges in the readme?
[ ] look at how pudb xo and other urwid apps do testing
[ ] urwid tests are in e.g. /home/pi/code/urwid/urwid/tests/
[ ] take a look at what @jlord accomplished with
[ ] more has a way of listing multiple files
[x] hide progress bar (perhaps on timeout after paging through)
[ ] adding a keyboard shortcut should be sure to remove it from others
[ ] handle really short input gracefully
- put the first column on the left-most position
[ ] rest and markdown highlighting (if available)
[ ] use pygments for highlighting, when possible
[x] detect filetype, at least by filename
[x] .diff and .patch for ft=diff
[ ] .py for ft=python
[ ] see what rifle does in ranger - utilize those plugins / handling
[ ] fix bug for small width and few number of lines (looks ugly, spaces/line
breaks are missing)
[x] clear edit text on motion key
[ ] kanten.js
[ ] refactor to remove globals with instance variables
[ ] write a kanten man page
[ ] -F or --quit-if-one-screen
Causes less to automatically exit if the entire file can be dis‐
played on the first screen.
[ ] -i or --ignore-case
Causes searches to ignore case; that is, uppercase and lowercase
are considered identical. This option is ignored if any upper‐
case letters appear in the search pattern; in other words, if a
pattern contains uppercase letters, then that search does not
ignore case.
[ ] -I or --IGNORE-CASE
Like -i, but searches ignore case even if the pattern contains
uppercase letters.
[ ] add \c and \C (insensitive and sensitive, respectively) to the
search parsing
[ ] support set ignorecase? set smartcase?
[ ] add saveas (to save STDIN input)
[ ] center single column
[ ] version string
[ ] :version command
[ ] corner cases when -t and -b \lim 0
[ ] for ipython: register .ipynb as a json lexer-able thing
[ ] swallow last empty panel in the banner
[ ] make kanten importable (refactor out the cli aspects to make testing easier)
[ ] bug - height is exceeded in my piles (off by one?)

Project details

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Files for kanten, version 0.5.123
Filename, size File type Python version Upload date Hashes
Filename, size kanten-0.5.123.tar.gz (15.6 kB) File type Source Python version None Upload date Hashes View

Supported by

Pingdom Pingdom Monitoring Google Google Object Storage and Download Analytics Sentry Sentry Error logging AWS AWS Cloud computing DataDog DataDog Monitoring Fastly Fastly CDN DigiCert DigiCert EV certificate StatusPage StatusPage Status page