parent
22cf59cd0b
commit
ba70cca295
|
@ -0,0 +1,50 @@
|
||||||
|
import grp, os, pwd
|
||||||
|
from point2 import Point
|
||||||
|
|
||||||
|
def resolve_token(w):
|
||||||
|
c = w.logical_cursor()
|
||||||
|
p = Point(0, c.y)
|
||||||
|
return w.get_next_token_by_type(p, 'name')
|
||||||
|
def resolve_name(w):
|
||||||
|
t = resolve_token(w)
|
||||||
|
return t.string
|
||||||
|
def resolve_path(w):
|
||||||
|
name = resolve_name(w)
|
||||||
|
path = os.path.join(w.buffer.path, name)
|
||||||
|
return path
|
||||||
|
|
||||||
|
def find_name(w, s):
|
||||||
|
found = False
|
||||||
|
w.goto(Point(0, 0))
|
||||||
|
c = w.logical_cursor()
|
||||||
|
while not found and c.y < len(w.buffer.lines):
|
||||||
|
t = resolve_token(w)
|
||||||
|
if t.string == s:
|
||||||
|
found = True
|
||||||
|
break
|
||||||
|
w.goto(Point(c.x, c.y + 1))
|
||||||
|
c = w.logical_cursor()
|
||||||
|
if not found:
|
||||||
|
w.goto(Point(0, 0))
|
||||||
|
|
||||||
|
def valid_owner(owner):
|
||||||
|
if not owner:
|
||||||
|
return False
|
||||||
|
elif owner.isdigit():
|
||||||
|
return True
|
||||||
|
try:
|
||||||
|
pwd.getpwnam(owner)
|
||||||
|
return True
|
||||||
|
except:
|
||||||
|
return False
|
||||||
|
def valid_group(group):
|
||||||
|
if not group:
|
||||||
|
return False
|
||||||
|
elif group.isdigit():
|
||||||
|
return True
|
||||||
|
try:
|
||||||
|
grp.getgrnam(group)
|
||||||
|
return True
|
||||||
|
except:
|
||||||
|
return False
|
||||||
|
|
27
method.py
27
method.py
|
@ -1,5 +1,5 @@
|
||||||
import os, commands, popen2, re, sets
|
import os, commands, popen2, re, sets
|
||||||
import buffer2, default, regex, util, window2
|
import buffer2, default, dirutil, regex, util, window2
|
||||||
from point2 import Point
|
from point2 import Point
|
||||||
|
|
||||||
WHITESPACE = [' ', '\n']
|
WHITESPACE = [' ', '\n']
|
||||||
|
@ -1470,6 +1470,31 @@ class Grep(Pipe):
|
||||||
def _parse(self, w, **vargs):
|
def _parse(self, w, **vargs):
|
||||||
return ('grep', ('/usr/bin/grep', '-E', '-n', vargs['pattern']))
|
return ('grep', ('/usr/bin/grep', '-E', '-n', vargs['pattern']))
|
||||||
|
|
||||||
|
class Exec(Method):
|
||||||
|
args = [Argument('cmd', datatype="str", prompt="Exec: ")]
|
||||||
|
def _doit(self, w, path, cmd):
|
||||||
|
try:
|
||||||
|
cmd = cmd % path
|
||||||
|
except:
|
||||||
|
w.set_error("Malformed command: %r" % cmd)
|
||||||
|
return
|
||||||
|
(status, output) = commands.getstatusoutput(cmd)
|
||||||
|
bufname = '*%s*' % self.name.title()
|
||||||
|
w.application.data_buffer(bufname, output, switch_to=True)
|
||||||
|
w.set_error("Shell exited with %d" % status)
|
||||||
|
def _execute(self, w, **vargs):
|
||||||
|
if w.buffer.btype == 'dir':
|
||||||
|
name = dirutil.resolve_name(w)
|
||||||
|
path = dirutil.resolve_path(w)
|
||||||
|
self._doit(w, path, vargs['cmd'])
|
||||||
|
dirutil.find_name(w, name)
|
||||||
|
elif hasattr(w.buffer, 'path'):
|
||||||
|
path = w.buffer.path
|
||||||
|
self._doit(w, path, vargs['cmd'])
|
||||||
|
else:
|
||||||
|
w.set_error("Don't know how to exec: %r" % w.buffer)
|
||||||
|
return
|
||||||
|
|
||||||
class TokenComplete(Method):
|
class TokenComplete(Method):
|
||||||
'''Complete token names based on other tokens in the buffer'''
|
'''Complete token names based on other tokens in the buffer'''
|
||||||
name_overrides = {}
|
name_overrides = {}
|
||||||
|
|
4
mode2.py
4
mode2.py
|
@ -159,6 +159,10 @@ class Fundamental(Handler):
|
||||||
self.add_bindings('set-mode', ('C-x m',))
|
self.add_bindings('set-mode', ('C-x m',))
|
||||||
self.add_bindings('cancel', ('C-]',))
|
self.add_bindings('cancel', ('C-]',))
|
||||||
|
|
||||||
|
self.add_bindings('exec', ('C-c e',))
|
||||||
|
self.add_bindings('grep', ('C-c g',))
|
||||||
|
self.add_bindings('pipe', ('C-c p',))
|
||||||
|
|
||||||
# unbound actions
|
# unbound actions
|
||||||
self.add_action(method.GetToken())
|
self.add_action(method.GetToken())
|
||||||
|
|
||||||
|
|
69
mode_dir.py
69
mode_dir.py
|
@ -1,4 +1,4 @@
|
||||||
import commands, grp, method, mode2, os.path, pwd, re
|
import commands, dirutil, grp, method, mode2, os.path, pwd, re
|
||||||
from lex3 import Grammar, PatternRule, RegionRule, PatternGroupRule
|
from lex3 import Grammar, PatternRule, RegionRule, PatternGroupRule
|
||||||
from point2 import Point
|
from point2 import Point
|
||||||
from method import Method, Argument
|
from method import Method, Argument
|
||||||
|
@ -74,41 +74,15 @@ class Dir(mode2.Fundamental):
|
||||||
def name(self):
|
def name(self):
|
||||||
return "Dir"
|
return "Dir"
|
||||||
|
|
||||||
def _resolve_token(w):
|
|
||||||
c = w.logical_cursor()
|
|
||||||
p = Point(0, c.y)
|
|
||||||
return w.get_next_token_by_type(p, 'name')
|
|
||||||
def _resolve_name(w):
|
|
||||||
t = _resolve_token(w)
|
|
||||||
return t.string
|
|
||||||
def _resolve_path(w):
|
|
||||||
name = _resolve_name(w)
|
|
||||||
path = os.path.join(w.buffer.path, name)
|
|
||||||
return path
|
|
||||||
|
|
||||||
def _find_name(w, s):
|
|
||||||
found = False
|
|
||||||
w.goto(Point(0, 0))
|
|
||||||
c = w.logical_cursor()
|
|
||||||
while not found and c.y < len(w.buffer.lines):
|
|
||||||
t = _resolve_token(w)
|
|
||||||
if t.string == s:
|
|
||||||
found = True
|
|
||||||
break
|
|
||||||
w.goto(Point(c.x, c.y + 1))
|
|
||||||
c = w.logical_cursor()
|
|
||||||
if not found:
|
|
||||||
w.goto(Point(0, 0))
|
|
||||||
|
|
||||||
class RefreshView(Method):
|
class RefreshView(Method):
|
||||||
def _execute(self, w, **vargs):
|
def _execute(self, w, **vargs):
|
||||||
t = _resolve_token(w)
|
t = dirutil.resolve_token(w)
|
||||||
s = t.string
|
s = t.string
|
||||||
w.buffer.reload()
|
w.buffer.reload()
|
||||||
_find_name(w, s)
|
dirutil.find_name(w, s)
|
||||||
class OpenPath(Method):
|
class OpenPath(Method):
|
||||||
def _execute(self, w, **vargs):
|
def _execute(self, w, **vargs):
|
||||||
path = _resolve_path(w)
|
path = dirutil.resolve_path(w)
|
||||||
w.set_error("opening %r" % path)
|
w.set_error("opening %r" % path)
|
||||||
w.application.methods['open-file'].execute(w, filename=path)
|
w.application.methods['open-file'].execute(w, filename=path)
|
||||||
|
|
||||||
|
@ -116,14 +90,14 @@ class DirCmd(Method):
|
||||||
def _make_cmd(self, w, path, **vargs):
|
def _make_cmd(self, w, path, **vargs):
|
||||||
return ''
|
return ''
|
||||||
def _run(self, w, **vargs):
|
def _run(self, w, **vargs):
|
||||||
basename = _resolve_name(w)
|
basename = dirutil.resolve_name(w)
|
||||||
path = os.path.join(w.buffer.path, basename)
|
path = os.path.join(w.buffer.path, basename)
|
||||||
cmd = self._make_cmd(w, path, **vargs)
|
cmd = self._make_cmd(w, path, **vargs)
|
||||||
(status, output) = commands.getstatusoutput(cmd)
|
(status, output) = commands.getstatusoutput(cmd)
|
||||||
if status != 0:
|
if status != 0:
|
||||||
w.set_error("%s failed (exit %d)" % (self.name, status))
|
w.set_error("%s failed (exit %d)" % (self.name, status))
|
||||||
w.application.methods['refresh-view'].execute(w, filename=path)
|
w.application.methods['refresh-view'].execute(w, filename=path)
|
||||||
_find_name(w, basename)
|
dirutil.find_name(w, basename)
|
||||||
|
|
||||||
class Chmod(DirCmd):
|
class Chmod(DirCmd):
|
||||||
args = [Argument('mode', type=type(''), prompt="New Mode: ")]
|
args = [Argument('mode', type=type(''), prompt="New Mode: ")]
|
||||||
|
@ -140,27 +114,6 @@ class Chmod(DirCmd):
|
||||||
w.set_error("Not a valid mode: %r" % vargs['mode'])
|
w.set_error("Not a valid mode: %r" % vargs['mode'])
|
||||||
self._run(w, **vargs)
|
self._run(w, **vargs)
|
||||||
|
|
||||||
def _valid_owner(owner):
|
|
||||||
if not owner:
|
|
||||||
return False
|
|
||||||
elif owner.isdigit():
|
|
||||||
return True
|
|
||||||
try:
|
|
||||||
pwd.getpwnam(owner)
|
|
||||||
return True
|
|
||||||
except:
|
|
||||||
return False
|
|
||||||
def _valid_group(group):
|
|
||||||
if not group:
|
|
||||||
return False
|
|
||||||
elif group.isdigit():
|
|
||||||
return True
|
|
||||||
try:
|
|
||||||
grp.getgrnam(group)
|
|
||||||
return True
|
|
||||||
except:
|
|
||||||
return False
|
|
||||||
|
|
||||||
class Chown(DirCmd):
|
class Chown(DirCmd):
|
||||||
args = [Argument('owner', type=type(''), prompt="New Owner: ")]
|
args = [Argument('owner', type=type(''), prompt="New Owner: ")]
|
||||||
def _make_cmd(self, w, path, **vargs):
|
def _make_cmd(self, w, path, **vargs):
|
||||||
|
@ -174,10 +127,10 @@ class Chown(DirCmd):
|
||||||
else:
|
else:
|
||||||
w.set_error("Malformed 'owner' argument: %r" % vargs['owner'])
|
w.set_error("Malformed 'owner' argument: %r" % vargs['owner'])
|
||||||
return
|
return
|
||||||
if not _valid_owner(owner):
|
if not dirutil.valid_owner(owner):
|
||||||
w.set_error('User %r does not exist' % owner)
|
w.set_error('User %r does not exist' % owner)
|
||||||
return
|
return
|
||||||
if group is not None and not _valid_group(group):
|
if group is not None and not dirutil.valid_group(group):
|
||||||
w.set_error('Group %r does not exist' % group)
|
w.set_error('Group %r does not exist' % group)
|
||||||
return
|
return
|
||||||
self._run(w, **vargs)
|
self._run(w, **vargs)
|
||||||
|
@ -186,7 +139,7 @@ class Chgrp(DirCmd):
|
||||||
def _make_cmd(self, w, path, **vargs):
|
def _make_cmd(self, w, path, **vargs):
|
||||||
return 'chgrp %r %r' % (vargs['group'], path)
|
return 'chgrp %r %r' % (vargs['group'], path)
|
||||||
def _execute(self, w, **vargs):
|
def _execute(self, w, **vargs):
|
||||||
if not _valid_group(vargs['group']):
|
if not dirutil.valid_group(vargs['group']):
|
||||||
w.set_error('Group %r does not exist' % group)
|
w.set_error('Group %r does not exist' % group)
|
||||||
return
|
return
|
||||||
self._run(w, **vargs)
|
self._run(w, **vargs)
|
||||||
|
@ -198,13 +151,13 @@ class TouchPath(Method):
|
||||||
path = os.path.join(w.buffer.path, basename)
|
path = os.path.join(w.buffer.path, basename)
|
||||||
retval = os.system('touch %r' % path)
|
retval = os.system('touch %r' % path)
|
||||||
w.application.methods['refresh-view'].execute(w, filename=path)
|
w.application.methods['refresh-view'].execute(w, filename=path)
|
||||||
_find_name(w, basename)
|
dirutil.find_name(w, basename)
|
||||||
if retval != 0:
|
if retval != 0:
|
||||||
w.set_error("touch %r failed (exit %d)" % (path, retval))
|
w.set_error("touch %r failed (exit %d)" % (path, retval))
|
||||||
class RemovePath(Method):
|
class RemovePath(Method):
|
||||||
def _execute(self, w, **vargs):
|
def _execute(self, w, **vargs):
|
||||||
self._old_window = w
|
self._old_window = w
|
||||||
self._old_path = _resolve_path(w)
|
self._old_path = dirutil.resolve_path(w)
|
||||||
basename = os.path.basename(self._old_path)
|
basename = os.path.basename(self._old_path)
|
||||||
self._prompt = "Do you want to delete %r? " % basename
|
self._prompt = "Do you want to delete %r? " % basename
|
||||||
w.application.open_mini_buffer(self._prompt, self._callback)
|
w.application.open_mini_buffer(self._prompt, self._callback)
|
||||||
|
|
Loading…
Reference in New Issue