Mercurial > hg > config
annotate python/dmenu.py @ 929:7c4be71a560b default tip
remove old aliases
| author | Jeff Hammel <k0scist@gmail.com> | 
|---|---|
| date | Mon, 20 Oct 2025 15:22:19 -0700 | 
| parents | 618db1b1f34b | 
| children | 
| rev | line source | 
|---|---|
| 289 | 1 #!/usr/bin/env python | 
| 2 | |
| 3 import optparse | |
| 4 import os | |
| 297 | 5 import shlex | 
| 289 | 6 import subprocess | 
| 7 import sys | |
| 8 | |
| 290 
03d62a2cbe62
update demnu to almost a real program
 Jeff Hammel <jhammel@mozilla.com> parents: 
289diff
changeset | 9 def choose_file(directory, dmenu='dmenu', | 
| 291 | 10 args=('-i', '-nb', 'black', '-nf', 'white', | 
| 11 '-fn', '-*-lucidatypewriter-medium-r-*-*-*-120-*-*-*-*-*-*')): | |
| 289 | 12 """choose a file in the directory with dmenu""" | 
| 13 directory = os.path.abspath(directory) | |
| 14 files = os.listdir(directory) | |
| 15 string = '\n'.join(files) | |
| 16 | |
| 290 
03d62a2cbe62
update demnu to almost a real program
 Jeff Hammel <jhammel@mozilla.com> parents: 
289diff
changeset | 17 if isinstance(dmenu, basestring): | 
| 
03d62a2cbe62
update demnu to almost a real program
 Jeff Hammel <jhammel@mozilla.com> parents: 
289diff
changeset | 18 dmenu = [dmenu] | 
| 
03d62a2cbe62
update demnu to almost a real program
 Jeff Hammel <jhammel@mozilla.com> parents: 
289diff
changeset | 19 dmenu = list(dmenu) | 
| 
03d62a2cbe62
update demnu to almost a real program
 Jeff Hammel <jhammel@mozilla.com> parents: 
289diff
changeset | 20 dmenu.extend(args) | 
| 289 | 21 | 
| 290 
03d62a2cbe62
update demnu to almost a real program
 Jeff Hammel <jhammel@mozilla.com> parents: 
289diff
changeset | 22 process = subprocess.Popen(dmenu, stdin=subprocess.PIPE, stdout=subprocess.PIPE) | 
| 289 | 23 stdout, _ = process.communicate(input=string) | 
| 24 if process.returncode: | |
| 25 return | |
| 26 chosen = os.path.join(directory, stdout) | |
| 27 if os.path.isdir(chosen): | |
| 28 return choose_file(chosen) | |
| 29 return chosen | |
| 30 | |
| 31 def main(args=sys.argv[1:]): | |
| 32 parser = optparse.OptionParser() | |
| 290 
03d62a2cbe62
update demnu to almost a real program
 Jeff Hammel <jhammel@mozilla.com> parents: 
289diff
changeset | 33 parser.add_option('-d', '--directory', dest='directory', | 
| 
03d62a2cbe62
update demnu to almost a real program
 Jeff Hammel <jhammel@mozilla.com> parents: 
289diff
changeset | 34 default=os.getcwd(), | 
| 
03d62a2cbe62
update demnu to almost a real program
 Jeff Hammel <jhammel@mozilla.com> parents: 
289diff
changeset | 35 help="call on this directory [Default: current directory]") | 
| 
03d62a2cbe62
update demnu to almost a real program
 Jeff Hammel <jhammel@mozilla.com> parents: 
289diff
changeset | 36 parser.add_option('-e', '--exec', dest='executable', | 
| 
03d62a2cbe62
update demnu to almost a real program
 Jeff Hammel <jhammel@mozilla.com> parents: 
289diff
changeset | 37 help="call this proram with the result") | 
| 
03d62a2cbe62
update demnu to almost a real program
 Jeff Hammel <jhammel@mozilla.com> parents: 
289diff
changeset | 38 options, args = parser.parse_args(args) | 
| 
03d62a2cbe62
update demnu to almost a real program
 Jeff Hammel <jhammel@mozilla.com> parents: 
289diff
changeset | 39 chosen = choose_file(options.directory) | 
| 
03d62a2cbe62
update demnu to almost a real program
 Jeff Hammel <jhammel@mozilla.com> parents: 
289diff
changeset | 40 if chosen: | 
| 
03d62a2cbe62
update demnu to almost a real program
 Jeff Hammel <jhammel@mozilla.com> parents: 
289diff
changeset | 41 if options.executable: | 
| 297 | 42 # TODO: extract this pattern (see ims journal.txt) | 
| 43 command = shlex.split(options.executable) | |
| 44 executable = command[0] | |
| 45 command.append(chosen) | |
| 46 os.execlp(executable, *command) | |
| 47 else: | |
| 48 print chosen | |
| 290 
03d62a2cbe62
update demnu to almost a real program
 Jeff Hammel <jhammel@mozilla.com> parents: 
289diff
changeset | 49 else: | 
| 
03d62a2cbe62
update demnu to almost a real program
 Jeff Hammel <jhammel@mozilla.com> parents: 
289diff
changeset | 50 sys.exit(1) | 
| 289 | 51 | 
| 52 if __name__ == '__main__': | |
| 53 main() | 
