Skip to content

Instantly share code, notes, and snippets.

@chemzqm
Last active December 7, 2015 06:33
Show Gist options
  • Save chemzqm/31e186e76edfca614f72 to your computer and use it in GitHub Desktop.
Save chemzqm/31e186e76edfca614f72 to your computer and use it in GitHub Desktop.
快速编辑 npm 模块, 支持 browser 属性
function doc
set folder (moduledir $argv[1])
if test $status != 0
return $status
end
if test -f $folder/Readme.md
open $folder/Readme.md
else if test -f $folder/readme.md
open $folder/readme.md
else if test -f $folder/README.md
open $folder/README.md
else
echo "$module not found" > /dev/stderr ^&1
return 1
end
end
function edit
if test -z $argv[1]
echo need module name
return 1
end
set module $argv[1]
set file (findmodule $module)
if test $status -ne 0
echo $module not found
return 1
end
open $file
end
function v
set folder (moduledir $argv[1])
if test $status != 0
return $status
end
set file $folder/package.json
json -f $file version
end
" vim 映射 通过命令函数入 (T/V/S)Edit name 就能快速打开我们想要的模块了
function! EditModule(name, ...)
if empty(a:name) | echo "need module name" | return | endif
let l:res = system("findmodule ".a:name)
if v:shell_error | echo l:res | return | endif
let l:mode = empty(a:000) ? 'edit' : a:000[0]
execute l:mode . " " . fnameescape(l:res)
endfunction
command! -nargs=1 Ed :call EditModule('<args>')
command! -nargs=1 Et :call EditModule('<args>', 'tabe')
command! -nargs=1 Ev :call EditModule('<args>', 'vsplit')
command! -nargs=1 Es :call EditModule('<args>', 'split')
#!/usr/bin/env node
// 根据模块名找到模块主文件并输出到stdin
var fs = require('fs')
var path = require('path')
var moduleName = process.argv[2]
var dir = process.cwd()
function exit(msg, code) {
console.error(msg)
process.exit(1)
}
function locate(folder, name) {
if(folder === '/') return ''
var f= path.join(folder, name)
if (fs.existsSync(f)) {
return f
} else {
return locate(path.resolve(folder, '..'), name)
}
}
var f = locate(dir, 'package.json')
if (!f) exit('package.json not found in ' + dir)
var o = require(f)
if (o.browser && o.browser[moduleName]) {
var str = o.browser[moduleName]
if (typeof str === 'string') {
moduleName = str
}
}
var folder = path.resolve(path.dirname(f), 'node_modules', moduleName)
if (!fs.existsSync(folder)) exit('module folder for ' + moduleName + ' not found')
try {
o = require(path.join(folder, 'package.json'))
} catch(e) {
exit('package.json not found under ' + folder)
}
o.main = o.main || 'index.js'
var fullpath = path.join(folder, o.main)
process.stdout.write(fullpath)
function moduledir
set module $argv[1]
if test -z $module
echo 'need module name' > /dev/stderr ^&1
return 1
end
set dir $PWD
while true
if test $dir = '/'
echo 'can\'t find package.json' > /dev/stderr ^&1
return 1
end
if test -f $dir/package.json
break
end
set dir (dirname $dir)
end
# parse package.json
set name (json -f $dir/package.json browser | json $module)
if test (count $name) -ne 0
set module $name
end
set folder $dir/node_modules/$module
if not test -d $folder
echo "$module not found" > /dev/stderr ^&1
return 1
end
echo -n $folder
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment